From 17d6f2a45d07932fb2ac354d4f8996c420eddc27 Mon Sep 17 00:00:00 2001 From: Amir Rajan Date: Sat, 7 Aug 2021 00:14:16 -0500 Subject: Docs synced. --- docs/docs.html | 8876 ++-- docs/docs.txt | 12653 +++-- docs/parse_log.txt | 93166 ++++++++++++++++++++--------------- docs/todo/03-solids-and-borders.md | 4 +- docs/todo/04-lines.md | 4 +- docs/todo/05-sprites.md | 4 +- docs/todo/08-controllers.md | 2 +- 7 files changed, 65703 insertions(+), 49006 deletions(-) diff --git a/docs/docs.html b/docs/docs.html index 39d0086..5ad5d6c 100644 --- a/docs/docs.html +++ b/docs/docs.html @@ -1,7 +1,8 @@ - + + DragonRuby Game Toolkit Documentation - +
@@ -10,16 +11,16 @@
  • DragonRuby Game Toolkit Live Docs
  • Hello World
  • Join the Discord and Subscribe to the News Letter
  • -
  • Watch Some Intro Videos
  • -
  • Getting Started Tutorial
  • -
  • Deploying To Itch.io
  • +
  • Intro Videos
  • +
  • Getting Started Tutorial
  • +
  • Deploying To Itch.io
  • Deploying To Mobile Devices
  • DragonRuby's Philosophy
  • -
  • Frequently Asked Questions, Comments, and Concerns
  • -
  • RECIPIES:
  • -
  • DOCS: GTK::Runtime
  • +
  • Frequently Asked Questions, Comments, and Concerns
  • +
  • RECIPIES:
  • +
  • DOCS: GTK::Runtime
  • SUMMARY: def tick args; end;
  • -
  • DOCS: GTK::Runtime#reset
  • +
  • DOCS: GTK::Runtime#reset
  • DOCS: GTK::Runtime#calcstringbox
  • DOCS: GTK::Runtime#write_file
  • DOCS: Array
  • @@ -29,28 +30,29 @@
  • DOCS: Array#reject_false
  • DOCS: Array#product
  • DOCS: Array#map_2d
  • -
  • DOCS: Array#include_any?
  • -
  • DOCS: Array#any_intersect_rect?
  • +
  • DOCS: Array#include_any?
  • +
  • DOCS: Array#any_intersect_rect?
  • DOCS: GTK::Args#audio
  • DOCS: GTK::Outputs
  • DOCS: GTK::Outputs#solids
  • DOCS: GTK::Outputs#borders
  • -
  • DOCS: GTK::Outputs#screenshots
  • +
  • DOCS: GTK::Outputs#sprites
  • +
  • DOCS: GTK::Outputs#screenshots
  • DOCS: GTK::Mouse
  • DOCS: GTK::MousePoint
  • DOCS: GTK::OpenEntity
  • DOCS: GTK::OpenEntity#as_hash
  • DOCS: Numeric#frame_index
  • DOCS: Numeric#elapsed_time
  • -
  • DOCS: Numeric#elapsed?
  • -
  • DOCS: Numeric#created?
  • +
  • DOCS: Numeric#elapsed?
  • +
  • DOCS: Numeric#created?
  • DOCS: Kernel
  • DOCS: Kernel::tick_count
  • DOCS: Kernel::global_tick_count
  • DOCS: Geometry
  • DOCS: GTK::Geometry#scale_rect
  • Source Code
  • -
    +

    DragonRuby Game Toolkit Live Docs

    @@ -61,9 +63,6 @@ To search docs you can type docs_search "SEARCH TERM" or if you wan

    docs_search { |entry| (entry.include? "Array") && (!entry.include? "Enumerable") }
     
    -

    - -

    Hello World

    Welcome to DragonRuby Game Toolkit. Take the steps below to get started. @@ -91,21 +90,26 @@ Reply with: I am a Dragon Rider.

    -

    Watch Some Intro Videos

    +

    Intro Videos

    -Each video is only 20 minutes and all of them will fit into a lunch break. So please watch them: +Here are some videos to help you get the lay of the land.

    +

    Quick Api Tour

    1. Beginner Introduction to DragonRuby Game Toolkit: https://youtu.be/ixw7TJhU08E
    2. +
    +

    If You Are Completely New to Ruby and Programming

    +
    1. Intermediate Introduction to Ruby Syntax: https://youtu.be/HG-XRZ5Ppgc
    2. Intermediate Introduction to Arrays in Ruby: https://youtu.be/N72sEYFRqfo
    3. +
    4. You may also want to try this free course provided at http://dragonruby.school.
    5. +
    +

    If You Have Game Dev Experience

    +
      +
    1. Building Tetris - Part 1: https://youtu.be/xZMwRSbC4rY
    2. +
    3. Building Tetris - Part 2: https://youtu.be/C3LLzDUDgz4
    4. +
    5. Low Res Game Jam Tutorial: https://youtu.be/pCI90ukKCME
    -

    -The second and third videos are not required if you are proficient with Ruby, but *definitely* watch the first one. -

    -

    -You may also want to try this free course provided at http://dragonruby.school. -

    Getting Started Tutorial

    This is a tutorial written by Ryan C Gordon (a Juggernaut in the industry who has contracted to Valve, Epic, Activision, and EA... check out his Wikipedia page: https://en.wikipedia.org/wiki/Ryan_C._Gordon). @@ -291,7 +295,7 @@ Note that you can also run DragonRuby without X11 at all: if you run it from a v

    There is a lot more you can do with DragonRuby, but now you've already got just about everything you need to make a simple game. After all, even the most fancy games are just creating objects and moving them around. Experiment a little. Add a few more things and have them interact in small ways. Want something to go away? Just don't add it to args.output anymore.

    -

    Deploying To Itch.io

    +

    Deploying To Itch.io

    Once you've built your game, you're all set to deploy! Good luck in your game dev journey and if you get stuck, come to the Discord channel!

    @@ -360,7 +364,7 @@ If you have a Pro subscription, you also have the capability to deploy to mobile To deploy to iOS, you need to have a Mac running MacOS Catalina, an iOS device, and an active/paid Developer Account with Apple. From the Console type: $wizards.ios.start and you will be guided through the deployment process.

    -To deploy to Android, you need to have an Android emulator/device, and a environment that is able to run Android SDK. dragonruby-publish will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like: +To deploy to Android, you need to have an Android emulator/device, and an environment that is able to run Android SDK. dragonruby-publish will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:

    > adb logcat -e mygame # you'll want to run this in a separate terminal
     > keytool -genkey -v -keystore mygame.keystore -alias mygame -keyalg RSA -keysize 2048 -validity 10000
    @@ -369,7 +373,7 @@ To deploy to Android, you need to have an Android emulator/device, and a environ
     

    DragonRuby's Philosophy

    -The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principals. +The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principles.

    Challenge The Status Quo

    @@ -388,7 +392,7 @@ It's a hard pill to swallow, but forget blindly accepted best practices and try There is a programming idiom in software called "The Pit of Success". The term normalizes upfront pain as a necessity/requirement in the hopes that the investment will yield dividends "when you become successful" or "when the code becomes more complicated". This approach to development is strongly discouraged by us. It leads to over-architected and unnecessary code; creates barriers to rapid prototyping and shipping a game; and overwhelms beginners who are new to the engine or programming in general.

    -DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and string entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create). +DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs that take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and strict entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).

    Release Early and Often

    @@ -432,12 +436,12 @@ We are bombarded by marketing speak day in and day out. We don't do that here. T

    We want DragonRuby to *actually* help you build the game you want to build (as opposed to sell you something piece of demoware that doesn't work).

    -

    Frequently Asked Questions, Comments, and Concerns

    +

    Frequently Asked Questions, Comments, and Concerns

    Here are questions, comments, and concerns that frequently come up.

    Frequently Asked Questions

    -

    What is DragonRuby LLP?

    +

    What is DragonRuby LLP?

    DragonRuby LLP is a partnership of four devs who came together with the goal of bringing the aesthetics and joy of Ruby, everywhere possible.

    @@ -462,7 +466,7 @@ NOTE: We leave the "A DragonRuby LLP Product" off of this one because that just

    NOTE: Devs who use DragonRuby are "Dragon Riders/Riders of Dragons". That's a bad ass identifier huh?

    -

    What is DragonRuby?

    +

    What is DragonRuby?

    The response to this question requires a few subparts. First we need to clarify some terms. Specifically _language specification_ vs _runtime_.

    @@ -482,7 +486,7 @@ DragonRuby's goal is to be compliant with the ISO/IEC 30170:2012 standard. It's The elevator pitch is:

    -DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Scadia. +DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Stadia.

    What does Multilevel Cross-platform mean?

    @@ -513,7 +517,7 @@ These levels allow us to stay up to date with open source implementations of Rub

    DragonRuby is a Ruby runtime implementation that takes all the lessons we've learned from MRI/CRuby, and merges it with the latest and greatest compiler and OSS technologies.

    -

    How is DragonRuby different than MRI?

    +

    How is DragonRuby different than MRI?

    DragonRuby supports a subset of MRI apis. Our target is to support all of mRuby's standard lib. There are challenges to this given the number of platforms we are trying to support (specifically console).

    @@ -535,7 +539,7 @@ end

    4. To ignore code in repl.rb, instead of commenting it out, prefix repl with the letter x and it'll be ignored. @@ -568,18 +572,18 @@ You can use DragonRuby's replay capabilities to troubleshoot:

    1. DragonRuby is hot loaded which gives you a very fast feedback loop (if the game throws an exception, it's because of the code you just added).
    2. -
    3. Use ./dragonruby mygame --record to create a game play recording that you can use to find the exception (you can replay a recoding by executing ./dragonruby mygame --replay last_replay.txt or through the DragonRuby Console using $gtk.recording.start_replay "last_replay.txt".
    4. +
    5. Use ./dragonruby mygame --record to create a game play recording that you can use to find the exception (you can replay a recording by executing ./dragonruby mygame --replay last_replay.txt or through the DragonRuby Console using $gtk.recording.start_replay "last_replay.txt".
    6. DragonRuby also ships with a unit testing facility. You can invoke the following command to run a test: ./dragonruby . --eval some_ruby_file.rb --no-tick.
    7. Get into the habit of adding debugging facilities within the game itself. You can add drawing primitives to args.outputs.debug that will render on top of your game but will be ignored in a production release.
    8. Debugging something that runs at 60fps is (imo) not that helpful. The exception you are seeing could have been because of a change that occurred many frames ago.

    Frequent Comments About Ruby as a Language Choice

    -

    But Ruby is dead.

    +

    But Ruby is dead.

    Let's check the official source for the answer to this question: isrubydead.com: https://isrubydead.com/.

    -On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Every one chases the new and shiny. +On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Everyone chases the new and shiny.

    What really matters is _quality/maturity_. Here is the latest (StackOverflow Survey sorted by highest paid developers)[https://insights.stackoverflow.com/survey/2019#top-paying-technologies]. @@ -587,11 +591,11 @@ What really matters is _quality/maturity_. Here is the latest (StackOverflow Sur

    Let's stop making this comment shall we?

    -

    But Ruby is slow.

    +

    But Ruby is slow.

    That doesn't make any sense. A language specification can't be slow... it's a language spec. Sure, an _implementation/runtime_ can be slow though, but then we'd have to talk about which runtime.

    -

    Dynamic languages are slow.

    +

    Dynamic languages are slow.

    They are certainly slower than statically compiled languages. With the processing power and compiler optimizations we have today, dynamic languages like Ruby are _fast enough_.

    @@ -602,7 +606,7 @@ Unless you are writing in some form of intermediate representation by hand, your NOTE: If you _are_ hand writing LLVM IR, we are always open to bringing on new partners with such a skill set. Email us ^_^.

    Frequent Concerns

    -

    DragonRuby is not open source. That's not right.

    +

    DragonRuby is not open source. That's not right.

    The current state of open source is unsustainable. Contributors work for free, most all open source repositories are severely under-staffed, and burnout from core members is rampant.

    @@ -618,7 +622,7 @@ If the reason above isn't sufficient, then definitely use something else.

    All this being said, we do have parts of the engine open sourced on GitHub: https://github.com/dragonruby/dragonruby-game-toolkit-contrib/

    -

    DragonRuby is for pay. You should offer a free version.

    +

    DragonRuby is for pay. You should offer a free version.

    If you can afford to pay for DragonRuby, you should (and will). We don't go around telling writers that they should give us their books for free, and only require payment if we read the entire thing. It's time we stop asking that of software products.

    @@ -640,21 +644,21 @@ You qualify for a free, unrestricted license to DragonRuby products if any of th

    Just contact Amir at amir.rajan@dragonruby.org with a short explanation of your current situation and he'll set you up. No questions asked.

    -

    But still, you should offer a free version. So I can try it out and see if I like it.

    +

    But still, you should offer a free version. So I can try it out and see if I like it.

    -You can try our [web-based sandbox environment](). But it won't do the runtime justice. Or just come to our [Slack]() or [Discord]() channel and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing. +You can try our web-based sandbox environment at http://fiddle.dragonruby.org. But it won't do the runtime justice. Or just come to our Discord Channel at http://discord.dragonruby.org and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.

    Seriously just buy it. Get a refund if you don't like it. We make it stupid easy to do so.

    -

    I still think you should do a free version. Think of all people who would give it a shot.

    +

    I still think you should do a free version. Think of all people who would give it a shot.

    Free isn't a sustainable financial model. We don't want to spam your email. We don't want to collect usage data off of you either. We just want to provide quality toolchains to quality developers (as opposed to a large quantity of developers).

    The people that pay for DragonRuby and make an effort to understand it are the ones we want to build a community around, partner with, and collaborate with. So having that small monetary wall deters entitled individuals that don't value the same things we do.

    -

    What if I build something with DragonRuby, but DragonRuby LLP becomes insolvent.

    +

    What if I build something with DragonRuby, but DragonRuby LLP becomes insolvent.

    That won't happen if the development world stop asking for free stuff and non-trivially compensate open source developers. Look, we want to be able to work on the stuff we love, every day of our lives. And we'll go to great lengths to make that happen.

    @@ -743,11 +747,15 @@ You can represent a sprite as a Hash: flip_vertically: false, flip_horizontally: false, angle_anchor_x: 0.5, - angle_anchor_y: 1.0 + angle_anchor_y: 1.0, + blendmode_enum: 1 } end

    +The blendmode_enum value can be set to 0 (no blending), 1 (alpha blending), 2 (additive blending), 3 (modulo blending), 4 (multiply blending). +

    +

    You can represent a sprite as an object:

    # Create type with ALL sprite properties AND primitive_marker
    @@ -756,7 +764,7 @@ class Sprite
                     :source_x, :source_y, :source_w, :source_h,
                     :tile_x, :tile_y, :tile_w, :tile_h,
                     :flip_horizontally, :flip_vertically,
    -                :angle_anchor_x, :angle_anchor_y
    +                :angle_anchor_x, :angle_anchor_y, :blendmode_enum
     
       def primitive_marker
         :sprite
    @@ -832,16 +840,17 @@ You can add additional metadata about your game within a label, which requires y
     

    def tick args
       args.outputs.labels << {
    -    x:              200,
    -    y:              550,
    -    text:           "dragonruby",
    -    size_enum:      2,
    -    alignment_enum: 1,
    -    r:              155,
    -    g:              50,
    -    b:              50,
    -    a:              255,
    -    font:           "fonts/manaspc.ttf",
    +    x:                       200,
    +    y:                       550,
    +    text:                    "dragonruby",
    +    size_enum:               2,
    +    alignment_enum:          1,
    +    r:                       155,
    +    g:                       50,
    +    b:                       50,
    +    a:                       255,
    +    font:                    "fonts/manaspc.ttf",
    +    vertical_alignment_enum: 0, # 0 is bottom, 1 is middle, 2 is top
         # You can add any properties you like (this will be ignored/won't cause errors)
         game_data_one:  "Something",
         game_data_two: {
    @@ -871,6 +880,19 @@ You can get the render size of any string using args.gtk.calcstringbox
    +

    Rendering Labels With New Line Characters And Wrapping

    +

    +You can use a strategy like the following to create multiple labels from a String. +

    +
    def tick args
    +  long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elitteger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim."
    +  max_character_length = 30
    +  long_strings_split = args.string.wrapped_lines long_string, max_character_length
    +  args.outputs.labels << long_strings_split.map_with_index do |s, i|
    +    { x: 10, y: 600 - (i * 20), text: s }
    +  end
    +end
    +

    How To Play A Sound

    Sounds that end .wav will play once: @@ -902,7 +924,7 @@ If you want to play a .ogg once as if it were a sound effect, you c end end

    -

    Using args.state To Store Your Game State

    +

    Using args.state To Store Your Game State

    args.state is a open data structure that allows you to define properties that are arbitrarily nested. You don't need to define any kind of class.

    @@ -975,7 +997,7 @@ All the properties below hang off of args and can be accessed in th args.PROPERTY end
    -

    args.state

    +

    args.state

    Store your game state inside of this state. Properties with arbitrary nesting is allowed and a backing Entity will be created on your behalf.

    @@ -984,35 +1006,35 @@ Store your game state inside of this state. Properties with arbitra args.state.player.y ||= 0 end
    -

    .*.entity_id

    +

    .*.entity_id

    Entities automatically receive an entity_id of type Fixnum.

    -

    .*.entity_type

    +

    .*.entity_type

    Entities can have an entity_type which is represented as a Symbol.

    -

    .*.created_at

    +

    .*.created_at

    Entities have created_at set to args.state.tick_count when they are created.

    -

    .*.created_at_elapsed

    +

    .*.created_at_elapsed

    Returns the elapsed number of ticks since creation.

    -

    .*.global_created_at

    +

    .*.global_created_at

    Entities have global_created_at set to Kernel.global_tick_count when they are created.

    -

    .*.global_created_at_elapsed

    +

    .*.global_created_at_elapsed

    Returns the elapsed number of global ticks since creation.

    -

    .*.as_hash

    +

    .*.as_hash

    Entity cast to a Hash so you can update values as if you were updating a Hash.

    -

    .new_entity

    +

    .new_entity

    Creates a new Entity with a type, and initial properties. An option block can be passed to change the newly created entity:

    @@ -1023,47 +1045,47 @@ Creates a new Entity with a type, and initial properties. An option end end -

    .new_entity_strict

    +

    .new_entity_strict

    Creates a new Strict Entity. While Entities created via args.state.new_entity can have new properties added later on, Entities created using args.state.new_entity must define all properties that are allowed during its initialization. Attempting to add new properties after initialization will result in an exception.

    -

    .tick_count

    +

    .tick_count

    Returns the current tick of the game. args.state.tick_count is 0 when the game is first started or if the game is reset via $gtk.reset.

    -

    args.inputs

    +

    args.inputs

    Access using input using args.inputs.

    -

    .up

    +

    .up

    Returns true if: the up arrow or w key is pressed or held on the keyboard; or if up is pressed or held on controller_one; or if the left_analog on controller_one is tilted upwards.

    -

    .down

    +

    .down

    Returns true if: the down arrow or s key is pressed or held on the keyboard; or if down is pressed or held on controller_one; or if the left_analog on controller_one is tilted downwards.

    -

    .left

    +

    .left

    Returns true if: the left arrow or a key is pressed or held on the keyboard; or if left is pressed or held on controller_one; or if the left_analog on controller_one is tilted to the left.

    -

    .right

    +

    .right

    Returns true if: the right arrow or d key is pressed or held on the keyboard; or if right is pressed or held on controller_one; or if the left_analog on controller_one is tilted to the right.

    -

    .left_right

    +

    .left_right

    Returns -1 (left), 0 (neutral), or +1 (right) depending on results of args.inputs.left and args.inputs.right.

    -

    .up_down

    +

    .up_down

    -Returns -1 (down), 0 (neutral), or +1 (right) depending on results of args.inputs.up and args.inputs.down. +Returns -1 (down), 0 (neutral), or +1 (up) depending on results of args.inputs.down and args.inputs.up.

    -

    .text OR .history

    +

    .text OR .history

    Returns a string that represents the last key that was pressed on the keyboard.

    -

    .mouse

    +

    .mouse

    Represents the user's

    @@ -1105,37 +1127,49 @@ Returns a bitmask for all buttons on the mouse: 1 for a button in t

    mouse.wheel

    -Represents the mouse wheel. Returns nil if no mouse wheel actions occurred. ***** .x Returns the negative or positive number if the mouse wheel has changed in the x axis. ***** .y Returns the negative or positive number if the mouse wheel has changed in the y axis. +Represents the mouse wheel. Returns nil if no mouse wheel actions occurred. +

    +

    +***** .x +

    +

    +Returns the negative or positive number if the mouse wheel has changed in the x axis. +

    +

    +***** .y +

    +

    +Returns the negative or positive number if the mouse wheel has changed in the y axis.

    .click OR .down, .previous_click, .up

    The properties args.inputs.mouse.(click|down|previous_click|up) each return nil if the mouse button event didn't occur. And return an Entity that has an x, y properties along with helper functions to determine collision: inside_rect?, inside_circle.

    -

    .controller_one, .controller_two

    +

    .controller_one, .controller_two

    Represents controllers connected to the usb ports.

    -

    ~.up

    +

    .up

    Returns true if up is pressed or held on the directional or left analog.

    -

    ~.down

    +

    .down

    Returns true if down is pressed or held on the directional or left analog.

    -

    ~.left

    +

    .left

    Returns true if left is pressed or held on the directional or left analog.

    -

    ~.right

    +

    .right

    Returns true if right is pressed or held on the directional or left analog.

    -

    ~.left_right

    +

    .left_right

    Returns -1 (left), 0 (neutral), or +1 (right) depending on results of args.inputs.controller_(one|two).left and args.inputs.controller_(one|two).right.

    -

    ~.up_down

    +

    .up_down

    Returns -1 (down), 0 (neutral), or +1 (up) depending on results of args.inputs.controller_(one|two).up and args.inputs.controller_(one|two).down.

    @@ -1155,19 +1189,19 @@ Returns a number between -1 and 1 which represents the

    Returns a number between -1 and 1 which represents the percentage the analog is moved vertically as a ratio of the maximum vertical movement.

    -

    .directional_up)

    +

    .directional_up

    Returns true if up is pressed or held on the directional.

    -

    .directional_down)

    +

    .directional_down

    Returns true if down is pressed or held on the directional.

    -

    .directional_left)

    +

    .directional_left

    Returns true if left is pressed or held on the directional.

    -

    .directional_right)

    +

    .directional_right

    Returns true if right is pressed or held on the directional.

    @@ -1191,7 +1225,7 @@ Returns true if the specific button is being held. args.input

    Returns true if the specific button was released. args.inputs.controller_(one|two).key_up.BUTTON will be true only on the frame the button was released.

    -

    .keyboard

    +

    .keyboard

    Represents the user's keyboard

    @@ -1333,139 +1367,148 @@ Returns a Hash with all keys on the keyboard in their respective st
  • :down_or_held
  • :up
  • -

    args.outputs

    +

    args.outputs

    args.outputs.PROPERTY is how you render to the screen.

    -

    .background_color

    +

    .background_color

    Set args.outputs.background_color to an Array with RGB values (eg. [255, 255, 255] for the color white).

    -

    .sounds

    +

    .sounds

    Send a file path to this collection to play a sound. The sound file must be under the mygame directory. Example: args.outputs.sounds << "sounds/jump.wav".

    -

    .solids

    +

    .solids

    Send a Primitive to this collection to render a filled in rectangle to the screen. This collection is cleared at the end of every frame.

    -

    .static_solids

    +

    .static_solids

    Send a Primitive to this collection to render a filled in rectangle to the screen. This collection is not cleared at the end of every frame. And objects can be mutated by reference.

    -

    .sprites, .static_sprites

    +

    .sprites, .static_sprites

    Send a Primitive to this collection to render a sprite to the screen.

    -

    .primitives, .static_primitives

    +

    .primitives, .static_primitives

    Send a Primitive of any type and it'll be rendered. The Primitive must have a primitive_marker that returns :solid, :sprite, :label, :line, :border.

    -

    .labels, .static_labels

    +

    .labels, .static_labels

    Send a Primitive to this collection to render text to the screen.

    -

    .lines, .static_lines

    +

    .lines, .static_lines

    Send a Primitive to this collection to render a line to the screen.

    -

    .borders, .static_borders

    +

    .borders, .static_borders

    Send a Primitive to this collection to render an unfilled rectangle to the screen.

    -

    .debug, .static_debug

    +

    .debug, .static_debug

    Send any Primitive to this collection which represents things you render to the screen for debugging purposes. Primitives in this collection will not be rendered in a production release of your game.

    -

    args.geometry

    +

    args.geometry

    This property contains geometric functions. Functions can be invoked via args.geometry.FUNCTION.

    -

    .inside_rect? rect_1, rect_2

    +

    +Here are some general notes with regards to the arguments these geometric functions accept. +

    +
      +
    1. Rectangles can be represented as an Array with four (or more) values [x, y, w, h], as a Hash { x:, y:, w:, h: } or an object that responds to x, y, w, and h.
    2. +
    3. Points can be represent as an Array with two (or more) values [x, y], as a Hash { x:, y:} or an object that responds to x, and y.
    4. +
    5. Lines can be represented as an Array with four (or more) values [x, y, x2, y2], as a Hash { x:, y:, x2:, y2: } or an object that responds to x, y, x2, and y2.
    6. +
    7. Angles are represented as degrees (not radians).
    8. +
    +

    .inside_rect? rect_1, rect_2

    Returns true if rect_1 is inside rect_2.

    -

    .intersect_rect? rect_2, rect_2

    +

    .intersect_rect? rect_2, rect_2

    Returns true if rect_1 intersects rect_2.

    -

    .scale_rect rect, x_percentage, y_percentage

    +

    .scale_rect rect, x_percentage, y_percentage

    Returns a new rectangle that is scaled by the percentages provided.

    -

    .angle_to start_point, end_point

    +

    .angle_to start_point, end_point

    Returns the angle in degrees between two points start_point to end_point.

    -

    .angle_from start_point, end_point

    +

    .angle_from start_point, end_point

    Returns the angle in degrees between two points start_point from end_point.

    -

    .point_inside_circle? point, circle_center_point, radius

    +

    .point_inside_circle? point, circle_center_point, radius

    Returns true if a point is inside a circle defined by its center and radius.

    -

    .center_inside_rect rect, other_rect

    +

    .center_inside_rect rect, other_rect

    Returns a new rectangle based of off rect that is centered inside of other_rect.

    -

    .center_inside_rect_x rect, other_rect

    +

    .center_inside_rect_x rect, other_rect

    Returns a new rectangle based of off rect that is centered horizontally inside of other_rect.

    -

    .center_inside_rect_y rect, other_rect

    +

    .center_inside_rect_y rect, other_rect

    Returns a new rectangle based of off rect that is centered vertically inside of other_rect.

    -

    .anchor_rect rect, anchor_x, anchor_y

    +

    .anchor_rect rect, anchor_x, anchor_y

    Returns a new rectangle based of off rect that has been repositioned based on the percentages passed into anchor_x, and anchor_y.

    -

    .shift_line line, x, y

    +

    .shift_line line, x, y

    Returns a line that is offset by x, and y.

    -

    .line_y_intercept line

    +

    .line_y_intercept line

    Given a line, the b value is determined for the point slope form equation: y = mx + b.

    -

    .angle_between_lines line_one, line_two, replace_infinity:

    +

    .angle_between_lines line_one, line_two, replace_infinity:

    Returns the angle between two lines as if they were infinitely long. A numeric value can be passed in for the last parameter which would represent lines that do not intersect.

    -

    .line_slope line, replace_infinity:

    +

    .line_slope line, replace_infinity:

    Given a line, the m value is determined for the point slope form equation: y = mx + b.

    -

    .line_rise_run

    +

    .line_rise_run

    Given a line, a Hash is returned that returns the slope as x and y properties with normalized values (the number is between -1 and 1).

    -

    .ray_test point, line

    +

    .ray_test point, line

    Given a point and a line, :on, :left, or :right which represents the location of the point relative to the line.

    -

    .line_rect line

    +

    .line_rect line

    Returns the bounding rectangle for a line.

    -

    .line_intersect line_one, line_two

    +

    .line_intersect line_one, line_two

    Returns a point that represents the intersection of the lines.

    -

    .distance point_one, point_two

    +

    .distance point_one, point_two

    Returns the distance between two points.

    -

    .cubic_bezier t, a, b, c, d

    +

    .cubic_bezier t, a, b, c, d

    Returns the cubic bezier function for tick_count t with anchors a, b, c, and d.

    -

    args.easing

    +

    args.easing

    A set of functions that allow you to determine the current progression of an easing function.

    -

    .ease start_tick, current_tick, duration, easing_functions

    +

    .ease start_tick, current_tick, duration, easing_functions

    Given a start, current, duration, and easing function names, ease returns a number between 0 and 1 that represents the progress of an easing function.

    @@ -1485,7 +1528,7 @@ This example will move a box at a linear speed from 0 to 1280. args.outputs.solids << { x: 1280 * current_progress, y: 360, w: 10, h: 10 } end
    -

    .ease_spline start_tick, current_tick, duration, spline

    +

    .ease_spline start_tick, current_tick, duration, spline

    Given a start, current, duration, and a multiple bezier values, this function returns a number between 0 and 1 that represents the progress of an easing function.

    @@ -1506,11 +1549,11 @@ This example will move a box at a linear speed from 0 to 1280 and then back to 0 args.outputs.solids << { x: 1280 * current_progress, y: 360, w: 10, h: 10 } end -

    args.string

    +

    args.string

    Useful string functions not included in Ruby core libraries.

    -

    .wrapped_lines string, max_character_length

    +

    .wrapped_lines string, max_character_length

    This function will return a collection of strings given an input string and max_character_length. The collection of strings returned will split the input string into strings of length <= max_character_length.

    @@ -1527,175 +1570,175 @@ teger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim." end end -

    args.grid

    +

    args.grid

    Returns the virtual grid for the game.

    -

    .name

    +

    .name

    Returns either :origin_bottom_left or :origin_center.

    -

    .bottom

    +

    .bottom

    Returns the y value that represents the bottom of the grid.

    -

    .top

    +

    .top

    Returns the y value that represents the top of the grid.

    -

    .left

    +

    .left

    Returns the x value that represents the left of the grid.

    -

    .right

    +

    .right

    Returns the x value that represents the right of the grid.

    -

    .rect

    +

    .rect

    Returns a rectangle Primitive that represents the grid.

    -

    .origin_bottom_left!

    +

    .origin_bottom_left!

    Change the grids coordinate system to 0, 0 at the bottom left corner.

    -

    .origin_center!

    +

    .origin_center!

    Change the grids coordinate system to 0, 0 at the center of the screen.

    -

    .w

    +

    .w

    Returns the grid's width (always 1280).

    -

    .h

    +

    .h

    Returns the grid's height (always 720).

    -

    args.gtk

    +

    args.gtk

    This represents the DragonRuby Game Toolkit's Runtime Environment and can be accessed via args.gtk.METHOD.

    -

    .argv

    +

    .argv

    Returns a String that represents the parameters passed into the ./dragonruby binary.

    -

    .platform

    +

    .platform

    Returns a String representing the operating system the game is running on.

    -

    .request_quit

    +

    .request_quit

    Request that the runtime quit the game.

    -

    .write_file path, contents

    +

    .write_file path, contents

    Writes/overwrites a file within the game directory + path.

    -

    .write_file_root

    +

    .write_file_root

    Writes/overwrites a file within the root dragonruby binary directory + path.

    -

    .append_file path, contents

    +

    .append_file path, contents

    Append content to a file located at the game directory + path.

    -

    .append_file_root path, contents

    +

    .append_file_root path, contents

    Append content to a file located at the root dragonruby binary directory + path.

    -

    .read_file path

    +

    .read_file path

    Reads a file from the sandboxed file system.

    -

    .parse_xml string, parse_xml_file path

    +

    .parse_xml string, parse_xml_file path

    Returns a Hash for a String that represents XML.

    -

    .parse_json string, parse_json_file path

    +

    .parse_json string, parse_json_file path

    Returns a Hash for a String that represents JSON.

    -

    .http_get url, extra_headers = {}

    +

    .http_get url, extra_headers = {}

    Creates an async task to perform an HTTP GET.

    -

    .http_post url, form_fields = {}, extra_headers = {}

    +

    .http_post url, form_fields = {}, extra_headers = {}

    Creates an async task to perform an HTTP POST.

    -

    .reset

    +

    .reset

    Resets the game by deleting all data in args.state and setting args.state.tick_count back to 0.

    -

    .stop_music

    +

    .stop_music

    Stops all background music.

    -

    .calcstringbox str, size_enum, font

    +

    .calcstringbox str, size_enum, font

    Returns a tuple with width and height of a string being rendered.

    -

    .slowmo! factor

    +

    .slowmo! factor

    Slows the game down by the factor provided.

    -

    .notify! string

    +

    .notify! string

    Renders a toast message at the bottom of the screen.

    -

    .system

    +

    .system

    Invokes a shell command and prints the result to the console.

    -

    .exec

    +

    .exec

    Invokes a shell command and returns a String that represents the result.

    -

    .save_state

    +

    .save_state

    Saves the game state to game_state.txt.

    -

    .load_state

    +

    .load_state

    Load args.state from game_state.txt.

    -

    .serialize_state file, state

    +

    .serialize_state file, state

    Saves entity state to a file. If only one parameter is provided a string is returned for state instead of writing to a file.

    -

    .deserialize_state file

    +

    .deserialize_state file

    Returns entity state from a file or serialization data represented as a String.

    -

    .reset_sprite path

    +

    .reset_sprite path

    Invalids the texture cache of a sprite.

    -

    .show_cursor

    +

    .show_cursor

    Shows the mouse cursor.

    -

    .hide_cursor

    +

    .hide_cursor

    Hides the mouse cursor.

    -

    .cursor_shown?

    +

    .cursor_shown?

    Returns true if the mouse cursor is shown.

    -

    .set_window_fullscreen enabled

    +

    .set_window_fullscreen enabled

    Sets the game to either fullscreen (enabled=true) or windowed (enabled=false).

    -

    .openurl url

    +

    .openurl url

    Opens a url using the Operating System's default browser.

    -

    .get_base_dir

    +

    .get_base_dir

    Returns the full path of the DragonRuby binary directory.

    -

    .get_game_dir

    +

    .get_game_dir

    Returns the full path of the game directory in its sandboxed environment.

    @@ -1869,11 +1912,11 @@ Assuming the array is an array of arrays, Given a block, each 2D array index inv puts occupied_tiles end -

    DOCS: Array#include_any?

    +

    DOCS: Array#include_any?

    Given a collection of items, the function will return true if any of self's items exists in the collection of items passed in:

    -

    DOCS: Array#any_intersect_rect?

    +

    DOCS: Array#any_intersect_rect?

    Assuming the array contains objects that respond to left, right, top, bottom, this method returns true if any of the elements within the array intersect the object being passed in. You are given an optional parameter called tolerance which informs how close to the other rectangles the elements need to be for it to be considered intersecting.

    @@ -2018,7 +2061,7 @@ end

    Rendering a solid using an Array with colors and alpha

    -The value for the color and alpha is an number between 0 and 255. The alpha property is optional and will be set to 255 if not specified. +The value for the color and alpha is a number between 0 and 255. The alpha property is optional and will be set to 255 if not specified.

    Creates a green solid rectangle with an opacity of 50%. @@ -2047,7 +2090,7 @@ end

    Rendering a solid using a Class

    -You can also create a class with solid/border properties and render it as a primitive. ALL properties must on the class. *Additionally*, a method called primitive_marker must be defined on the class. +You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called primitive_marker must be defined on the class.

    Here is an example: @@ -2100,6 +2143,93 @@ You have to use args.outputs.borders: args.outputs.borders << [100, 100, 160, 90] end +

    DOCS: GTK::Outputs#sprites

    +

    +Add primitives to this collection to render a sprite to the screen. +

    +

    Rendering a sprite using an Array

    +

    +Creates a sprite of a white circle located at 100, 100. 160 pixels wide and 90 pixels tall. +

    +
    def tick args
    +  #                         X    Y   WIDTH   HEIGHT                      PATH
    +  args.outputs.sprites << [100, 100,   160,     90, "sprites/circle/white.png]
    +end
    +
    +

    Rendering a sprite using an Array with colors and alpha

    +

    +The value for the color and alpha is a number between 0 and 255. The alpha property is optional and will be set to 255 if not specified. +

    +

    +Creates a green circle sprite with an opacity of 50%. +

    +
    def tick args
    +  #                         X    Y  WIDTH  HEIGHT           PATH                ANGLE  ALPHA  RED  GREEN  BLUE
    +  args.outputs.sprites << [100, 100,  160,     90, "sprites/circle/white.png",     0,    128,   0,   255,    0]
    +end
    +
    +

    Rendering a sprite using a Hash

    +

    +If you want a more readable invocation. You can use the following hash to create a sprite. Any parameters that are not specified will be given a default value. The keys of the hash can be provided in any order. +

    +
    def tick args
    +  args.outputs.sprites << {
    +    x:                             0,
    +    y:                             0,
    +    w:                           100,
    +    h:                           100,
    +    path: "sprites/circle/white.png",
    +    angle:                         0,
    +    a:                           255,
    +    r:                             0,
    +    g:                           255,
    +    b:                             0
    +  }
    +end
    +
    +

    Rendering a solid using a Class

    +

    +You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called primitive_marker must be defined on the class. +

    +

    +Here is an example: +

    +
    # Create type with ALL sprite properties AND primitive_marker
    +class Sprite
    +  attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y,  :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b
    +
    +  def primitive_marker
    +    :sprite
    +  end
    +end
    +
    +# Inherit from type
    +class Circle < Sprite
    +# constructor
    +  def initialize x, y, size, path
    +    self.x = x
    +    self.y = y
    +    self.w = size
    +    self.h = size
    +    self.path = path
    +  end
    +  def serlialize
    +    {x:self.x, y:self.y, w:self.w, h:self.h, path:self.path}
    +  end
    +
    +  def inspect
    +    serlialize.to_s
    +  end
    +
    +  def to_s
    +    serlialize.to_s
    +  end
    +end
    +def tick args
    +  # render circle sprite
    +  args.outputs.sprites  << Circle.new(10, 10, 32,"sprites/circle/white.png")
    +end
    +

    DOCS: GTK::Outputs#screenshots

    Add a hash to this collection to take a screenshot and save as png file. The keys of the hash can be provided in any order. @@ -2160,12 +2290,12 @@ The GTK::MousePoint has the following properties.

  • x: Integer representing the mouse's x.
  • y: Integer representing the mouse's y.
  • point: Array with the x and y values.
  • -
  • w: Width of the point that always returns 0 (included so that it can seemlessly work with GTK::Geometry functions).
  • -
  • h: Height of the point that always returns 0 (included so that it can seemlessly work with GTK::Geometry functions).
  • -
  • left: This value is the same as x (included so that it can seemlessly work with GTK::Geometry functions).
  • -
  • right: This value is the same as x (included so that it can seemlessly work with GTK::Geometry functions).
  • -
  • top: This value is the same as y (included so that it can seemlessly work with GTK::Geometry functions).
  • -
  • bottom: This value is the same as y (included so that it can seemlessly work with GTK::Geometry functions).
  • +
  • w: Width of the point that always returns 0 (included so that it can seamlessly work with GTK::Geometry functions).
  • +
  • h: Height of the point that always returns 0 (included so that it can seamlessly work with GTK::Geometry functions).
  • +
  • left: This value is the same as x (included so that it can seamlessly work with GTK::Geometry functions).
  • +
  • right: This value is the same as x (included so that it can seamlessly work with GTK::Geometry functions).
  • +
  • top: This value is the same as y (included so that it can seamlessly work with GTK::Geometry functions).
  • +
  • bottom: This value is the same as y (included so that it can seamlessly work with GTK::Geometry functions).
  • created_at: The tick (args.state.tick_count) that this structure was created.
  • global_created_at: The global tick (Kernel.global_tick_count) that this structure was created.
  • @@ -2322,7 +2452,7 @@ And here is an example where the override parameter is passed in: end end -

    DOCS: Numeric#elapsed?

    +

    DOCS: Numeric#elapsed?

    Returns true if Numeric#elapsed_time is greater than the number. An optional parameter can be passed into elapsed? which is added to the number before evaluating whether elapsed? is true.

    @@ -2386,7 +2516,7 @@ Example usage (with optional parameter): args.state.box_queue -= boxes_to_destroy end -

    DOCS: Numeric#created?

    +

    DOCS: Numeric#created?

    Returns true if Numeric#elapsed_time == 0. Essentially communicating that number is equal to the current frame.

    @@ -2455,7 +2585,7 @@ end Follows is a source code listing for all files that have been open sourced. This code can be found in the ./samples directory.

    Samples

    -

    Learn Ruby Optional - Beginner Ruby Primer - automation.rb

    +

    Learn Ruby Optional - Beginner Ruby Primer - automation.rb

    # ./samples/00_learn_ruby_optional/00_beginner_ruby_primer/app/automation.rb
     # ==========================================================================
     #  _    _ ________     __  _      _____  _____ _______ ______ _   _ _ _ _ _
    @@ -2579,7 +2709,7 @@ $gtk.schedule_callback 400 do
     end
     
     
    -

    Learn Ruby Optional - Beginner Ruby Primer - main.rb

    +

    Learn Ruby Optional - Beginner Ruby Primer - main.rb

    # ./samples/00_learn_ruby_optional/00_beginner_ruby_primer/app/main.rb
     # ==========================================================================
     #  _    _ ________     __  _      _____  _____ _______ ______ _   _ _ _ _ _
    @@ -2900,7 +3030,7 @@ def outputs
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - printing.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - printing.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/01_printing.txt
     # ====================================================================================
     # Commenting Code
    @@ -2935,7 +3065,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - strings.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - strings.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/02_strings.txt
     # ====================================================================================
     #  Strings
    @@ -2954,7 +3084,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - numbers.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - numbers.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/03_numbers.txt
     # ====================================================================================
     #  Numerics
    @@ -2979,7 +3109,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - booleans.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - booleans.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/04_booleans.txt
     # ====================================================================================
     #  Booleans
    @@ -3015,7 +3145,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - conditionals.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - conditionals.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/05_conditionals.txt
     # ====================================================================================
     #  Conditionals
    @@ -3133,7 +3263,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - looping.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - looping.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/06_looping.txt
     # ====================================================================================
     #  Looping
    @@ -3192,7 +3322,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - functions.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - functions.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/07_functions.txt
     # ====================================================================================
     # Functions
    @@ -3265,7 +3395,7 @@ repl do
     end
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - arrays.txt

    +

    Learn Ruby Optional - Intermediate Ruby Primer - arrays.txt

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/08_arrays.txt
     # ====================================================================================
     # Arrays
    @@ -3479,14 +3609,14 @@ end
     # ====================================================================================
     
     
    -

    Learn Ruby Optional - Intermediate Ruby Primer - main.rb

    +

    Learn Ruby Optional - Intermediate Ruby Primer - main.rb

    # ./samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/main.rb
     def tick args
       args.outputs.labels << [640, 380, "Open repl.rb in the text editor of your choice and follow the document.", 0, 1]
     end
     
     
    -

    Rendering Basics - Labels - main.rb

    +

    Rendering Basics - Labels - main.rb

    # ./samples/01_rendering_basics/01_labels/app/main.rb
     =begin
     
    @@ -3557,7 +3687,7 @@ def tick args
                                    g: 0,
                                    b: 200,
                                    a: 255,
    -                               font: "manaspc.ttf" }.label
    +                               font: "manaspc.ttf" }.label!
     
       # Primitives can hold anything, and can be given a label in the following forms
       args.outputs.primitives << [690 + 150, 330 - 80, "Custom font (.primitives Array)", 0, 1, 125, 0, 200, 255, "manaspc.ttf" ].label
    @@ -3571,7 +3701,7 @@ def tick args
                                    g: 0,
                                    b: 200,
                                    a: 255,
    -                               font: "manaspc.ttf" }.label
    +                               font: "manaspc.ttf" }.label!
     end
     
     def tick_instructions args, text, y = 715
    @@ -3589,7 +3719,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Rendering Basics - Lines - main.rb

    +

    Rendering Basics - Lines - main.rb

    # ./samples/01_rendering_basics/02_lines/app/main.rb
     =begin
     
    @@ -3647,7 +3777,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Rendering Basics - Solids Borders - main.rb

    +

    Rendering Basics - Solids Borders - main.rb

    # ./samples/01_rendering_basics/03_solids_borders/app/main.rb
     =begin
     
    @@ -3717,7 +3847,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Rendering Basics - Sprites - main.rb

    +

    Rendering Basics - Sprites - main.rb

    # ./samples/01_rendering_basics/04_sprites/app/main.rb
     =begin
     
    @@ -3764,7 +3894,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Rendering Basics - Sounds - main.rb

    +

    Rendering Basics - Sounds - main.rb

    # ./samples/01_rendering_basics/05_sounds/app/main.rb
     =begin
     
    @@ -3799,1011 +3929,360 @@ def tick args
     end
     
     
    -

    Rendering Basics - Audio Mixer - main.rb

    -
    # ./samples/01_rendering_basics/06_audio_mixer/app/main.rb
    -$gtk.reset
    +

    Input Basics - Keyboard - main.rb

    +
    # ./samples/02_input_basics/01_keyboard/app/main.rb
    +=begin
     
    -$boxsize = 30
    +APIs listing that haven't been encountered in a previous sample apps:
     
    -def render_sources args
    -  mouse_in_panel = (args.state.selected != 0) && args.inputs.mouse.position.inside_rect?([900, 450, 340, 250])
    -  mouse_new_down = (args.state.mouse_held == 1)
    +- args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    +  to the frame  that the key_up event occurred (the frame correlates
    +  to args.state.tick_count). Otherwise the value will be nil. For a
    +  full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    +- args.state.PROPERTY: The state property on args is a dynamic
    +  structure. You can define ANY property here with ANY type of
    +  arbitrary nesting. Properties defined on args.state will be retained
    +  across frames. If you attempt access a property that doesn't exist
    +  on args.state, it will simply return nil (no exception will be thrown).
     
    -  if (mouse_new_down && !mouse_in_panel)
    -    args.state.selected = 0  # will reset below if we hit something.
    -  end
    +=end
     
    -  args.audio.keys.each { |k|
    -    s = args.audio[k]
    +# Along with outputs, inputs are also an essential part of video game development
    +# DragonRuby can take input from keyboards, mouse, and controllers.
    +# This sample app will cover keyboard input.
     
    -    if (mouse_new_down) && !mouse_in_panel && args.inputs.mouse.position.inside_rect?([s[:screenx], s[:screeny], $boxsize, $boxsize])
    -      args.state.selected = k
    -      args.state.dragging_source = true
    -    end
    +# args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    +# This will work with the other keys as well
     
    -    isselected = (k == args.state.selected)
     
    -    if isselected && args.state.dragging_source
    -      # you can hang anything on the audio hashes you want, so we store the
    -      #  actual screen position so it doesn't scale weirdly vs your mouse.
    -      s[:screenx] = args.inputs.mouse.x - ($boxsize / 2)
    -      s[:screeny] = args.inputs.mouse.y - ($boxsize / 2)
    +def tick args
    +  tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    +  # Notice how small_font accounts for all the remaining parameters
    +  args.outputs.labels << { x: 460, y: row_to_px(args, 0), text: "Current game time: #{args.state.tick_count}", size_enum: -1 }
    +  args.outputs.labels << { x: 460, y: row_to_px(args, 2), text: "Keyboard input: args.inputs.keyboard.key_up.h", size_enum: -1 }
    +  args.outputs.labels << { x: 460, y: row_to_px(args, 3), text: "Press \"h\" on the keyboard.", size_enum: -1 }
    +
    +  # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    +  if args.inputs.keyboard.key_up.h
    +    args.state.h_pressed_at = args.state.tick_count
    +  end
     
    -      s[:screeny] = 50 if s[:screeny] < 50
    -      s[:screeny] = (719 - $boxsize) if s[:screeny] > (719 - $boxsize)
    -      s[:screenx] = 0 if s[:screenx] < 0
    -      s[:screenx] = (1279 - $boxsize) if s[:screenx] > (1279 - $boxsize)
    +  # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    +  args.state.h_pressed_at ||= false
     
    -      s[:x] = ((s[:screenx] / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    -      s[:y] = ((s[:screeny] / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    -    end
    +  if args.state.h_pressed_at
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" was pressed at time: #{args.state.h_pressed_at}", size_enum: -1 }
    +  else
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" has never been pressed.", size_enum: -1 }
    +  end
     
    -    color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    -    args.outputs.primitives << [s[:screenx], s[:screeny], $boxsize, $boxsize, *color].solid
    -  }
    +  tick_help_text args
     end
     
    -def render_panel args
    -  s = args.audio[args.state.selected]
    -  return if s.nil?
    -  mouse_down = (args.state.mouse_held > 0)
    -
    -  args.outputs.primitives << [900, 450, 340, 250, 127, 127, 200, 255].solid
    -  args.outputs.primitives << [1075, 690, "Source ##{args.state.selected}", 3, 1, 255, 255, 255].label
    -  args.outputs.primitives << [910, 660, 1230, 660, 255, 255, 255].line
    -  args.outputs.primitives << [910, 650, "screen:    (#{s[:screenx].to_i}, #{s[:screeny].to_i})", 0, 0, 255, 255, 255].label
    -  args.outputs.primitives << [910, 625, "position:  (#{s[:x].round(5).to_s[0..6]}, #{s[:y].round(5).to_s[0..6]})", 0, 0, 255, 255, 255].label
    +def row_to_px args, row_number, y_offset = 20
    +  # This takes a row_number and converts it to pixels DragonRuby understands.
    +  # Row 0 starts 5 units below the top of the grid
    +  # Each row afterward is 20 units lower
    +  args.grid.top - 5 - (y_offset * row_number)
    +end
     
    -  slider = [1022, 586, 200, 7]
    -  if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -    s[:pitch] = ((args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)) * 2.0
    -  end
    -  slidercolor = (s[:pitch] / 2.0) * 255
    -  args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -  args.outputs.primitives << [910, 600, "pitch: #{s[:pitch].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
    +# Don't worry about understanding the code within this method just yet.
    +# This method shows you the help text within the game.
    +def tick_help_text args
    +  return unless args.state.h_pressed_at
     
    -  slider = [1022, 561, 200, 7]
    -  if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -    s[:gain] = (args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)
    -  end
    -  slidercolor = s[:gain] * 255
    -  args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -  args.outputs.primitives << [910, 575, "gain: #{s[:gain].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
    +  args.state.key_value_history      ||= {}
    +  args.state.key_down_value_history ||= {}
    +  args.state.key_held_value_history ||= {}
    +  args.state.key_up_value_history   ||= {}
     
    -  checkbox = [1022, 533, 10, 12]
    -  if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -    s[:looping] = !s[:looping]
    +  if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    +      args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    +      args.inputs.keyboard.key_up.truthy_keys.length > 0)
    +    args.state.help_available = true
    +    args.state.no_activity_debounce = nil
    +  else
    +    args.state.no_activity_debounce ||= 5.seconds
    +    args.state.no_activity_debounce -= 1
    +    if args.state.no_activity_debounce <= 0
    +      args.state.help_available = false
    +      args.state.key_value_history        = {}
    +      args.state.key_down_value_history   = {}
    +      args.state.key_held_value_history   = {}
    +      args.state.key_up_value_history     = {}
    +    end
       end
    -  checkboxcolor = s[:looping] ? 255 : 0
    -  args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -  args.outputs.primitives << [910, 550, "looping:", 0, 0, 255, 255, 255].label
     
    -  checkbox = [1022, 508, 10, 12]
    -  if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -    s[:paused] = !s[:paused]
    -  end
    -  checkboxcolor = s[:paused] ? 255 : 0
    -  args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -  args.outputs.primitives << [910, 525, "paused:", 0, 0, 255, 255, 255].label
    +  args.outputs.labels << { x: 10, y: row_to_px(args, 6), text: "This is the api for the keys you've pressed:", size_enum: -1, r: 180 }
     
    -  button = [910, 460, 320, 20]
    -  if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(button)
    -    args.audio.delete(args.state.selected)
    -    args.state.selected = 0
    +  if !args.state.help_available
    +    args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    +    return
       end
    -  args.outputs.primitives << [*button, 255, 0, 0, 255].solid
    -  args.outputs.primitives << [button[0] + (button[2] / 2), button[1]+20, "DELETE SOURCE", 0, 1, 255, 255, 0].label
    -end
     
    -def spawn_new_sound args, num
    -  input = nil
    -  input = "sounds/#{num}.#{(num == 6) ? 'ogg' : 'wav'}"
    +  args.outputs.labels << { x: 10 , y: row_to_px(args, 7), text: "args.inputs.keyboard",          size_enum: -2 }
    +  args.outputs.labels << { x: 330, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_down", size_enum: -2 }
    +  args.outputs.labels << { x: 650, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_held", size_enum: -2 }
    +  args.outputs.labels << { x: 990, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_up",   size_enum: -2 }
     
    -  # Spawn randomly in an area that won't be covered by UI.
    -  screenx = (rand * 600.0) + 200.0
    -  screeny = (rand * 400.0) + 100.0
    +  fill_history args, :key_value_history,      :down_or_held, nil
    +  fill_history args, :key_down_value_history, :down,        :key_down
    +  fill_history args, :key_held_value_history, :held,        :key_held
    +  fill_history args, :key_up_value_history,   :up,          :key_up
     
    -  args.state.next_sound_index += 1
    +  render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    +  render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    +  render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    +  render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    +end
     
    -  # you can hang anything on the audio hashes you want, so we store the
    -  #  actual screen position in here for convenience.
    -  args.audio[args.state.next_sound_index] = {
    -    input: input,
    -    screenx: screenx,
    -    screeny: screeny,
    -    x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    -    y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    -    z: 0.0,
    -    gain: 1.0,
    -    pitch: 1.0,
    -    looping: true,
    -    paused: false
    -  }
    +def fill_history args, history_key, state_key, keyboard_method
    +  fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    +  fill_single_history args, history_key, state_key, keyboard_method, :char
    +  args.inputs.keyboard.keys[state_key].each do |key_name|
    +    fill_single_history args, history_key, state_key, keyboard_method, key_name
    +  end
    +end
     
    -  args.state.selected = args.state.next_sound_index
    +def fill_single_history args, history_key, state_key, keyboard_method, key_name
    +  current_value = args.inputs.keyboard.send(key_name)
    +  if keyboard_method
    +    current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
    +  end
    +  args.state.as_hash[history_key][key_name] ||= []
    +  args.state.as_hash[history_key][key_name] << current_value
    +  args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
     end
     
    -def render_launcher args
    -  total = 6
    -  x = (1280 - (total * $boxsize * 3)) / 2
    -  y = 10
    -  args.outputs.primitives << [0, 0, 1280, ((y*2) + $boxsize), 127, 127, 127, 255].solid
    -  for i in 1..total
    -    args.outputs.primitives << [x, y, $boxsize, $boxsize, 255, 255, 255, 255].solid
    -    args.outputs.primitives << [x+8, y+28, i.to_s, 3, 0, 0, 0, 255, 255].label
    -    if args.inputs.mouse.click && args.inputs.mouse.click.point.inside_rect?([x, y, $boxsize, $boxsize])
    -      spawn_new_sound args, i
    +def render_help_labels args, history_key, state_key, keyboard_method, x
    +  idx = 8
    +  args.outputs.labels << args.state
    +                           .as_hash[history_key]
    +                           .keys
    +                           .reverse
    +                           .map
    +                           .with_index do |k, i|
    +    v = args.state.as_hash[history_key][k]
    +    current_value = args.inputs.keyboard.send(k)
    +    if keyboard_method
    +      current_value = args.inputs.keyboard.send(keyboard_method).send(k)
         end
    -    x = x + ($boxsize * 3)
    +    idx += 2
    +    [
    +      { x: x, y: row_to_px(args, idx + 0, 16), text: "    .#{k} is #{current_value || "nil"}", size_enum: -2 },
    +      { x: x, y: row_to_px(args, idx + 1, 16), text: "       was #{v}", size_enum: -2 }
    +    ]
       end
     end
     
    -def render_ui args
    -  render_launcher args
    -  render_panel args
    +
    +def tick_instructions args, text, y = 715
    +  return if args.state.key_event_occurred
    +  if args.inputs.mouse.click ||
    +     args.inputs.keyboard.directional_vector ||
    +     args.inputs.keyboard.key_down.enter ||
    +     args.inputs.keyboard.key_down.escape
    +    args.state.key_event_occurred = true
    +  end
    +
    +  args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +  args.outputs.debug << { x: 640, y: y,      text: text,
    +                          size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +  args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)",
    +                          size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
     end
     
    +
    +

    Input Basics - Moving A Sprite - main.rb

    +
    # ./samples/02_input_basics/01_moving_a_sprite/app/main.rb
     def tick args
    -  args.state.mouse_held ||= 0
    -  args.state.dragging_source ||= false
    -  args.state.selected ||= 0
    -  args.state.next_sound_index ||= 0
    +  # create a player and set default values
    +  # for the player's x, y, w (width), and h (height)
    +  args.state.player.x ||= 100
    +  args.state.player.y ||= 100
    +  args.state.player.w ||=  50
    +  args.state.player.h ||=  50
     
    -  if args.inputs.mouse.up
    -    args.state.mouse_held = 0
    -    args.state.dragging_source = false
    -  elsif args.inputs.mouse.down || (args.state.mouse_held > 0)
    -    args.state.mouse_held += 1
    -  else
    +  # render the player to the screen
    +  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' }
    +
    +  # move the player around using the keyboard
    +  if args.inputs.up
    +    args.state.player.y += 10
    +  elsif args.inputs.down
    +    args.state.player.y -= 10
       end
     
    -  args.outputs.background_color = [ 0, 0, 0, 255 ]
    -  render_sources args
    -  render_ui args
    +  if args.inputs.left
    +    args.state.player.x -= 10
    +  elsif args.inputs.right
    +    args.state.player.x += 10
    +  end
     end
     
    +$gtk.reset
    +
     
    -

    Rendering Basics - Sound Synthesis - main.rb

    -
    # ./samples/01_rendering_basics/07_sound_synthesis/app/main.rb
    -begin # region: top level tick methods
    -  def tick args
    -    defaults args
    -    render args
    -    input args
    -    process_audio_queue args
    -  end
    +

    Input Basics - Mouse - main.rb

    +
    # ./samples/02_input_basics/02_mouse/app/main.rb
    +=begin
     
    -  def defaults args
    -    args.state.sine_waves      ||= {}
    -    args.state.square_waves    ||= {}
    -    args.state.saw_tooth_waves ||= {}
    -    args.state.triangle_waves  ||= {}
    -    args.state.audio_queue     ||= []
    -    args.state.buttons         ||= [
    -      (frequency_buttons args),
    -      (sine_wave_note_buttons args),
    -      (bell_buttons args),
    -      (square_wave_note_buttons args),
    -      (saw_tooth_wave_note_buttons args),
    -      (triangle_wave_note_buttons args),
    -    ].flatten
    -  end
    +APIs that haven't been encountered in a previous sample apps:
     
    -  def render args
    -    args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    -    args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    -    args.outputs.labels  << args.layout
    -                              .rect(row: 0, col: 11.5)
    -                              .yield_self { |r| r.merge y: r.y + r.h }
    -                              .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    -                                     alignment_enum: 1)
    -  end
    +- args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +- args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +- args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +- args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +  since the click event.
     
    +Reminder:
     
    -  def input args
    -    args.state.buttons.each do |b|
    -      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    -        parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    -        args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    -        send b[:method_to_call], args, b
    -      end
    -    end
    +- args.state.PROPERTY: The state property on args is a dynamic
    +  structure. You can define ANY property here with ANY type of
    +  arbitrary nesting. Properties defined on args.state will be retained
    +  across frames. If you attempt access a property that doesn't exist
    +  on args.state, it will simply return nil (no exception will be thrown).
     
    -    if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    -      args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    -    end
    -  end
    +=end
     
    -  def process_audio_queue args
    -    to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    -    args.state.audio_queue -= to_queue
    -    to_queue.each { |a| args.audio[a[:id]] = a }
    +# This code demonstrates DragonRuby mouse input
     
    -    args.audio.find_all { |k, v| v[:decay_rate] }
    -      .each     { |k, v| v[:gain] -= v[:decay_rate] }
    +# To see if the a mouse click occurred
    +# Use args.inputs.mouse.click
    +# Which returns a boolean
     
    -    sounds_to_stop = args.audio
    -                       .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    -                       .map { |k, v| k }
    +# To see where a mouse click occurred
    +# Use args.inputs.mouse.click.point.x AND
    +# args.inputs.mouse.click.point.y
     
    -    sounds_to_stop.each { |k| args.audio.delete k }
    -  end
    -end
    +# To see which frame the click occurred
    +# Use args.inputs.mouse.click.created_at
     
    -begin # region: button definitions, ui layout, callback functions
    -  def button args, opts
    -    button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
    +# To see how many frames its been since the click occurred
    +# Use args.inputs.mouse.click.creat_at_elapsed
     
    -    button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
    +# Saving the click in args.state can be quite useful
     
    -    label_offset_x = 5
    -    label_offset_y = 30
    +def tick args
    +  tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    +  x = 460
     
    -    button_def[:label]  = button_def[:rect].merge text: opts[:text],
    -                                                  size_enum: -2.5,
    -                                                  x: button_def[:rect].x + label_offset_x,
    -                                                  y: button_def[:rect].y + label_offset_y
    +  args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
     
    -    button_def
    +  if args.inputs.mouse.click
    +    args.state.last_mouse_click = args.inputs.mouse.click
       end
     
    -  def play_sine_wave args, sender
    -    queue_sine_wave args,
    -                    frequency: sender[:frequency],
    -                    duration: 1.seconds,
    -                    fade_out: true
    +  if args.state.last_mouse_click
    +    click = args.state.last_mouse_click
    +    args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    +    args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    +    args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
    +  else
    +    args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    +    args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
       end
    +end
     
    -  def play_note args, sender
    -    method_to_call = :queue_sine_wave
    -    method_to_call = :queue_square_wave    if sender[:type] == :square
    -    method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    -    method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    -    method_to_call = :queue_bell           if sender[:type] == :bell
    +def small_label args, x, row, message
    +  # This method effectively combines the row_to_px and small_font methods
    +  # It changes the given row value to a DragonRuby pixel value
    +  # and adds the customization parameters
    +  { x: x, y: row_to_px(args, row), text: message, alignment_enum: -2 }
    +end
     
    -    send method_to_call, args,
    -         frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    -         duration: 1.seconds,
    -         fade_out: true
    +def row_to_px args, row_number
    +  args.grid.top.shift_down(5).shift_down(20 * row_number)
    +end
    +
    +def tick_instructions args, text, y = 715
    +  return if args.state.key_event_occurred
    +  if args.inputs.mouse.click ||
    +     args.inputs.keyboard.directional_vector ||
    +     args.inputs.keyboard.key_down.enter ||
    +     args.inputs.keyboard.key_down.escape
    +    args.state.key_event_occurred = true
       end
     
    -  def frequency_buttons args
    -    [
    -      (button args,
    -              row: 4.0, col: 0, text: "300hz",
    -              frequency: 300,
    -              method_to_call: :play_sine_wave),
    -      (button args,
    -              row: 5.0, col: 0, text: "400hz",
    -              frequency: 400,
    -              method_to_call: :play_sine_wave),
    -      (button args,
    -              row: 6.0, col: 0, text: "500hz",
    -              frequency: 500,
    -              method_to_call: :play_sine_wave),
    -    ]
    +  args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +  args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +  args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +end
    +
    +
    +

    Input Basics - Mouse Point To Rect - main.rb

    +
    # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    +=begin
    +
    +APIs that haven't been encountered in a previous sample apps:
    +
    +- args.outputus.borders: An array. Values in this array will be rendered as
    +  unfilled rectangles on the screen.
    +- ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +  with at least four values is considered a rect. The inside_rect? function returns true
    +  or false depending on if the point is inside the rect.
    +
    +  ```
    +  # Point:  x: 100, y: 100
    +  # Rect:   x: 0, y: 0, w: 500, h: 500
    +  # Result: true
    +
    +  [100, 100].inside_rect? [0, 0, 500, 500]
    +  ```
    +
    +  ```
    +  # Point:  x: 100, y: 100
    +  # Rect:   x: 300, y: 300, w: 100, h: 100
    +  # Result: false
    +
    +  [100, 100].inside_rect? [300, 300, 100, 100]
    +  ```
    +
    +- args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +- args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +  since the click event.
    +
    +=end
    +
    +# To determine whether a point is in a rect
    +# Use point.inside_rect? rect
    +
    +# This is useful to determine if a click occurred in a rect
    +
    +def tick args
    +  tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
    +
    +  x = 460
    +
    +  args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
    +
    +  box = { x: 785, y: 370, w: 50, h: 50, r: 0, g: 0, b: 170 }
    +  args.outputs.borders << box
    +
    +  # Saves the most recent click into args.state
    +  # Unlike the other components of args,
    +  # args.state does not reset every tick.
    +  if args.inputs.mouse.click
    +    args.state.last_mouse_click = args.inputs.mouse.click
       end
     
    -  def sine_wave_note_buttons args
    -    [
    -      (button args,
    -              row: 1.5, col: 2, text: "Sine C4",
    -              note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 2.5, col: 2, text: "Sine D4",
    -              note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 3.5, col: 2, text: "Sine E4",
    -              note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 4.5, col: 2, text: "Sine F4",
    -              note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 5.5, col: 2, text: "Sine G4",
    -              note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 6.5, col: 2, text: "Sine A5",
    -              note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 7.5, col: 2, text: "Sine B5",
    -              note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    -      (button args,
    -              row: 8.5, col: 2, text: "Sine C5",
    -              note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    -    ]
    +  if args.state.last_mouse_click
    +    if args.state.last_mouse_click.point.inside_rect? box
    +      args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    +    else
    +      args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    +    end
    +  else
    +    args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
       end
    -
    -  def square_wave_note_buttons args
    -    [
    -      (button args,
    -              row: 1.5, col: 6, text: "Square C4",
    -              note: :c, octave: 4, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 2.5, col: 6, text: "Square D4",
    -              note: :d, octave: 4, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 3.5, col: 6, text: "Square E4",
    -              note: :e, octave: 4, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 4.5, col: 6, text: "Square F4",
    -              note: :f, octave: 4, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 5.5, col: 6, text: "Square G4",
    -              note: :g, octave: 4, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 6.5, col: 6, text: "Square A5",
    -              note: :a, octave: 5, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 7.5, col: 6, text: "Square B5",
    -              note: :b, octave: 5, type: :square, method_to_call: :play_note),
    -      (button args,
    -              row: 8.5, col: 6, text: "Square C5",
    -              note: :c, octave: 5, type: :square, method_to_call: :play_note),
    -    ]
    -  end
    -  def saw_tooth_wave_note_buttons args
    -    [
    -      (button args,
    -              row: 1.5, col: 8, text: "Saw C4",
    -              note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 2.5, col: 8, text: "Saw D4",
    -              note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 3.5, col: 8, text: "Saw E4",
    -              note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 4.5, col: 8, text: "Saw F4",
    -              note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 5.5, col: 8, text: "Saw G4",
    -              note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 6.5, col: 8, text: "Saw A5",
    -              note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 7.5, col: 8, text: "Saw B5",
    -              note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -      (button args,
    -              row: 8.5, col: 8, text: "Saw C5",
    -              note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -    ]
    -  end
    -
    -  def triangle_wave_note_buttons args
    -    [
    -      (button args,
    -              row: 1.5, col: 10, text: "Triangle C4",
    -              note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 2.5, col: 10, text: "Triangle D4",
    -              note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 3.5, col: 10, text: "Triangle E4",
    -              note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 4.5, col: 10, text: "Triangle F4",
    -              note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 5.5, col: 10, text: "Triangle G4",
    -              note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 6.5, col: 10, text: "Triangle A5",
    -              note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 7.5, col: 10, text: "Triangle B5",
    -              note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    -      (button args,
    -              row: 8.5, col: 10, text: "Triangle C5",
    -              note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    -    ]
    -  end
    -
    -  def bell_buttons args
    -    [
    -      (button args,
    -              row: 1.5, col: 4, text: "Bell C4",
    -              note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 2.5, col: 4, text: "Bell D4",
    -              note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 3.5, col: 4, text: "Bell E4",
    -              note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 4.5, col: 4, text: "Bell F4",
    -              note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 5.5, col: 4, text: "Bell G4",
    -              note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 6.5, col: 4, text: "Bell A5",
    -              note: :a, octave: 5, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 7.5, col: 4, text: "Bell B5",
    -              note: :b, octave: 5, type: :bell, method_to_call: :play_note),
    -      (button args,
    -              row: 8.5, col: 4, text: "Bell C5",
    -              note: :c, octave: 5, type: :bell, method_to_call: :play_note),
    -    ]
    -  end
    -end
    -
    -begin # region: wave generation
    -  begin # sine wave
    -    def defaults_sine_wave_for
    -      { frequency: 440, sample_rate: 48000 }
    -    end
    -
    -    def sine_wave_for opts = {}
    -      opts = defaults_sine_wave_for.merge opts
    -      frequency   = opts[:frequency]
    -      sample_rate = opts[:sample_rate]
    -      period_size = (sample_rate.fdiv frequency).ceil
    -      period_size.map_with_index do |i|
    -        Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)
    -      end.to_a
    -    end
    -
    -    def defaults_queue_sine_wave
    -      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -    end
    -
    -    def queue_sine_wave args, opts = {}
    -      opts        = defaults_queue_sine_wave.merge opts
    -      frequency   = opts[:frequency]
    -      sample_rate = 48000
    -
    -      sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate
    -      args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate
    -
    -      proc = lambda do
    -        generate_audio_data args.state.sine_waves[frequency], sample_rate
    -      end
    -
    -      audio_state = new_audio_state args, opts
    -      audio_state[:input] = [1, sample_rate, proc]
    -      queue_audio args, audio_state: audio_state, wave: sine_wave
    -    end
    -  end
    -
    -  begin # region: square wave
    -    def defaults_square_wave_for
    -      { frequency: 440, sample_rate: 48000 }
    -    end
    -
    -    def square_wave_for opts = {}
    -      opts = defaults_square_wave_for.merge opts
    -      sine_wave = sine_wave_for opts
    -      sine_wave.map do |v|
    -        if v >= 0
    -          1.0
    -        else
    -          -1.0
    -        end
    -      end.to_a
    -    end
    -
    -    def defaults_queue_square_wave
    -      { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -    end
    -
    -    def queue_square_wave args, opts = {}
    -      opts        = defaults_queue_square_wave.merge opts
    -      frequency   = opts[:frequency]
    -      sample_rate = 48000
    -
    -      square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    -      args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
    -
    -      proc = lambda do
    -        generate_audio_data args.state.square_waves[frequency], sample_rate
    -      end
    -
    -      audio_state = new_audio_state args, opts
    -      audio_state[:input] = [1, sample_rate, proc]
    -      queue_audio args, audio_state: audio_state, wave: square_wave
    -    end
    -  end
    -
    -  begin # region: saw tooth wave
    -    def defaults_saw_tooth_wave_for
    -      { frequency: 440, sample_rate: 48000 }
    -    end
    -
    -    def saw_tooth_wave_for opts = {}
    -      opts = defaults_saw_tooth_wave_for.merge opts
    -      sine_wave = sine_wave_for opts
    -      period_size = sine_wave.length
    -      sine_wave.map_with_index do |v, i|
    -        (((i % period_size).fdiv period_size) * 2) - 1
    -      end
    -    end
    -
    -    def defaults_queue_saw_tooth_wave
    -      { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -    end
    -
    -    def queue_saw_tooth_wave args, opts = {}
    -      opts        = defaults_queue_saw_tooth_wave.merge opts
    -      frequency   = opts[:frequency]
    -      sample_rate = 48000
    -
    -      saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    -      args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    -
    -      proc = lambda do
    -        generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    -      end
    -
    -      audio_state = new_audio_state args, opts
    -      audio_state[:input] = [1, sample_rate, proc]
    -      queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
    -    end
    -  end
    -
    -  begin # region: triangle wave
    -    def defaults_triangle_wave_for
    -      { frequency: 440, sample_rate: 48000 }
    -    end
    -
    -    def triangle_wave_for opts = {}
    -      opts = defaults_saw_tooth_wave_for.merge opts
    -      sine_wave = sine_wave_for opts
    -      period_size = sine_wave.length
    -      sine_wave.map_with_index do |v, i|
    -        ratio = (i.fdiv period_size)
    -        if ratio <= 0.5
    -          (ratio * 4) - 1
    -        else
    -          ratio -= 0.5
    -          1 - (ratio * 4)
    -        end
    -      end
    -    end
    -
    -    def defaults_queue_triangle_wave
    -      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -    end
    -
    -    def queue_triangle_wave args, opts = {}
    -      opts        = defaults_queue_triangle_wave.merge opts
    -      frequency   = opts[:frequency]
    -      sample_rate = 48000
    -
    -      triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    -      args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
    -
    -      proc = lambda do
    -        generate_audio_data args.state.triangle_waves[frequency], sample_rate
    -      end
    -
    -      audio_state = new_audio_state args, opts
    -      audio_state[:input] = [1, sample_rate, proc]
    -      queue_audio args, audio_state: audio_state, wave: triangle_wave
    -    end
    -  end
    -
    -  begin # region: bell
    -    def defaults_queue_bell
    -      { frequency: 440, duration: 1.seconds, queue_in: 0 }
    -    end
    -
    -    def queue_bell args, opts = {}
    -      (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
    -    end
    -
    -    def bell_harmonics
    -      [
    -        { frequency_ratio: 0.5, duration_ratio: 1.00 },
    -        { frequency_ratio: 1.0, duration_ratio: 0.80 },
    -        { frequency_ratio: 2.0, duration_ratio: 0.60 },
    -        { frequency_ratio: 3.0, duration_ratio: 0.40 },
    -        { frequency_ratio: 4.2, duration_ratio: 0.25 },
    -        { frequency_ratio: 5.4, duration_ratio: 0.20 },
    -        { frequency_ratio: 6.8, duration_ratio: 0.15 }
    -      ]
    -    end
    -
    -    def defaults_bell_to_sine_waves
    -      { frequency: 440, duration: 1.seconds, queue_in: 0 }
    -    end
    -
    -    def bell_to_sine_waves opts = {}
    -      opts = defaults_bell_to_sine_waves.merge opts
    -      bell_harmonics.map do |b|
    -        {
    -          frequency: opts[:frequency] * b[:frequency_ratio],
    -          duration:  opts[:duration] * b[:duration_ratio],
    -          queue_in:  opts[:queue_in],
    -          gain:      (1.fdiv bell_harmonics.length),
    -          fade_out:  true
    -        }
    -      end
    -    end
    -  end
    -
    -  begin # audio entity construction
    -    def generate_audio_data sine_wave, sample_rate
    -      sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    -      copy_count  = (sample_size.fdiv sine_wave.length).ceil
    -      sine_wave * copy_count
    -    end
    -
    -    def defaults_new_audio_state
    -      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -    end
    -
    -    def new_audio_state args, opts = {}
    -      opts        = defaults_new_audio_state.merge opts
    -      decay_rate  = 0
    -      decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    -      frequency   = opts[:frequency]
    -      sample_rate = 48000
    -
    -      {
    -        id:               (new_id! args),
    -        frequency:        frequency,
    -        sample_rate:      48000,
    -        stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    -        gain:             opts[:gain].to_f,
    -        queue_at:         args.state.tick_count + opts[:queue_in],
    -        decay_rate:       decay_rate,
    -        pitch:            1.0,
    -        looping:          true,
    -        paused:           false
    -      }
    -    end
    -
    -    def queue_audio args, opts = {}
    -      graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    -      args.state.audio_queue << opts[:audio_state]
    -    end
    -
    -    def new_id! args
    -      args.state.audio_id ||= 0
    -      args.state.audio_id  += 1
    -    end
    -
    -    def graph_wave args, wave, frequency
    -      if args.state.tick_count != args.state.graphed_at
    -        args.outputs.static_lines.clear
    -        args.outputs.static_sprites.clear
    -      end
    -
    -      wave = wave
    -
    -      r, g, b = frequency.to_i % 85,
    -                frequency.to_i % 170,
    -                frequency.to_i % 255
    -
    -      starting_rect = args.layout.rect(row: 5, col: 13)
    -      x_scale    = 10
    -      y_scale    = 100
    -      max_points = 25
    -
    -      points = wave
    -      if wave.length > max_points
    -        resolution = wave.length.idiv max_points
    -        points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    -      end
    -
    -      args.outputs.static_lines << points.map_with_index do |y, x|
    -        next_y = points[x + 1]
    -
    -        if next_y
    -          {
    -            x:  starting_rect.x + (x * x_scale),
    -            y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    -            x2: starting_rect.x + ((x + 1) * x_scale),
    -            y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    -            r:  r,
    -            g:  g,
    -            b:  b
    -          }
    -        end
    -      end
    -
    -      args.outputs.static_sprites << points.map_with_index do |y, x|
    -        {
    -          x:  (starting_rect.x + (x * x_scale)) - 2,
    -          y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    -          w:  4,
    -          h:  4,
    -          path: 'sprites/square-white.png',
    -          r: r,
    -          g: g,
    -          b: b
    -        }
    -      end
    -
    -      args.state.graphed_at = args.state.tick_count
    -    end
    -  end
    -
    -  begin # region: musical note mapping
    -    def defaults_frequency_for
    -      { note: :a, octave: 5, sharp:  false, flat:   false }
    -    end
    -
    -    def frequency_for opts = {}
    -      opts = defaults_frequency_for.merge opts
    -      octave_offset_multiplier  = opts[:octave] - 5
    -      note = note_frequencies_octave_5[opts[:note]]
    -      if octave_offset_multiplier < 0
    -        note = note * 1 / (octave_offset_multiplier.abs + 1)
    -      elsif octave_offset_multiplier > 0
    -        note = note * (octave_offset_multiplier.abs + 1) / 1
    -      end
    -      note
    -    end
    -
    -    def note_frequencies_octave_5
    -      {
    -        a: 440.0,
    -        a_sharp: 466.16, b_flat: 466.16,
    -        b: 493.88,
    -        c: 523.25,
    -        c_sharp: 554.37, d_flat: 587.33,
    -        d: 587.33,
    -        d_sharp: 622.25, e_flat: 659.25,
    -        e: 659.25,
    -        f: 698.25,
    -        f_sharp: 739.99, g_flat: 739.99,
    -        g: 783.99,
    -        g_sharp: 830.61, a_flat: 830.61
    -      }
    -    end
    -  end
    -end
    -
    -$gtk.reset
    -
    -
    -

    Input Basics - Keyboard - main.rb

    -
    # ./samples/02_input_basics/01_keyboard/app/main.rb
    -=begin
    -
    -APIs listing that haven't been encountered in a previous sample apps:
    -
    -- args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    -  to the frame  that the key_up event occurred (the frame correlates
    -  to args.state.tick_count). Otherwise the value will be nil. For a
    -  full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    -- args.state.PROPERTY: The state property on args is a dynamic
    -  structure. You can define ANY property here with ANY type of
    -  arbitrary nesting. Properties defined on args.state will be retained
    -  across frames. If you attempt access a property that doesn't exist
    -  on args.state, it will simply return nil (no exception will be thrown).
    -
    -=end
    -
    -# Along with outputs, inputs are also an essential part of video game development
    -# DragonRuby can take input from keyboards, mouse, and controllers.
    -# This sample app will cover keyboard input.
    -
    -# args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    -# This will work with the other keys as well
    -
    -
    -def tick args
    -  tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    -  # Notice how small_font accounts for all the remaining parameters
    -  args.outputs.labels << [460, row_to_px(args, 0), "Current game time: #{args.state.tick_count}", small_font]
    -  args.outputs.labels << [460, row_to_px(args, 2), "Keyboard input: args.inputs.keyboard.key_up.h", small_font]
    -  args.outputs.labels << [460, row_to_px(args, 3), "Press \"h\" on the keyboard.", small_font]
    -
    -  # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    -  if args.inputs.keyboard.key_up.h
    -    args.state.h_pressed_at = args.state.tick_count
    -  end
    -
    -  # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    -  args.state.h_pressed_at ||= false
    -
    -  if args.state.h_pressed_at
    -    args.outputs.labels << [460, row_to_px(args, 4), "\"h\" was pressed at time: #{args.state.h_pressed_at}", small_font]
    -  else
    -    args.outputs.labels << [460, row_to_px(args, 4), "\"h\" has never been pressed.", small_font]
    -  end
    -
    -  tick_help_text args
    -end
    -
    -def small_font
    -  # This method provides some values for the construction of labels
    -  # Specifically, Size, Alignment, & RGBA
    -  # This makes it so that custom parameters don't have to be repeatedly typed.
    -  # Additionally "small_font" provides programmers with more information than some numbers
    -  [-2, 0, 0, 0, 0, 255]
    -end
    -
    -def row_to_px args, row_number
    -  # This takes a row_number and converts it to pixels DragonRuby understands.
    -  # Row 0 starts 5 units below the top of the grid
    -  # Each row afterward is 20 units lower
    -  args.grid.top.shift_down(5).shift_down(20 * row_number)
    -end
    -
    -# Don't worry about understanding the code within this method just yet.
    -# This method shows you the help text within the game.
    -def tick_help_text args
    -  return unless args.state.h_pressed_at
    -
    -  args.state.key_value_history      ||= {}
    -  args.state.key_down_value_history ||= {}
    -  args.state.key_held_value_history ||= {}
    -  args.state.key_up_value_history   ||= {}
    -
    -  if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    -      args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    -      args.inputs.keyboard.key_up.truthy_keys.length > 0)
    -    args.state.help_available = true
    -    args.state.no_activity_debounce = nil
    -  else
    -    args.state.no_activity_debounce ||= 5.seconds
    -    args.state.no_activity_debounce -= 1
    -    if args.state.no_activity_debounce <= 0
    -      args.state.help_available = false
    -      args.state.key_value_history        = {}
    -      args.state.key_down_value_history   = {}
    -      args.state.key_held_value_history   = {}
    -      args.state.key_up_value_history     = {}
    -    end
    -  end
    -
    -  args.outputs.labels << [10, row_to_px(args, 6), "Advanced Help:", small_font]
    -
    -  if !args.state.help_available
    -    args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    -    return
    -  end
    -
    -  args.outputs.labels << [10 , row_to_px(args, 7), "args.inputs.keyboard", small_font]
    -  args.outputs.labels << [330, row_to_px(args, 7), "args.inputs.keyboard.key_down", small_font]
    -  args.outputs.labels << [650, row_to_px(args, 7), "args.inputs.keyboard.key_held", small_font]
    -  args.outputs.labels << [990, row_to_px(args, 7), "args.inputs.keyboard.key_up", small_font]
    -
    -  fill_history args, :key_value_history,      :down_or_held, nil
    -  fill_history args, :key_down_value_history, :down,        :key_down
    -  fill_history args, :key_held_value_history, :held,        :key_held
    -  fill_history args, :key_up_value_history,   :up,          :key_up
    -
    -  render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    -  render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    -  render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    -  render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    -end
    -
    -def fill_history args, history_key, state_key, keyboard_method
    -  fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    -  fill_single_history args, history_key, state_key, keyboard_method, :char
    -  args.inputs.keyboard.keys[state_key].each do |key_name|
    -    fill_single_history args, history_key, state_key, keyboard_method, key_name
    -  end
    -end
    -
    -def fill_single_history args, history_key, state_key, keyboard_method, key_name
    -  current_value = args.inputs.keyboard.send(key_name)
    -  if keyboard_method
    -    current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
    -  end
    -  args.state.as_hash[history_key][key_name] ||= []
    -  args.state.as_hash[history_key][key_name] << current_value
    -  args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
    -end
    -
    -def render_help_labels args, history_key, state_key, keyboard_method, x
    -  idx = 8
    -  args.outputs.labels << args.state
    -                           .as_hash[history_key]
    -                           .keys
    -                           .reverse
    -                           .map
    -                           .with_index do |k, i|
    -    v = args.state.as_hash[history_key][k]
    -    current_value = args.inputs.keyboard.send(k)
    -    if keyboard_method
    -      current_value = args.inputs.keyboard.send(keyboard_method).send(k)
    -    end
    -    idx += 2
    -    [
    -      [x, row_to_px(args, idx - 2),
    -       "    .#{k} is #{current_value || "nil"}",
    -       small_font],
    -      [x, row_to_px(args, idx - 1),
    -       "       was #{v}",
    -       small_font]
    -    ]
    -  end
    -end
    -
    -
    -def tick_instructions args, text, y = 715
    -  return if args.state.key_event_occurred
    -  if args.inputs.mouse.click ||
    -     args.inputs.keyboard.directional_vector ||
    -     args.inputs.keyboard.key_down.enter ||
    -     args.inputs.keyboard.key_down.escape
    -    args.state.key_event_occurred = true
    -  end
    -
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -end
    -
    -
    -

    Input Basics - Mouse - main.rb

    -
    # ./samples/02_input_basics/02_mouse/app/main.rb
    -=begin
    -
    -APIs that haven't been encountered in a previous sample apps:
    -
    -- args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -- args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -- args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -- args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -  since the click event.
    -
    -Reminder:
    -
    -- args.state.PROPERTY: The state property on args is a dynamic
    -  structure. You can define ANY property here with ANY type of
    -  arbitrary nesting. Properties defined on args.state will be retained
    -  across frames. If you attempt access a property that doesn't exist
    -  on args.state, it will simply return nil (no exception will be thrown).
    -
    -=end
    -
    -# This code demonstrates DragonRuby mouse input
    -
    -# To see if the a mouse click occurred
    -# Use args.inputs.mouse.click
    -# Which returns a boolean
    -
    -# To see where a mouse click occurred
    -# Use args.inputs.mouse.click.point.x AND
    -# args.inputs.mouse.click.point.y
    -
    -# To see which frame the click occurred
    -# Use args.inputs.mouse.click.created_at
    -
    -# To see how many frames its been since the click occurred
    -# Use args.inputs.mouse.click.creat_at_elapsed
    -
    -# Saving the click in args.state can be quite useful
    -
    -def tick args
    -  tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    -  x = 460
    -
    -  args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
    -
    -  if args.inputs.mouse.click
    -    args.state.last_mouse_click = args.inputs.mouse.click
    -  end
    -
    -  if args.state.last_mouse_click
    -    click = args.state.last_mouse_click
    -    args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    -    args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    -    args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
    -  else
    -    args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    -    args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
    -  end
    -end
    +end
     
     def small_label args, x, row, message
    -  # This method effectively combines the row_to_px and small_font methods
    -  # It changes the given row value to a DragonRuby pixel value
    -  # and adds the customization parameters
    -  [x, row_to_px(args, row), message, small_font]
    -end
    -
    -def small_font
    -  [-2, 0, 0, 0, 0, 255]
    +  { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
     end
     
     def row_to_px args, row_number
    @@ -4819,107 +4298,13 @@ def tick_instructions args, text, y = 715
         args.state.key_event_occurred = true
       end
     
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +  args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +  args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +  args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
     end
     
     
    -

    Input Basics - Mouse Point To Rect - main.rb

    -
    # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    -=begin
    -
    -APIs that haven't been encountered in a previous sample apps:
    -
    -- args.outputus.borders: An array. Values in this array will be rendered as
    -  unfilled rectangles on the screen.
    -- ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -  with at least four values is considered a rect. The inside_rect? function returns true
    -  or false depending on if the point is inside the rect.
    -
    -  ```
    -  # Point:  x: 100, y: 100
    -  # Rect:   x: 0, y: 0, w: 500, h: 500
    -  # Result: true
    -
    -  [100, 100].inside_rect? [0, 0, 500, 500]
    -  ```
    -
    -  ```
    -  # Point:  x: 100, y: 100
    -  # Rect:   x: 300, y: 300, w: 100, h: 100
    -  # Result: false
    -
    -  [100, 100].inside_rect? [300, 300, 100, 100]
    -  ```
    -
    -- args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -- args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -  since the click event.
    -
    -=end
    -
    -# To determine whether a point is in a rect
    -# Use point.inside_rect? rect
    -
    -# This is useful to determine if a click occurred in a rect
    -
    -def tick args
    -  tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
    -
    -  x = 460
    -
    -  args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
    -
    -  box = [785, 370, 50, 50, 0, 0, 170]
    -  args.outputs.borders << box
    -
    -  # Saves the most recent click into args.state
    -  # Unlike the other components of args,
    -  # args.state does not reset every tick.
    -  if args.inputs.mouse.click
    -    args.state.last_mouse_click = args.inputs.mouse.click
    -  end
    -
    -  if args.state.last_mouse_click
    -    if args.state.last_mouse_click.point.inside_rect? box
    -      args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    -    else
    -      args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    -    end
    -  else
    -    args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
    -  end
    -end
    -
    -def small_label args, x, row, message
    -  [x, row_to_px(args, row), message, small_font]
    -end
    -
    -def small_font
    -  [-2, 0, 0, 0, 0, 255]
    -end
    -
    -def row_to_px args, row_number
    -  args.grid.top.shift_down(5).shift_down(20 * row_number)
    -end
    -
    -def tick_instructions args, text, y = 715
    -  return if args.state.key_event_occurred
    -  if args.inputs.mouse.click ||
    -     args.inputs.keyboard.directional_vector ||
    -     args.inputs.keyboard.key_down.enter ||
    -     args.inputs.keyboard.key_down.escape
    -    args.state.key_event_occurred = true
    -  end
    -
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -end
    -
    -
    -

    Input Basics - Mouse Rect To Rect - main.rb

    +

    Input Basics - Mouse Rect To Rect - main.rb

    # ./samples/02_input_basics/04_mouse_rect_to_rect/app/main.rb
     =begin
     
    @@ -4965,9 +4350,15 @@ def tick args
       # They are stored in game so that they do not get reset every tick
       if args.inputs.mouse.click
         if !args.state.box_collision_one
    -      args.state.box_collision_one = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 180, 0,   0, 180]
    +      args.state.box_collision_one = { x: args.inputs.mouse.click.point.x - 25,
    +                                       y: args.inputs.mouse.click.point.y - 25,
    +                                       w: 125, h: 125,
    +                                       r: 180, g: 0, b: 0, a: 180 }
         elsif !args.state.box_collision_two
    -      args.state.box_collision_two = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125,   0, 0, 180, 180]
    +      args.state.box_collision_two = { x: args.inputs.mouse.click.point.x - 25,
    +                                       y: args.inputs.mouse.click.point.y - 25,
    +                                       w: 125, h: 125,
    +                                       r: 0, g: 0, b: 180, a: 180 }
         else
           args.state.box_collision_one = nil
           args.state.box_collision_two = nil
    @@ -4994,15 +4385,11 @@ def tick args
     end
     
     def small_label args, x, row, message
    -  [x, row_to_px(args, row), message, small_font]
    -end
    -
    -def small_font
    -  [-2, 0, 0, 0, 0, 255]
    +  { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
     end
     
     def row_to_px args, row_number
    -  args.grid.top.shift_down(5).shift_down(20 * row_number)
    +  args.grid.top - 5 - (20 * row_number)
     end
     
     def tick_instructions args, text, y = 715
    @@ -5020,7 +4407,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Input Basics - Controller - main.rb

    +

    Input Basics - Controller - main.rb

    # ./samples/02_input_basics/05_controller/app/main.rb
     =begin
     
    @@ -5066,57 +4453,51 @@ class ControllerDemo
       def process_inputs
         state.buttons = []
     
    -    state.buttons << [100, 500, inputs.controller_one.key_held.l1, "L1"]
    -    state.buttons << [100, 600, inputs.controller_one.key_held.l2, "L2"]
    -
    -    state.buttons << [1100, 500, inputs.controller_one.key_held.r1, "R1"]
    -    state.buttons << [1100, 600, inputs.controller_one.key_held.r2, "R2"]
    -
    -    state.buttons << [540, 450, inputs.controller_one.key_held.select, "Select"]
    -    state.buttons << [660, 450, inputs.controller_one.key_held.start, "Start"]
    -
    -    state.buttons << [200, 300, inputs.controller_one.key_held.left, "Left"]
    -    state.buttons << [300, 400, inputs.controller_one.key_held.up, "Up"]
    -    state.buttons << [400, 300, inputs.controller_one.key_held.right, "Right"]
    -    state.buttons << [300, 200, inputs.controller_one.key_held.down, "Down"]
    -
    -    state.buttons << [800, 300, inputs.controller_one.key_held.x, "X"]
    -    state.buttons << [900, 400, inputs.controller_one.key_held.y, "Y"]
    -    state.buttons << [1000, 300, inputs.controller_one.key_held.a, "A"]
    -    state.buttons << [900, 200, inputs.controller_one.key_held.b, "B"]
    -
    -    state.buttons << [450 + inputs.controller_one.left_analog_x_perc * 100,
    -                      100 + inputs.controller_one.left_analog_y_perc * 100,
    -                      inputs.controller_one.key_held.l3,
    -                      "L3"]
    -
    -    state.buttons << [750 + inputs.controller_one.right_analog_x_perc * 100,
    -                      100 + inputs.controller_one.right_analog_y_perc * 100,
    -                      inputs.controller_one.key_held.r3,
    -                      "R3"]
    +    state.buttons << { x: 100,  y: 500, active: inputs.controller_one.key_held.l1, text: "L1"}
    +    state.buttons << { x: 100,  y: 600, active: inputs.controller_one.key_held.l2, text: "L2"}
    +    state.buttons << { x: 1100, y: 500, active: inputs.controller_one.key_held.r1, text: "R1"}
    +    state.buttons << { x: 1100, y: 600, active: inputs.controller_one.key_held.r2, text: "R2"}
    +    state.buttons << { x: 540,  y: 450, active: inputs.controller_one.key_held.select, text: "Select"}
    +    state.buttons << { x: 660,  y: 450, active: inputs.controller_one.key_held.start, text: "Start"}
    +    state.buttons << { x: 200,  y: 300, active: inputs.controller_one.key_held.left, text: "Left"}
    +    state.buttons << { x: 300,  y: 400, active: inputs.controller_one.key_held.up, text: "Up"}
    +    state.buttons << { x: 400,  y: 300, active: inputs.controller_one.key_held.right, text: "Right"}
    +    state.buttons << { x: 300,  y: 200, active: inputs.controller_one.key_held.down, text: "Down"}
    +    state.buttons << { x: 800,  y: 300, active: inputs.controller_one.key_held.x, text: "X"}
    +    state.buttons << { x: 900,  y: 400, active: inputs.controller_one.key_held.y, text: "Y"}
    +    state.buttons << { x: 1000, y: 300, active: inputs.controller_one.key_held.a, text: "A"}
    +    state.buttons << { x: 900,  y: 200, active: inputs.controller_one.key_held.b, text: "B"}
    +    state.buttons << { x: 450 + inputs.controller_one.left_analog_x_perc * 100,
    +                       y: 100 + inputs.controller_one.left_analog_y_perc * 100,
    +                       active: inputs.controller_one.key_held.l3,
    +                       text: "L3" }
    +    state.buttons << { x: 750 + inputs.controller_one.right_analog_x_perc * 100,
    +                       y: 100 + inputs.controller_one.right_analog_y_perc * 100,
    +                       active: inputs.controller_one.key_held.r3,
    +                       text: "R3" }
       end
     
       # Gives each button a square shape.
       # If the button is being pressed or held (which means it is considered active),
       # the square is filled in. Otherwise, the button simply has a border.
       def render
    -    state.buttons.each do |x, y, active, text|
    -      rect = [x, y, 75, 75]
    +    state.buttons.each do |b|
    +      rect = { x: b.x, y: b.y, w: 75, h: 75 }
     
    -      if active # if button is pressed
    +      if b.active # if button is pressed
             outputs.solids << rect # rect is output as solid (filled in)
           else
             outputs.borders << rect # otherwise, output as border
           end
     
           # Outputs the text of each button using labels.
    -      outputs.labels << [x, y + 95, text] # add 95 to place label above button
    +      outputs.labels << { x: b.x, y: b.y + 95, text: b.text } # add 95 to place label above button
         end
     
    -    outputs.labels << [10, 60, "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)"]
    -    outputs.labels << [10, 30, "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)"]
    -    outputs.labels << [900, 60, "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)"]
    -    outputs.labels << [900, 30, "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)"]
    +    outputs.labels << { x:  10, y: 60, text: "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)" }
    +    outputs.labels << { x:  10, y: 30, text: "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)" }
    +    outputs.labels << { x: 900, y: 60, text: "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)" }
    +    outputs.labels << { x: 900, y: 30, text: "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)" }
       end
     end
     
    @@ -5150,7 +4531,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Input Basics - Touch - main.rb

    +

    Input Basics - Touch - main.rb

    # ./samples/02_input_basics/06_touch/app/main.rb
     def tick args
       args.outputs.background_color = [ 0, 0, 0 ]
    @@ -5165,10 +4546,12 @@ def tick args
       #  the next new touch will be finger_one again, but until then, new touches
       #  don't fill in earlier slots.
       if !args.inputs.finger_one.nil?
    -    args.outputs.primitives << [640, 650, "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).", 5, 1, 255, 255, 255].label
    +    args.outputs.primitives << { x: 640, y: 650, text: "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).",
    +                                 size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
       end
       if !args.inputs.finger_two.nil?
    -    args.outputs.primitives << [640, 600, "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).", 5, 1, 255, 255, 255].label
    +    args.outputs.primitives << { x: 640, y: 600, text: "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).",
    +                                 size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
       end
     
       # Here's the more flexible interface: this will report as many simultaneous
    @@ -5189,14 +4572,13 @@ def tick args
         r = (color & 0xFF0000) >> 16
         g = (color & 0x00FF00) >> 8
         b = (color & 0x0000FF)
    -    args.outputs.primitives << [v.x - (size / 2), v.y + (size / 2), size, size, r, g, b, 255].solid
    -    args.outputs.primitives << [v.x, v.y + size, k.to_s, 0, 1, 0, 0, 0].label
    +    args.outputs.primitives << { x: v.x - (size / 2), y: v.y + (size / 2), w: size, h: size, r: r, g: g, b: b, a: 255 }.solid!
    +    args.outputs.primitives << { x: v.x, y: v.y + size, text: k.to_s, alignment_enum: 1 }.label!
       }
     end
     
    -
     
    -

    Rendering Sprites - Animation Using Separate Pngs - main.rb

    +

    Rendering Sprites - Animation Using Separate Pngs - main.rb

    # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb
     =begin
     
    @@ -5231,6 +4613,8 @@ end
     # in this tick "entry point": `looping_animation`, and the
     # second method is `one_time_animation`.
     def tick args
    +  # uncomment the line below to see animation play out in slow motion
    +  # args.gtk.slowmo! 6
       looping_animation args
       one_time_animation args
     end
    @@ -5263,22 +4647,22 @@ def looping_animation args
                                                   does_sprite_loop
     
       # Now that we have `sprite_index, we can present the correct file.
    -  args.outputs.sprites << [100, 100, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    +  args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
     
       # Try changing the numbers below to see how the animation changes:
    -  args.outputs.sprites << [100, 200, 100, 100, "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png"]
    +  args.outputs.sprites << { x: 100, y: 200, w: 100, h: 100, path: "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png" }
     end
     
     # This function shows how to animate a sprite that executes
     # only once when the "f" key is pressed.
     def one_time_animation args
       # This is just a label the shows instructions within the game.
    -  args.outputs.labels << [220, 350, "(press f to animate)"]
    +  args.outputs.labels <<  { x: 220, y: 350, text: "(press f to animate)" }
     
       # If "f" is pressed on the keyboard...
       if args.inputs.keyboard.key_down.f
         # Print the frame that "f" was pressed on.
    -    puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.inputs.keyboard.key_down.f}"
    +    puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.state.tick_count}"
     
         # And MOST IMPORTANTLY set the point it time to start the animation,
         # equal to "now" which is represented as args.state.tick_count.
    @@ -5311,7 +4695,7 @@ def one_time_animation args
       sprite_index ||= 0
     
       # Present the sprite.
    -  args.outputs.sprites << [100, 300, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    +  args.outputs.sprites << { x: 100, y: 300, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
     
       tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."
     end
    @@ -5331,7 +4715,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Rendering Sprites - Animation Using Sprite Sheet - main.rb

    +

    Rendering Sprites - Animation Using Sprite Sheet - main.rb

    # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb
     def tick args
       args.state.player.x ||= 100
    @@ -5433,7 +4817,7 @@ def running_sprite args
     end
     
     
    -

    Rendering Sprites - Animation States - main.rb

    +

    Rendering Sprites - Animation States - main.rb

    # ./samples/03_rendering_sprites/03_animation_states/app/main.rb
     class Game
       attr_gtk
    @@ -5620,7 +5004,7 @@ end
     $gtk.reset
     
     
    -

    Rendering Sprites - Color And Rotation - main.rb

    +

    Rendering Sprites - Color And Rotation - main.rb

    # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb
     =begin
      APIs listing that haven't been encountered in previous sample apps:
    @@ -5850,7 +5234,7 @@ def source_rect state
     end
     
     
    -

    Physics And Collisions - Simple - main.rb

    +

    Physics And Collisions - Simple - main.rb

    # ./samples/04_physics_and_collisions/01_simple/app/main.rb
     =begin
     
    @@ -5962,7 +5346,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Physics And Collisions - Moving Objects - main.rb

    +

    Physics And Collisions - Moving Objects - main.rb

    # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb
     =begin
     
    @@ -6266,7 +5650,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Physics And Collisions - Entities - main.rb

    +

    Physics And Collisions - Entities - main.rb

    # ./samples/04_physics_and_collisions/03_entities/app/main.rb
     =begin
     
    @@ -6421,7 +5805,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Physics And Collisions - Box Collision - main.rb

    +

    Physics And Collisions - Box Collision - main.rb

    # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb
     =begin
     
    @@ -6762,7 +6146,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Physics And Collisions - Box Collision 2 - main.rb

    +

    Physics And Collisions - Box Collision 2 - main.rb

    # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb
     =begin
      APIs listing that haven't been encountered in previous sample apps:
    @@ -7236,7 +6620,7 @@ def tick args
     end
     
     
    -

    Physics And Collisions - Box Collision 3 - main.rb

    +

    Physics And Collisions - Box Collision 3 - main.rb

    # ./samples/04_physics_and_collisions/06_box_collision_3/app/main.rb
     class Game
       attr_gtk
    @@ -7286,9 +6670,9 @@ class Game
         mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode
     
         if state.mouse_held
    -      outputs.primitives << mouse_overlay.border
    +      outputs.primitives << mouse_overlay.border!
         else
    -      outputs.primitives << mouse_overlay.solid
    +      outputs.primitives << mouse_overlay.solid!
         end
       end
     
    @@ -7495,7 +6879,7 @@ def tick args
     end
     
     
    -

    Physics And Collisions - Jump Physics - main.rb

    +

    Physics And Collisions - Jump Physics - main.rb

    # ./samples/04_physics_and_collisions/07_jump_physics/app/main.rb
     =begin
     
    @@ -7695,7 +7079,7 @@ def tick args
     end
     
     
    -

    Physics And Collisions - Bouncing On Collision - ball.rb

    +

    Physics And Collisions - Bouncing On Collision - ball.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb
     GRAVITY = -0.08
     
    @@ -7786,7 +7170,7 @@ class Ball
       end
     
     
    -

    Physics And Collisions - Bouncing On Collision - block.rb

    +

    Physics And Collisions - Bouncing On Collision - block.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
     DEGREES_TO_RADIANS = Math::PI / 180
     
    @@ -7949,7 +7333,7 @@ class Block
     end
     
     
    -

    Physics And Collisions - Bouncing On Collision - cannon.rb

    +

    Physics And Collisions - Bouncing On Collision - cannon.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb
     class Cannon
       def initialize args
    @@ -7973,7 +7357,7 @@ class Cannon
     end
     
     
    -

    Physics And Collisions - Bouncing On Collision - main.rb

    +

    Physics And Collisions - Bouncing On Collision - main.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
     INFINITY= 10**10
     
    @@ -8094,7 +7478,7 @@ def tick args
     end
     
     
    -

    Physics And Collisions - Bouncing On Collision - peg.rb

    +

    Physics And Collisions - Bouncing On Collision - peg.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb
     class Peg
       def initialize(x, y, block_size)
    @@ -8280,7 +7664,7 @@ class Peg
     end
     
     
    -

    Physics And Collisions - Bouncing On Collision - vector2d.rb

    +

    Physics And Collisions - Bouncing On Collision - vector2d.rb

    # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb
     class Vector2d
         attr_accessor :x, :y
    @@ -8332,7 +7716,7 @@ class Vector2d
         end
       end
     
    -

    Physics And Collisions - Arbitrary Collision - ball.rb

    +

    Physics And Collisions - Arbitrary Collision - ball.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/ball.rb
     
     class Ball
    @@ -8502,7 +7886,7 @@ class Ball
       end
     
     
    -

    Physics And Collisions - Arbitrary Collision - blocks.rb

    +

    Physics And Collisions - Arbitrary Collision - blocks.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/blocks.rb
     MAX_COUNT=100
     
    @@ -9124,7 +8508,7 @@ class Line
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - linear_collider.rb

    +

    Physics And Collisions - Arbitrary Collision - linear_collider.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb
     
     COLLISIONWIDTH=8
    @@ -9308,7 +8692,7 @@ class LinearCollider
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - main.rb

    +

    Physics And Collisions - Arbitrary Collision - main.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/main.rb
     INFINITY= 10**10
     MAX_VELOCITY = 8.0
    @@ -9483,7 +8867,7 @@ def tick args
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - paddle.rb

    +

    Physics And Collisions - Arbitrary Collision - paddle.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb
     class Paddle
       attr_accessor :enabled
    @@ -9540,7 +8924,7 @@ class Paddle
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - rectangle.rb

    +

    Physics And Collisions - Arbitrary Collision - rectangle.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/rectangle.rb
     class Rectangle
       def initialize args
    @@ -9634,7 +9018,7 @@ class Rectangle
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - square_collider.rb

    +

    Physics And Collisions - Arbitrary Collision - square_collider.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/square_collider.rb
     
     class SquareCollider
    @@ -9667,7 +9051,7 @@ class SquareCollider
     end
     
     
    -

    Physics And Collisions - Arbitrary Collision - vector2d.rb

    +

    Physics And Collisions - Arbitrary Collision - vector2d.rb

    # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/vector2d.rb
     class Vector2d
         attr_accessor :x, :y
    @@ -9719,779 +9103,1407 @@ class Vector2d
         end
       end
     
    -

    Physics And Collisions - Collision With Object Removal - ball.rb

    +

    Physics And Collisions - Collision With Object Removal - ball.rb

    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/ball.rb
     class Ball
       #TODO limit accessors?
       attr_accessor :xy, :width, :height, :velocity
     
     
    -  #@xy [Vector2d] x,y position
    -  #@velocity [Vector2d] velocity of ball
    -  def initialize
    -    @xy = Vector2d.new(WIDTH/2,500)
    -    @velocity = Vector2d.new(4,-4)
    -    @width =  20
    -    @height = 20
    +  #@xy [Vector2d] x,y position
    +  #@velocity [Vector2d] velocity of ball
    +  def initialize
    +    @xy = Vector2d.new(WIDTH/2,500)
    +    @velocity = Vector2d.new(4,-4)
    +    @width =  20
    +    @height = 20
    +  end
    +
    +  #move the ball according to its velocity
    +  def update args
    +    @xy.x+=@velocity.x
    +    @xy.y+=@velocity.y
    +  end
    +
    +  #render the ball to the screen
    +  def render args
    +    args.outputs.solids << [@xy.x,@xy.y,@width,@height,255,0,255];
    +    #args.outputs.labels << [20,HEIGHT-50,"velocity: " +@velocity.x.to_s+","+@velocity.y.to_s + "   magnitude:" + @velocity.mag.to_s]
    +  end
    +
    +  def rect
    +    [@xy.x,@xy.y,@width,@height]
    +  end
    +
    +end
    +
    +
    +

    Physics And Collisions - Collision With Object Removal - linear_collider.rb

    +
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/linear_collider.rb
    +#The LinearCollider (theoretically) produces collisions upon a line segment defined point.y two x,y cordinates
    +
    +class LinearCollider
    +
    +  #start [Array of length 2] start of the line segment as a x,y cordinate
    +  #last [Array of length 2] end of the line segment as a x,y cordinate
    +
    +  #inorder for the LinearCollider to be functional the line segment must be said to have a thickness
    +  #(as it is unlikly that a colliding object will land exactly on the linesegment)
    +
    +  #extension defines if the line's thickness extends negatively or positively
    +  #extension :pos     extends positively
    +  #extension :neg     extends negatively
    +
    +  #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)
    +  def initialize (pointA, pointB, extension=:neg, thickness=10)
    +    @pointA = pointA
    +    @pointB = pointB
    +    @thickness = thickness
    +    @extension = extension
    +
    +    @pointAExtended={
    +      x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    +      y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    +    }
    +    @pointBExtended={
    +      x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    +      y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    +    }
    +
    +  end
    +
    +  def resetPoints(pointA,pointB)
    +    @pointA = pointA
    +    @pointB = pointB
    +
    +    @pointAExtended={
    +      x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    +      y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    +    }
    +    @pointBExtended={
    +      x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    +      y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    +    }
    +  end
    +
    +  #TODO: Ugly function
    +  def slope (pointA, pointB)
    +    return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)
    +  end
    +
    +  #TODO: Ugly function
    +  def intercept(pointA, pointB)
    +    if (slope(pointA, pointB) == INFINITY)
    +      -INFINITY
    +    elsif slope(pointA, pointB) == -1*INFINITY
    +      INFINITY
    +    else
    +      pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)
    +    end
    +  end
    +
    +  def calcY(pointA, pointB, x)
    +    return slope(pointA, pointB)*x + intercept(pointA, pointB)
    +  end
    +
    +  #test if a collision has occurred
    +  def isCollision? (point)
    +    #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test
    +    if slope(@pointA, @pointB) ==  INFINITY &&
    +      point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    +      point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    +      point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    +        return true
    +    end
    +
    +    isNegInLine   = @extension == :neg &&
    +                    point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +                    point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +    isPosInLine   = @extension == :pos &&
    +                    point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +                    point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +    isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    +                    point.x <= [@pointA.x,@pointB.x].max &&
    +                    point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    +                    point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
    +
    +    return isInBoxBounds && (isNegInLine || isPosInLine)
    +
    +  end
    +
    +  def getRepelMagnitude (fbx, fby, vrx, vry, args)
    +    a = fbx ; b = vrx ; c = fby
    +    d = vry ; e = args.state.ball.velocity.mag
    +
    +    if b**2 + d**2 == 0
    +      puts "magnitude error"
    +    end
    +
    +    x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    +    x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    +    return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
    +  end
    +
    +  def update args
    +    #each of the four points on the square ball - NOTE simple to extend to a circle
    +    points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    +              {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    +              {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    +              {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    +            ]
    +
    +    #for each point p in points
    +    for point in points
    +      #isCollision.md has more information on this section
    +      #TODO: section can certainly be simplifyed
    +      if isCollision?(point)
    +        u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
    +
    +        #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    +        previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    +        choiceA = (u.mult(1))
    +        choiceB =  (u.mult(-1))
    +        vectorRepel = nil
    +
    +        if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    +          choiceA, choiceB = choiceB, choiceA
    +        end
    +        vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
    +
    +        #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    +        if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    +          vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    +        end
    +        #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    +        #vectorRepel now has the repeling force
    +
    +        mag = args.state.ball.velocity.mag
    +        theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    +        theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    +        #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    +
    +        fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    +        fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +
    +        repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +
    +        frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    +        fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +
    +        fsumx = fbx+frx #sum of x forces
    +        fsumy = fby+fry #sum of y forces
    +        fr = mag#fr is the resulting magnitude
    +        thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    +        xnew = fr*Math.cos(thetaNew) #resulting x velocity
    +        ynew = fr*Math.sin(thetaNew) #resulting y velocity
    +
    +        args.state.ball.velocity = Vector2d.new(xnew,ynew)
    +        #args.state.ball.xy.add(args.state.ball.velocity)
    +        break #no need to check the other points ?
    +      else
    +      end
    +    end
    +  end #end update
    +
    +end
    +
    +
    +

    Physics And Collisions - Collision With Object Removal - main.rb

    +
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    +# coding: utf-8
    +INFINITY= 10**10
    +WIDTH=1280
    +HEIGHT=720
    +
    +require 'app/vector2d.rb'
    +require 'app/paddle.rb'
    +require 'app/ball.rb'
    +require 'app/linear_collider.rb'
    +
    +#Method to init default values
    +def defaults args
    +  args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    +  args.state.bricks ||= []
    +  args.state.num_bricks ||= 0
    +  args.state.game_over_at ||= 0
    +  args.state.paddle ||= Paddle.new
    +  args.state.ball   ||= Ball.new
    +  args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    +  args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    +  args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    +  args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
    +
    +  #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    +end
    +
    +#Render loop
    +def render args
    +  render_instructions args
    +  render_board args
    +  render_bricks args
    +end
    +
    +begin :render_methods
    +  #Method to display the instructions of the game
    +  def render_instructions args
    +    args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    +  end
    +
    +  def render_board args
    +    args.outputs.borders << args.state.game_board
    +  end
    +
    +  def render_bricks args
    +    args.outputs.solids << args.state.bricks.map(&:rect)
    +  end
    +end
    +
    +#Calls all methods necessary for performing calculations
    +def calc args
    +  add_new_bricks args
    +  reset_game args
    +  calc_collision args
    +  win_game args
    +
    +  args.state.westWall.update args
    +  args.state.eastWall.update args
    +  args.state.southWall.update args
    +  args.state.northWall.update args
    +  args.state.paddle.update args
    +  args.state.ball.update args
    +
    +  #args.state.testWall.update args
    +
    +  args.state.paddle.render args
    +  args.state.ball.render args
    +end
    +
    +begin :calc_methods
    +  def add_new_bricks args
    +    return if args.state.num_bricks > 40
    +
    +    #Width of the game board is 640px
    +    brick_width = (args.grid.w / 2) / 10
    +    brick_height = brick_width / 2
    +
    +    (4).map_with_index do |y|
    +      #Make a box that is 10 bricks wide and 4 bricks tall
    +      args.state.bricks += (10).map_with_index do |x|
    +        args.state.new_entity(:brick) do |b|
    +          b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    +          b.y = args.grid.h - ((y + 1) * brick_height)
    +          b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
    +
    +          #Add linear colliders to the brick
    +          b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    +          b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    +          b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    +          b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
    +
    +          # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    +          # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +          # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    +          # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
    +
    +          b.broken = false
    +
    +          args.state.num_bricks += 1
    +        end
    +      end
    +    end
    +  end
    +
    +  def reset_game args
    +    if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    +      #Freeze the ball
    +      args.state.ball.velocity.x = 0
    +      args.state.ball.velocity.y = 0
    +      #Freeze the paddle
    +      args.state.paddle.enabled = false
    +
    +      args.state.game_over_at = args.state.tick_count
    +    end
    +
    +    if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    +      #Display a "Game over" message
    +      args.outputs.labels << [100, 100, "GAME OVER", 10]
    +    end
    +
    +    #If 60 frames have passed since the game ended, restart the game
    +    if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    +      # FIXME: only put value types in state
    +      args.state.ball = Ball.new
    +
    +      # FIXME: only put value types in state
    +      args.state.paddle = Paddle.new
    +
    +      args.state.bricks = []
    +      args.state.num_bricks = 0
    +    end
    +  end
    +
    +  def calc_collision args
    +    #Remove the brick if it is hit with the ball
    +    ball = args.state.ball
    +    ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
    +
    +    #Loop through each brick to see if the ball is colliding with it
    +    args.state.bricks.each do |b|
    +      if b.rect.intersect_rect?(ball_rect)
    +        #Run the linear collider for the brick if there is a collision
    +        b[:collider_bottom].update args
    +        b[:collider_right].update args
    +        b[:collider_left].update args
    +        b[:collider_top].update args
    +
    +        b.broken = true
    +      end
    +    end
    +
    +    args.state.bricks = args.state.bricks.reject(&:broken)
    +  end
    +
    +  def win_game args
    +    if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    +      #Freeze the ball
    +      args.state.ball.velocity.x = 0
    +      args.state.ball.velocity.y = 0
    +      #Freeze the paddle
    +      args.state.paddle.enabled = false
    +
    +      args.state.game_over_at = args.state.tick_count
    +    end
    +
    +    if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    +      #Display a "Game over" message
    +      args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    +    end
    +  end
    +
    +end
    +
    +def tick args
    +  defaults args
    +  render args
    +  calc args
    +
    +  #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +
    +  #$tc+=1
    +  #if $tc == 5
    +    #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    +    #$tc = 0
    +  #end
    +  #for t in $train
    +
    +    #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    +  #end
    +end
    +
    +
    +

    Physics And Collisions - Collision With Object Removal - paddle.rb

    +
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
    +class Paddle
    +  attr_accessor :enabled
    +
    +  def initialize ()
    +    @x=WIDTH/2
    +    @y=100
    +    @width=100
    +    @height=20
    +    @speed=10
    +
    +    @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +    @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +    @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +    @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +
    +    @enabled = true
    +  end
    +
    +  def update args
    +    @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +    @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    +    @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +    @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +
    +    @xyCollision.update  args
    +    @xyCollision2.update args
    +    @xyCollision3.update args
    +    @xyCollision4.update args
    +
    +    args.inputs.keyboard.key_held.left  ||= false
    +    args.inputs.keyboard.key_held.right  ||= false
    +
    +    if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    +      if args.inputs.keyboard.key_held.left && @enabled
    +        @x-=@speed
    +      elsif args.inputs.keyboard.key_held.right && @enabled
    +        @x+=@speed
    +      end
    +    end
    +
    +    xmin =WIDTH/4
    +    xmax = 3*(WIDTH/4)
    +    @x = (@x+@width > xmax) ? xmax-@width : (@x
    +

    Physics And Collisions - Collision With Object Removal - tests.rb

    +
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/tests.rb
    +# For advanced users:
    +# You can put some quick verification tests here, any method
    +# that starts with the `test_` will be run when you save this file.
    +
    +# Here is an example test and game
    +
    +# To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
    +
    +class MySuperHappyFunGame
    +  attr_gtk
    +
    +  def tick
    +    outputs.solids << [100, 100, 300, 300]
    +  end
    +end
    +
    +def test_universe args, assert
    +  game = MySuperHappyFunGame.new
    +  game.args = args
    +  game.tick
    +  assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    +  assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    +  puts "test_universe completed successfully"
    +end
    +
    +puts "running tests"
    +$gtk.reset 100
    +$gtk.log_level = :off
    +$gtk.tests.start
    +
    +
    +

    Physics And Collisions - Collision With Object Removal - vector2d.rb

    +
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/vector2d.rb
    +
    +class Vector2d
    +  attr_accessor :x, :y
    +
    +  def initialize x=0, y=0
    +    @x=x
    +    @y=y
    +  end
    +
    +  #returns a vector multiplied by scalar x
    +  #x [float] scalar
    +  def mult x
    +    r = Vector2d.new(0,0)
    +    r.x=@x*x
    +    r.y=@y*x
    +    r
    +  end
    +
    +  # vect [Vector2d] vector to copy
    +  def copy vect
    +    Vector2d.new(@x, @y)
    +  end
    +
    +  #returns a new vector equivalent to this+vect
    +  #vect [Vector2d] vector to add to self
    +  def add vect
    +    Vector2d.new(@x+vect.x,@y+vect.y)
       end
     
    -  #move the ball according to its velocity
    -  def update args
    -    @xy.x+=@velocity.x
    -    @xy.y+=@velocity.y
    +  #returns a new vector equivalent to this-vect
    +  #vect [Vector2d] vector to subtract to self
    +  def sub vect
    +    Vector2d.new(@x-vect.c, @y-vect.y)
       end
     
    -  #render the ball to the screen
    -  def render args
    -    args.outputs.solids << [@xy.x,@xy.y,@width,@height,255,0,255];
    -    #args.outputs.labels << [20,HEIGHT-50,"velocity: " +@velocity.x.to_s+","+@velocity.y.to_s + "   magnitude:" + @velocity.mag.to_s]
    +  #return the magnitude of the vector
    +  def mag
    +    ((@x**2)+(@y**2))**0.5
       end
     
    -  def rect
    -    [@xy.x,@xy.y,@width,@height]
    +  #returns a new normalize version of the vector
    +  def normalize
    +    Vector2d.new(@x/mag, @y/mag)
       end
     
    +  #TODO delet?
    +  def distABS vect
    +    (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +  end
     end
     
     
    -

    Physics And Collisions - Collision With Object Removal - linear_collider.rb

    -
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/linear_collider.rb
    -#The LinearCollider (theoretically) produces collisions upon a line segment defined point.y two x,y cordinates
    +

    Mouse - Mouse Click - main.rb

    +
    # ./samples/05_mouse/01_mouse_click/app/main.rb
    +=begin
     
    -class LinearCollider
    + APIs listing that haven't been encountered in previous sample apps:
     
    -  #start [Array of length 2] start of the line segment as a x,y cordinate
    -  #last [Array of length 2] end of the line segment as a x,y cordinate
    + - product: Returns an array of all combinations of elements from all arrays.
     
    -  #inorder for the LinearCollider to be functional the line segment must be said to have a thickness
    -  #(as it is unlikly that a colliding object will land exactly on the linesegment)
    +   For example, [1,2].product([1,2]) would return the following array...
    +   [[1,1], [1,2], [2,1], [2,2]]
    +   More than two arrays can be given to product and it will still work,
    +   such as [1,2].product([1,2],[3,4]). What would product return in this case?
     
    -  #extension defines if the line's thickness extends negatively or positively
    -  #extension :pos     extends positively
    -  #extension :neg     extends negatively
    +   Answer:
    +   [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[2,1,3],[2,1,4],[2,2,3],[2,2,4]]
     
    -  #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)
    -  def initialize (pointA, pointB, extension=:neg, thickness=10)
    -    @pointA = pointA
    -    @pointB = pointB
    -    @thickness = thickness
    -    @extension = extension
    + - num1.fdiv(num2): Returns the float division (will have a decimal) of the two given numbers.
    +   For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
     
    -    @pointAExtended={
    -      x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -      y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -    }
    -    @pointBExtended={
    -      x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -      y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -    }
    + - yield: Allows you to call a method with a code block and yield to that block.
     
    -  end
    + Reminders:
     
    -  def resetPoints(pointA,pointB)
    -    @pointA = pointA
    -    @pointB = pointB
    + - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
     
    -    @pointAExtended={
    -      x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -      y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -    }
    -    @pointBExtended={
    -      x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -      y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -    }
    -  end
    + - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +   as Ruby code, and the placeholder is replaced with its corresponding value or result.
     
    -  #TODO: Ugly function
    -  def slope (pointA, pointB)
    -    return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)
    -  end
    + - args.inputs.mouse.click: This property will be set if the mouse was clicked.
     
    -  #TODO: Ugly function
    -  def intercept(pointA, pointB)
    -    if (slope(pointA, pointB) == INFINITY)
    -      -INFINITY
    -    elsif slope(pointA, pointB) == -1*INFINITY
    -      INFINITY
    -    else
    -      pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)
    -    end
    -  end
    + - Ternary operator (?): Will evaluate a statement (just like an if statement)
    +   and perform an action if the result is true or another action if it is false.
     
    -  def calcY(pointA, pointB, x)
    -    return slope(pointA, pointB)*x + intercept(pointA, pointB)
    + - reject: Removes elements from a collection if they meet certain requirements.
    +
    + - args.outputs.borders: An array. The values generate a border.
    +   The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +   For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    +
    + - args.outputs.labels: An array. The values generate a label.
    +   The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +   For more information about labels, go to mygame/documentation/02-labels.
    +
    +=end
    +
    +# This sample app is a classic game of Tic Tac Toe.
    +
    +class TicTacToe
    +  attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk
    +
    +  # Starts the game with player x's turn and creates an array (to_a) for space combinations.
    +  # Calls methods necessary for the game to run properly.
    +  def tick
    +    state.current_turn ||= :x
    +    state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
    +    render_board
    +    input_board
       end
     
    -  #test if a collision has occurred
    -  def isCollision? (point)
    -    #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test
    -    if slope(@pointA, @pointB) ==  INFINITY &&
    -      point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    -      point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    -      point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    -        return true
    +  # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
    +  def render_board
    +    square_size = 80
    +
    +    # Positions the game's board in the center of the screen.
    +    # Try removing what follows grid.w_half or grid.h_half and see how the position changes!
    +    board_left = grid.w_half - square_size * 1.5
    +    board_top  = grid.h_half - square_size * 1.5
    +
    +    # At first glance, the add(1) looks pretty trivial. But if you remove it,
    +    # you'll see that the positioning of the board would be skewed without it!
    +    # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares
    +    # due to the change in board placement.
    +    outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces
    +      space.border ||= [
    +        board_left + x.add(1) * square_size, # space.border is initialized using this definition
    +        board_top  + y.add(1) * square_size,
    +        square_size,
    +        square_size
    +      ]
         end
     
    -    isNegInLine   = @extension == :neg &&
    -                    point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -                    point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -    isPosInLine   = @extension == :pos &&
    -                    point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -                    point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -    isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    -                    point.x <= [@pointA.x,@pointB.x].max &&
    -                    point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    -                    point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
    +    # Again, the calculations ensure that the piece is placed in the center of the grid square.
    +    # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    +    outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    +          label board_left + x.add(1) * square_size + square_size.fdiv(2),
    +          board_top  + y.add(1) * square_size + square_size - 20,
    +          space.piece # text of label, either "x" or "o"
    +    end
     
    -    return isInBoxBounds && (isNegInLine || isPosInLine)
    +    # Uses a label to output whether x or o won, or if a draw occurred.
    +    # If the game is ongoing, a label shows whose turn it currently is.
    +    outputs.labels << if state.x_won
    +                        label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    +                      elsif state.o_won
    +                        label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    +                      elsif state.draw
    +                        label grid.w_half, grid.top - 80, "a draw"
    +                      else # if no one won and the game is ongoing
    +                        label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    +                      end
    +  end
     
    +  # Calls the methods responsible for handling user input and determining the winner.
    +  # Does nothing unless the mouse is clicked.
    +  def input_board
    +    return unless inputs.mouse.click
    +    input_place_piece
    +    input_restart_game
    +    determine_winner
       end
     
    -  def getRepelMagnitude (fbx, fby, vrx, vry, args)
    -    a = fbx ; b = vrx ; c = fby
    -    d = vry ; e = args.state.ball.velocity.mag
    +  # Handles user input for placing pieces on the board.
    +  def input_place_piece
    +    return if state.game_over
     
    -    if b**2 + d**2 == 0
    -      puts "magnitude error"
    +    # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    +    # have a piece in it.
    +    __, __, space = all_spaces.find do |__, __, space|
    +      inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
         end
     
    -    x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    -    x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    -    return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
    +    # The piece that goes into the space belongs to the player whose turn it currently is.
    +    return unless space
    +    space.piece = state.current_turn
    +
    +    # This ternary operator statement allows us to change the current player's turn.
    +    # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    +    state.current_turn = state.current_turn == :x ? :o : :x
       end
     
    -  def update args
    -    #each of the four points on the square ball - NOTE simple to extend to a circle
    -    points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    -              {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    -              {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    -              {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    -            ]
    +  # Resets the game.
    +  def input_restart_game
    +    return unless state.game_over
    +    gtk.reset
    +  end
     
    -    #for each point p in points
    -    for point in points
    -      #isCollision.md has more information on this section
    -      #TODO: section can certainly be simplifyed
    -      if isCollision?(point)
    -        u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
    +  # Checks if x or o won the game.
    +  # If neither player wins and all nine squares are filled, a draw happens.
    +  # Once a player is chosen as the winner or a draw happens, the game is over.
    +  def determine_winner
    +    state.x_won = won? :x # evaluates to either true or false (boolean values)
    +    state.o_won = won? :o
    +    state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    +    state.game_over = state.x_won || state.o_won || state.draw
    +  end
     
    -        #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    -        previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    -        choiceA = (u.mult(1))
    -        choiceB =  (u.mult(-1))
    -        vectorRepel = nil
    +  # Determines if a player won by checking if there is a horizontal match or vertical match.
    +  # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    +  def won? piece
    +    # performs action on all space combinations
    +    won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
     
    -        if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    -          choiceA, choiceB = choiceB, choiceA
    -        end
    -        vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
    +      # Checks if the 3 grid spaces with the same y value (or same row) and
    +      # x values that are next to each other have pieces that belong to the same player.
    +      # Remember, the value of piece is equal to the current turn (which is the player).
    +      horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    +                         state.spaces[xs[1]][y].piece == piece &&
    +                         state.spaces[xs[2]][y].piece == piece
     
    -        #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    -        if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    -          vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    -        end
    -        #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    -        #vectorRepel now has the repeling force
    +      # Checks if the 3 grid spaces with the same x value (or same column) and
    +      # y values that are next to each other have pieces that belong to the same player.
    +      # The && represents an "and" statement: if even one part of the statement is false,
    +      # the entire statement evaluates to false.
    +      vertical_match = state.spaces[y][xs[0]].piece == piece &&
    +                       state.spaces[y][xs[1]].piece == piece &&
    +                       state.spaces[y][xs[2]].piece == piece
     
    -        mag = args.state.ball.velocity.mag
    -        theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    -        theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    -        #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    +      horizontal_match || vertical_match # if either is true, true is returned
    +    end
     
    -        fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    -        fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +    # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    +    # Is added to won regardless of whether the statement is true or false.
    +    won << (state.spaces[-1][-1].piece == piece && # bottom left
    +            state.spaces[ 0][ 0].piece == piece && # center
    +            state.spaces[ 1][ 1].piece == piece)   # top right
     
    -        repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +    # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    +    # and is added to won.
    +    won << (state.spaces[ 1][-1].piece == piece && # bottom right
    +            state.spaces[ 0][ 0].piece == piece && # center
    +            state.spaces[-1][ 1].piece == piece)   # top left
     
    -        frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    -        fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +    # Any false statements (meaning false diagonal matches) are rejected from won
    +    won.reject_false.any?
    +  end
     
    -        fsumx = fbx+frx #sum of x forces
    -        fsumy = fby+fry #sum of y forces
    -        fr = mag#fr is the resulting magnitude
    -        thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    -        xnew = fr*Math.cos(thetaNew) #resulting x velocity
    -        ynew = fr*Math.sin(thetaNew) #resulting y velocity
    +  # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    +  # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    +  # NOT have pieces in them.
    +  def filled_spaces
    +    state.space_combinations
    +      .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    +      .map do |x, y|
    +        if block_given?
    +          yield x, y, state.spaces[x][y]
    +        else
    +          [x, y, state.spaces[x][y]] # sets definition of space
    +        end
    +    end
    +  end
     
    -        args.state.ball.velocity = Vector2d.new(xnew,ynew)
    -        #args.state.ball.xy.add(args.state.ball.velocity)
    -        break #no need to check the other points ?
    -      else
    +  # Defines all spaces on the board.
    +  def all_spaces
    +    if !block_given?
    +      state.space_combinations.map do |x, y|
    +        [x, y, state.spaces[x][y]] # sets definition of space
    +      end
    +    else # if a block is given (block_given? is true)
    +      state.space_combinations.map do |x, y|
    +        yield x, y, state.spaces[x][y] # yield if a block is given
           end
         end
    -  end #end update
    +  end
     
    +  # Sets values for a label, such as the position, value, size, alignment, and color.
    +  def label x, y, value
    +    [x, y + 10, value, 20, 1, 0, 0, 0]
    +  end
     end
     
    -
    -

    Physics And Collisions - Collision With Object Removal - main.rb

    -
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    -# coding: utf-8
    -INFINITY= 10**10
    -WIDTH=1280
    -HEIGHT=720
    +$tic_tac_toe = TicTacToe.new
     
    -require 'app/vector2d.rb'
    -require 'app/paddle.rb'
    -require 'app/ball.rb'
    -require 'app/linear_collider.rb'
    +def tick args
    +  $tic_tac_toe._       = args
    +  $tic_tac_toe.state   = args.state
    +  $tic_tac_toe.outputs = args.outputs
    +  $tic_tac_toe.inputs  = args.inputs
    +  $tic_tac_toe.grid    = args.grid
    +  $tic_tac_toe.gtk     = args.gtk
    +  $tic_tac_toe.tick
    +  tick_instructions args, "Sample app shows how to work with mouse clicks."
    +end
     
    -#Method to init default values
    -def defaults args
    -  args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    -  args.state.bricks ||= []
    -  args.state.num_bricks ||= 0
    -  args.state.game_over_at ||= 0
    -  args.state.paddle ||= Paddle.new
    -  args.state.ball   ||= Ball.new
    -  args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    -  args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    -  args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    -  args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
    +def tick_instructions args, text, y = 715
    +  return if args.state.key_event_occurred
    +  if args.inputs.mouse.click ||
    +     args.inputs.keyboard.directional_vector ||
    +     args.inputs.keyboard.key_down.enter ||
    +     args.inputs.keyboard.key_down.escape
    +    args.state.key_event_occurred = true
    +  end
     
    -  #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    +  args.outputs.debug << [0, y - 50, 1280, 60].solid
    +  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
     end
     
    -#Render loop
    -def render args
    -  render_instructions args
    -  render_board args
    -  render_bricks args
    -end
    +
    +

    Mouse - Mouse Move - main.rb

    +
    # ./samples/05_mouse/02_mouse_move/app/main.rb
    +=begin
     
    -begin :render_methods
    -  #Method to display the instructions of the game
    -  def render_instructions args
    -    args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    -  end
    + Reminders:
     
    -  def render_board args
    -    args.outputs.borders << args.state.game_board
    -  end
    + - num1.greater(num2): Returns the greater value.
    +   For example, if we have the command
    +   puts 4.greater(3)
    +   the number 4 would be printed to the console since it has a greater value than 3.
    +   Similar to lesser, which returns the lesser value.
     
    -  def render_bricks args
    -    args.outputs.solids << args.state.bricks.map(&:rect)
    -  end
    -end
    + - find_all: Finds all elements of a collection that meet certain requirements.
    +   For example, in this sample app, we're using find_all to find all zombies that have intersected
    +   or hit the player's sprite since these zombies have been killed.
     
    -#Calls all methods necessary for performing calculations
    -def calc args
    -  add_new_bricks args
    -  reset_game args
    -  calc_collision args
    -  win_game args
    + - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    +   Stores the frame the "down" event occurred.
    +   For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
     
    -  args.state.westWall.update args
    -  args.state.eastWall.update args
    -  args.state.southWall.update args
    -  args.state.northWall.update args
    -  args.state.paddle.update args
    -  args.state.ball.update args
    + - args.outputs.sprites: An array. The values generate a sprite.
    +   The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +   For more information about sprites, go to mygame/documentation/05-sprites.md.
     
    -  #args.state.testWall.update args
    + - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +   When we want to create a new object, we can declare it as a new entity and then define
    +   its properties. (Remember, you can use state to define ANY property and it will
    +   be retained across frames.)
     
    -  args.state.paddle.render args
    -  args.state.ball.render args
    -end
    + - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +   as Ruby code, and the placeholder is replaced with its corresponding value or result.
     
    -begin :calc_methods
    -  def add_new_bricks args
    -    return if args.state.num_bricks > 40
    + - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +   Can be used to perform an action on every element of a collection, such as multiplying
    +   each element by 2 or declaring every element as a new entity.
     
    -    #Width of the game board is 640px
    -    brick_width = (args.grid.w / 2) / 10
    -    brick_height = brick_width / 2
    + - sample: Chooses a random element from the array.
     
    -    (4).map_with_index do |y|
    -      #Make a box that is 10 bricks wide and 4 bricks tall
    -      args.state.bricks += (10).map_with_index do |x|
    -        args.state.new_entity(:brick) do |b|
    -          b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    -          b.y = args.grid.h - ((y + 1) * brick_height)
    -          b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
    + - reject: Removes elements that meet certain requirements.
    +   In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    +   rejecting zombies that were killed more than 30 frames ago.
     
    -          #Add linear colliders to the brick
    -          b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    -          b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    -          b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    -          b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
    +=end
     
    -          # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    -          # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -          # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    -          # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
    +# This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    +# is to kill the zombies as fast as possible!
    +
    +class ProtectThePuppiesFromTheZombies
    +  attr_accessor :grid, :inputs, :state, :outputs
    +
    +  # Calls the methods necessary for the game to run properly.
    +  def tick
    +    defaults
    +    render
    +    calc
    +    input
    +  end
    +
    +  # Sets default values for the zombies and for the player.
    +  # Initialization happens only in the first frame.
    +  def defaults
    +    state.flash_at               ||= 0
    +    state.zombie_min_spawn_rate  ||= 60
    +    state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    +    state.zombies                ||= []
    +    state.killed_zombies         ||= []
    +
    +    # Declares player as a new entity and sets its properties.
    +    # The player begins the game in the center of the screen, not moving in any direction.
    +    state.player ||= state.new_entity(:player, { x: 640,
    +                                               y: 360,
    +                                               attack_angle: 0,
    +                                               dx: 0,
    +                                               dy: 0 })
    +  end
     
    -          b.broken = false
    +  # Outputs a gray background.
    +  # Calls the methods needed to output the player, zombies, etc onto the screen.
    +  def render
    +    outputs.solids << [grid.rect, 100, 100, 100]
    +    render_zombies
    +    render_killed_zombies
    +    render_player
    +    render_flash
    +  end
     
    -          args.state.num_bricks += 1
    -        end
    -      end
    +  # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    +  def render_zombies
    +    outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    +      z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    +      z.sprite
         end
       end
     
    -  def reset_game args
    -    if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    -      #Freeze the ball
    -      args.state.ball.velocity.x = 0
    -      args.state.ball.velocity.y = 0
    -      #Freeze the paddle
    -      args.state.paddle.enabled = false
    -
    -      args.state.game_over_at = args.state.tick_count
    -    end
    +  # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    +  def render_killed_zombies
    +    outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    +      z.sprite = [z.x,
    +                  z.y,
    +                  4 * 3,
    +                  8 * 3,
    +                  animation_sprite(z, z.death_at), # calls animation_sprite method
    +                  0, # angle
    +                  255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    +                  # change the value of 30 and see what happens when a zombie is killed
     
    -    if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    -      #Display a "Game over" message
    -      args.outputs.labels << [100, 100, "GAME OVER", 10]
    +      # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    +      # The slash is tilted 45 degrees from the angle of the player's attack.
    +      # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    +      # the slash over the killed zombie's sprite.
    +      [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
         end
    +  end
     
    -    #If 60 frames have passed since the game ended, restart the game
    -    if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    -      # FIXME: only put value types in state
    -      args.state.ball = Ball.new
    +  # Outputs the player sprite using the images in the sprites folder.
    +  def render_player
    +    state.player_sprite = [state.player.x,
    +                           state.player.y,
    +                          4 * 3,
    +                          8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    +    outputs.sprites << state.player_sprite
     
    -      # FIXME: only put value types in state
    -      args.state.paddle = Paddle.new
    +    # Outputs a small red square that previews the angles that the player can attack in.
    +    # It can be moved in a perfect circle around the player to show possible movements.
    +    # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    +    outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    +                        state.player.y + state.player.attack_angle.vector_y(60),
    +                        3, 3, 255, 0, 0]
    +  end
     
    -      args.state.bricks = []
    -      args.state.num_bricks = 0
    -    end
    +  # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    +  def render_flash
    +    return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    +    # Transparency gradually changes (or eases) during the 10 frames of flash.
    +    outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
       end
     
    -  def calc_collision args
    -    #Remove the brick if it is hit with the ball
    -    ball = args.state.ball
    -    ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
    +  # Calls all methods necessary for performing calculations.
    +  def calc
    +    calc_spawn_zombie
    +    calc_move_zombies
    +    calc_player
    +    calc_kill_zombie
    +  end
     
    -    #Loop through each brick to see if the ball is colliding with it
    -    args.state.bricks.each do |b|
    -      if b.rect.intersect_rect?(ball_rect)
    -        #Run the linear collider for the brick if there is a collision
    -        b[:collider_bottom].update args
    -        b[:collider_right].update args
    -        b[:collider_left].update args
    -        b[:collider_top].update args
    +  # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    +  def calc_spawn_zombie
    +    if state.zombie_spawn_countdown > 0
    +      state.zombie_spawn_countdown -= 1
    +      return
    +    end
     
    -        b.broken = true
    +    # New zombies are created, positioned on the screen, and added to the zombies collection.
    +    state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    +      if rand > 0.5
    +        z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    +        z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    +        # the possible values exceed the screen's scope so zombies appear to be coming from far away
    +      else
    +        z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    +        z.y = grid.rect.w.randomize(:ratio) # random y position on screen
           end
         end
     
    -    args.state.bricks = args.state.bricks.reject(&:broken)
    +    # Calls random_spawn_countdown method (determines how fast new zombies appear)
    +    state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    +    state.zombie_min_spawn_rate -= 1
    +    # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    +    state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
       end
     
    -  def win_game args
    -    if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    -      #Freeze the ball
    -      args.state.ball.velocity.x = 0
    -      args.state.ball.velocity.y = 0
    -      #Freeze the paddle
    -      args.state.paddle.enabled = false
    -
    -      args.state.game_over_at = args.state.tick_count
    -    end
    -
    -    if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    -      #Display a "Game over" message
    -      args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    +  # Moves all zombies towards the center of the screen.
    +  # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    +  def calc_move_zombies
    +    state.zombies.each do |z| # for each zombie in the collection
    +      z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    +      z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
         end
    +    state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
       end
     
    -end
    -
    -def tick args
    -  defaults args
    -  render args
    -  calc args
    +  # Calculates the position and movement of the player on the screen.
    +  def calc_player
    +    state.player.x += state.player.dx # changes x based on dx (change in x)
    +    state.player.y += state.player.dy # changes y based on dy (change in y)
     
    -  #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +    state.player.dx *= 0.9 # scales dx down
    +    state.player.dy *= 0.9 # scales dy down
     
    -  #$tc+=1
    -  #if $tc == 5
    -    #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    -    #$tc = 0
    -  #end
    -  #for t in $train
    +    # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    +    # This ensures that the player remains within the screen's scope.
    +    state.player.x = state.player.x.lesser(1280).greater(0)
    +    state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
    +  end
     
    -    #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    -  #end
    -end
    +  # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    +  # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    +  def calc_kill_zombie
     
    -
    -

    Physics And Collisions - Collision With Object Removal - paddle.rb

    -
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
    -class Paddle
    -  attr_accessor :enabled
    +    # Find all zombies that intersect with the player. They are considered killed.
    +    killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    +    state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    +    state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
     
    -  def initialize ()
    -    @x=WIDTH/2
    -    @y=100
    -    @width=100
    -    @height=20
    -    @speed=10
    +    if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    +      state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    +    # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    +    end
     
    -    @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -    @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -    @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -    @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +    # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    +    # Death_at stores the frame a zombie was killed.
    +    killed_this_frame.each do |z|
    +      z.death_at = state.tick_count
    +    end
     
    -    @enabled = true
    +    # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    +    # They are rejected if more than 30 frames have passed since their death.
    +    state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
       end
     
    -  def update args
    -    @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -    @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    -    @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -    @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +  # Uses input from the user to move the player around the screen.
    +  def input
     
    -    @xyCollision.update  args
    -    @xyCollision2.update args
    -    @xyCollision3.update args
    -    @xyCollision4.update args
    +    # If the "a" key or left key is pressed, the x position of the player decreases.
    +    # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    +    if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    +      state.player.x -= 5
    +    elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    +      state.player.x += 5
    +    end
     
    -    args.inputs.keyboard.key_held.left  ||= false
    -    args.inputs.keyboard.key_held.right  ||= false
    +    # If the "w" or up key is pressed, the y position of the player increases.
    +    # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    +    if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    +      state.player.y += 5
    +    elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    +      state.player.y -= 5
    +    end
     
    -    if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    -      if args.inputs.keyboard.key_held.left && @enabled
    -        @x-=@speed
    -      elsif args.inputs.keyboard.key_held.right && @enabled
    -        @x+=@speed
    -      end
    +    # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    +    # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    +    # Attack angle also contributes to the position of red square.
    +    if inputs.mouse.moved
    +      state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
         end
     
    -    xmin =WIDTH/4
    -    xmax = 3*(WIDTH/4)
    -    @x = (@x+@width > xmax) ? xmax-@width : (@x
    -

    Physics And Collisions - Collision With Object Removal - tests.rb

    -
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/tests.rb
    -# For advanced users:
    -# You can put some quick verification tests here, any method
    -# that starts with the `test_` will be run when you save this file.
    +

    Mouse - Mouse Move Paint App - main.rb

    +
    # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    +=begin
     
    -# Here is an example test and game
    + APIs listing that haven't been encountered in previous sample apps:
     
    -# To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
    + - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
     
    -class MySuperHappyFunGame
    -  attr_gtk
    +   For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    +   puts a.floor()
    +   which would print out 13.
    +   (There is also a ceil method, which returns an integer number greater than or equal to the original
    +   with no decimal. If we had called ceil on the variable a, the result would have been 14.)
     
    -  def tick
    -    outputs.solids << [100, 100, 300, 300]
    -  end
    -end
    + Reminders:
     
    -def test_universe args, assert
    -  game = MySuperHappyFunGame.new
    -  game.args = args
    -  game.tick
    -  assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    -  assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    -  puts "test_universe completed successfully"
    -end
    + - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +   using their keys.
     
    -puts "running tests"
    -$gtk.reset 100
    -$gtk.log_level = :off
    -$gtk.tests.start
    +   For example, if we have a "numbers" hash that stores numbers in English as the
    +   key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +   numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +   and on it goes.
     
    -
    -

    Physics And Collisions - Collision With Object Removal - vector2d.rb

    -
    # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/vector2d.rb
    +   Now if we wanted to find the corresponding value of the "one" key, we could say
    +   puts numbers["one"]
    +   which would print "uno" to the console.
     
    -class Vector2d
    -  attr_accessor :x, :y
    + - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +   In this sample app, new_entity is used to create a new button that clears the grid.
    +   (Remember, you can use state to define ANY property and it will be retained across frames.)
     
    -  def initialize x=0, y=0
    -    @x=x
    -    @y=y
    -  end
    + - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
     
    -  #returns a vector multiplied by scalar x
    -  #x [float] scalar
    -  def mult x
    -    r = Vector2d.new(0,0)
    -    r.x=@x*x
    -    r.y=@y*x
    -    r
    -  end
    + - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
     
    -  # vect [Vector2d] vector to copy
    -  def copy vect
    -    Vector2d.new(@x, @y)
    -  end
    + - args.outputs.labels: An array. The values in the array generate a label.
    +   The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +   For more information about labels, go to mygame/documentation/02-labels.md.
     
    -  #returns a new vector equivalent to this+vect
    -  #vect [Vector2d] vector to add to self
    -  def add vect
    -    Vector2d.new(@x+vect.x,@y+vect.y)
    -  end
    + - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
     
    -  #returns a new vector equivalent to this-vect
    -  #vect [Vector2d] vector to subtract to self
    -  def sub vect
    -    Vector2d.new(@x-vect.c, @y-vect.y)
    +=end
    +
    +# This sample app shows an empty grid that the user can paint on.
    +# To paint, the user must keep their mouse presssed and drag it around the grid.
    +# The "clear" button allows users to clear the grid so they can start over.
    +
    +class PaintApp
    +  attr_accessor :inputs, :state, :outputs, :grid, :args
    +
    +  # Runs methods necessary for the game to function properly.
    +  def tick
    +    print_title
    +    add_grid
    +    check_click
    +    draw_buttons
       end
     
    -  #return the magnitude of the vector
    -  def mag
    -    ((@x**2)+(@y**2))**0.5
    +  # Prints the title onto the screen by using a label.
    +  # Also separates the title from the grid with a line as a horizontal separator.
    +  def print_title
    +    args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    +    outputs.lines << horizontal_separator(660, 0, 1280)
       end
     
    -  #returns a new normalize version of the vector
    -  def normalize
    -    Vector2d.new(@x/mag, @y/mag)
    +  # Sets the starting position, ending position, and color for the horizontal separator.
    +  # The starting and ending positions have the same y values.
    +  def horizontal_separator y, x, x2
    +    [x, y, x2, y, 150, 150, 150]
       end
     
    -  #TODO delet?
    -  def distABS vect
    -    (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +  # Sets the starting position, ending position, and color for the vertical separator.
    +  # The starting and ending positions have the same x values.
    +  def vertical_separator x, y, y2
    +    [x, y, x, y2, 150, 150, 150]
       end
    -end
     
    -
    -

    Mouse - Mouse Click - main.rb

    -
    # ./samples/05_mouse/01_mouse_click/app/main.rb
    -=begin
    +  # Outputs a border and a grid containing empty squares onto the screen.
    +  def add_grid
     
    - APIs listing that haven't been encountered in previous sample apps:
    +    # Sets the x, y, height, and width of the grid.
    +    # There are 31 horizontal lines and 31 vertical lines in the grid.
    +    # Feel free to count them yourself before continuing!
    +    x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    +    lines_h = 31
    +    lines_v = 31
     
    - - product: Returns an array of all combinations of elements from all arrays.
    +    # Sets values for the grid's border, grid lines, and filled squares.
    +    # The filled_squares variable is initially set to an empty array.
    +    state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    +    state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    +    state.filled_squares ||= [] # there are no filled squares until the user fills them in
     
    -   For example, [1,2].product([1,2]) would return the following array...
    -   [[1,1], [1,2], [2,1], [2,2]]
    -   More than two arrays can be given to product and it will still work,
    -   such as [1,2].product([1,2],[3,4]). What would product return in this case?
    +    # Outputs the grid lines, border, and filled squares onto the screen.
    +    outputs.lines.concat state.grid_lines
    +    outputs.borders << state.grid_border
    +    outputs.solids << state.filled_squares
    +  end
     
    -   Answer:
    -   [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[2,1,3],[2,1,4],[2,2,3],[2,2,4]]
    +  # Draws the grid by adding in vertical and horizontal separators.
    +  def draw_grid x, y, h, w, lines_h, lines_v
     
    - - num1.fdiv(num2): Returns the float division (will have a decimal) of the two given numbers.
    -   For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    +    # The grid starts off empty.
    +    grid = []
     
    - - yield: Allows you to call a method with a code block and yield to that block.
    +    # Calculates the placement and adds horizontal lines or separators into the grid.
    +    curr_y = y # start at the bottom of the box
    +    dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    +    lines_h.times do
    +      curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    +      grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
    +    end
     
    - Reminders:
    +    # Calculates the placement and adds vertical lines or separators into the grid.
    +    curr_x = x # now start at the left of the box
    +    dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid
    +    lines_v.times do
    +      curr_x += dist_x # increment curr_x by the distance between the vertical lines
    +      grid << vertical_separator(curr_x, y + 1, y  + h) # add separator
    +    end
     
    - - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    +    # paint_grid uses a hash to assign values to keys.
    +    state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    +                          "lines_v" => lines_v, "dist_x" => dist_x,
    +                          "dist_y" => dist_y }
     
    - - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -   as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +    return grid
    +  end
     
    - - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +  # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    +  # If the mouse is up, the user cannot drag the mouse.
    +  def check_click
    +    if inputs.mouse.down #is mouse up or down?
    +      state.mouse_held = true # mouse is being held down
    +    elsif inputs.mouse.up # if mouse is up
    +    state.mouse_held = false # mouse is not being held down or dragged
    +      state.mouse_dragging = false
    +    end
     
    - - Ternary operator (?): Will evaluate a statement (just like an if statement)
    -   and perform an action if the result is true or another action if it is false.
    +    if state.mouse_held &&    # mouse needs to be down
    +      !inputs.mouse.click &&     # must not be first click
    +      ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    +      state.mouse_dragging = true
    +    end
     
    - - reject: Removes elements from a collection if they meet certain requirements.
    +    # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    +    if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    +      search_lines(inputs.mouse.click.point, :click)
     
    - - args.outputs.borders: An array. The values generate a border.
    -   The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    -   For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    +    # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    +    elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    +      search_lines(inputs.mouse.position, :drag)
    +    end
    +  end
     
    - - args.outputs.labels: An array. The values generate a label.
    -   The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -   For more information about labels, go to mygame/documentation/02-labels.
    +  # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    +  def search_lines (point, input_type)
    +    point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    +    point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
     
    -=end
    +    # Remove code following the .floor and see what happens when you try to fill in grid squares
    +    point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    +    point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
     
    -# This sample app is a classic game of Tic Tac Toe.
    +    point.x += state.paint_grid["x"]
    +    point.y += state.paint_grid["y"]
     
    -class TicTacToe
    -  attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk
    +    # Sets definition of a grid box, meaning its x, y, width, and height.
    +    # Floor is called on the point.x and point.y variables.
    +    # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    +    grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
     
    -  # Starts the game with player x's turn and creates an array (to_a) for space combinations.
    -  # Calls methods necessary for the game to run properly.
    -  def tick
    -    state.current_turn ||= :x
    -    state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
    -    render_board
    -    input_board
    +    if input_type == :click # if user clicks their mouse
    +      if state.filled_squares.include? grid_box # if grid box is already filled in
    +        state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    +      else
    +        state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    +      end
    +    elsif input_type == :drag # if user drags mouse
    +      unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    +        state.filled_squares << grid_box # the box is filled in and added to filled_squares
    +      end
    +    end
       end
     
    -  # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
    -  def render_board
    -    square_size = 80
    +  # Creates and outputs a "Clear" button on the screen using a label and a border.
    +  # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    +  def draw_buttons
    +    x, y, w, h = 390, 50, 240, 50
    +    state.clear_button        ||= state.new_entity(:button_with_fade)
     
    -    # Positions the game's board in the center of the screen.
    -    # Try removing what follows grid.w_half or grid.h_half and see how the position changes!
    -    board_left = grid.w_half - square_size * 1.5
    -    board_top  = grid.h_half - square_size * 1.5
    +    # The x and y positions are set to display the label in the center of the button.
    +    # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    +    state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    +    state.clear_button.border ||= [x, y, w, h]
     
    -    # At first glance, the add(1) looks pretty trivial. But if you remove it,
    -    # you'll see that the positioning of the board would be skewed without it!
    -    # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares
    -    # due to the change in board placement.
    -    outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces
    -      space.border ||= [
    -        board_left + x.add(1) * square_size, # space.border is initialized using this definition
    -        board_top  + y.add(1) * square_size,
    -        square_size,
    -        square_size
    -      ]
    +    # If the mouse is clicked inside the borders of the clear button,
    +    # the filled_squares collection is emptied and the squares are cleared.
    +    if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    +      state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    +      state.filled_squares.clear
    +      inputs.mouse.previous_click = nil
         end
     
    -    # Again, the calculations ensure that the piece is placed in the center of the grid square.
    -    # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    -    outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    -          label board_left + x.add(1) * square_size + square_size.fdiv(2),
    -          board_top  + y.add(1) * square_size + square_size - 20,
    -          space.piece # text of label, either "x" or "o"
    -    end
    +    outputs.labels << state.clear_button.label
    +    outputs.borders << state.clear_button.border
     
    -    # Uses a label to output whether x or o won, or if a draw occurred.
    -    # If the game is ongoing, a label shows whose turn it currently is.
    -    outputs.labels << if state.x_won
    -                        label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    -                      elsif state.o_won
    -                        label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    -                      elsif state.draw
    -                        label grid.w_half, grid.top - 80, "a draw"
    -                      else # if no one won and the game is ongoing
    -                        label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    -                      end
    +    # When the clear button is clicked, the color of the button changes
    +    # and the transparency changes, as well. If you change the time from
    +    # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    +    if state.clear_button.clicked_at
    +      outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    +    end
       end
    +end
     
    -  # Calls the methods responsible for handling user input and determining the winner.
    -  # Does nothing unless the mouse is clicked.
    -  def input_board
    -    return unless inputs.mouse.click
    -    input_place_piece
    -    input_restart_game
    -    determine_winner
    +$paint_app = PaintApp.new
    +
    +def tick args
    +  $paint_app.inputs = args.inputs
    +  $paint_app.state = args.state
    +  $paint_app.grid = args.grid
    +  $paint_app.args = args
    +  $paint_app.outputs = args.outputs
    +  $paint_app.tick
    +  tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    +end
    +
    +def tick_instructions args, text, y = 715
    +  return if args.state.key_event_occurred
    +  if args.inputs.mouse.click ||
    +     args.inputs.keyboard.directional_vector ||
    +     args.inputs.keyboard.key_down.enter ||
    +     args.inputs.keyboard.key_down.escape
    +    args.state.key_event_occurred = true
       end
     
    -  # Handles user input for placing pieces on the board.
    -  def input_place_piece
    -    return if state.game_over
    +  args.outputs.debug << [0, y - 50, 1280, 60].solid
    +  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +end
     
    -    # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    -    # have a piece in it.
    -    __, __, space = all_spaces.find do |__, __, space|
    -      inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
    -    end
    +
    +

    Mouse - Coordinate Systems - main.rb

    +
    # ./samples/05_mouse/04_coordinate_systems/app/main.rb
    +=begin
     
    -    # The piece that goes into the space belongs to the player whose turn it currently is.
    -    return unless space
    -    space.piece = state.current_turn
    + APIs listing that haven't been encountered in previous sample apps:
     
    -    # This ternary operator statement allows us to change the current player's turn.
    -    # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    -    state.current_turn = state.current_turn == :x ? :o : :x
    -  end
    + - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    +   Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    +   position to know the mouse's coordinates.
    +   For more information about the mouse, go to mygame/documentation/07-mouse.md.
     
    -  # Resets the game.
    -  def input_restart_game
    -    return unless state.game_over
    -    gtk.reset
    -  end
    + Reminders:
     
    -  # Checks if x or o won the game.
    -  # If neither player wins and all nine squares are filled, a draw happens.
    -  # Once a player is chosen as the winner or a draw happens, the game is over.
    -  def determine_winner
    -    state.x_won = won? :x # evaluates to either true or false (boolean values)
    -    state.o_won = won? :o
    -    state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    -    state.game_over = state.x_won || state.o_won || state.draw
    -  end
    + - args.inputs.mouse.click: This property will be set if the mouse was clicked.
     
    -  # Determines if a player won by checking if there is a horizontal match or vertical match.
    -  # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    -  def won? piece
    -    # performs action on all space combinations
    -    won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
    + - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
     
    -      # Checks if the 3 grid spaces with the same y value (or same row) and
    -      # x values that are next to each other have pieces that belong to the same player.
    -      # Remember, the value of piece is equal to the current turn (which is the player).
    -      horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    -                         state.spaces[xs[1]][y].piece == piece &&
    -                         state.spaces[xs[2]][y].piece == piece
    + - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +   as Ruby code, and the placeholder is replaced with its corresponding value or result.
     
    -      # Checks if the 3 grid spaces with the same x value (or same column) and
    -      # y values that are next to each other have pieces that belong to the same player.
    -      # The && represents an "and" statement: if even one part of the statement is false,
    -      # the entire statement evaluates to false.
    -      vertical_match = state.spaces[y][xs[0]].piece == piece &&
    -                       state.spaces[y][xs[1]].piece == piece &&
    -                       state.spaces[y][xs[2]].piece == piece
    +   In this sample app, string interpolation is used to show the current position of the mouse
    +   in a label.
     
    -      horizontal_match || vertical_match # if either is true, true is returned
    -    end
    + - args.outputs.labels: An array that generates a label.
    +   The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +   For more information about labels, go to mygame/documentation/02-labels.md.
     
    -    # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    -    # Is added to won regardless of whether the statement is true or false.
    -    won << (state.spaces[-1][-1].piece == piece && # bottom left
    -            state.spaces[ 0][ 0].piece == piece && # center
    -            state.spaces[ 1][ 1].piece == piece)   # top right
    + - args.outputs.solids: An array that generates a solid.
    +   The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    +   For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
     
    -    # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    -    # and is added to won.
    -    won << (state.spaces[ 1][-1].piece == piece && # bottom right
    -            state.spaces[ 0][ 0].piece == piece && # center
    -            state.spaces[-1][ 1].piece == piece)   # top left
    + - args.outputs.lines: An array that generates a line.
    +   The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    +   For more information about lines, go to mygame/documentation/04-lines.md.
     
    -    # Any false statements (meaning false diagonal matches) are rejected from won
    -    won.reject_false.any?
    -  end
    +=end
     
    -  # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    -  # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    -  # NOT have pieces in them.
    -  def filled_spaces
    -    state.space_combinations
    -      .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    -      .map do |x, y|
    -        if block_given?
    -          yield x, y, state.spaces[x][y]
    -        else
    -          [x, y, state.spaces[x][y]] # sets definition of space
    -        end
    -    end
    -  end
    +# This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    +# coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    +# four quadrants by pressing the button.
     
    -  # Defines all spaces on the board.
    -  def all_spaces
    -    if !block_given?
    -      state.space_combinations.map do |x, y|
    -        [x, y, state.spaces[x][y]] # sets definition of space
    -      end
    -    else # if a block is given (block_given? is true)
    -      state.space_combinations.map do |x, y|
    -        yield x, y, state.spaces[x][y] # yield if a block is given
    +def tick args
    +
    +  # The addition and subtraction in the first two parameters of the label and solid
    +  # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    +  pos = args.inputs.mouse.position # stores coordinates of mouse's position
    +  args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    +  args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
    +
    +  button = [0, 0, 370, 50] # sets definition of toggle button
    +  args.outputs.borders << button # outputs button as border (not filled in)
    +  args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    +  args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    +  args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
    +
    +  if args.inputs.mouse.click # if the user clicks the mouse
    +    pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    +    if pos.inside_rect? button # if the click occurred inside the button
    +      if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    +        args.grid.origin_center! # origin will be shown in center
    +      else
    +        args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
           end
         end
       end
     
    -  # Sets values for a label, such as the position, value, size, alignment, and color.
    -  def label x, y, value
    -    [x, y + 10, value, 20, 1, 0, 0, 0]
    -  end
    -end
    -
    -$tic_tac_toe = TicTacToe.new
    -
    -def tick args
    -  $tic_tac_toe._       = args
    -  $tic_tac_toe.state   = args.state
    -  $tic_tac_toe.outputs = args.outputs
    -  $tic_tac_toe.inputs  = args.inputs
    -  $tic_tac_toe.grid    = args.grid
    -  $tic_tac_toe.gtk     = args.gtk
    -  $tic_tac_toe.tick
    -  tick_instructions args, "Sample app shows how to work with mouse clicks."
    +  tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
     end
     
     def tick_instructions args, text, y = 715
    @@ -10509,1028 +10521,1394 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Mouse - Mouse Move - main.rb

    -
    # ./samples/05_mouse/02_mouse_move/app/main.rb
    +

    Save Load - Save Load Game - main.rb

    +
    # ./samples/06_save_load/01_save_load_game/app/main.rb
     =begin
     
    - Reminders:
    + APIs listing that haven't been encountered in previous sample apps:
     
    - - num1.greater(num2): Returns the greater value.
    -   For example, if we have the command
    -   puts 4.greater(3)
    -   the number 4 would be printed to the console since it has a greater value than 3.
    -   Similar to lesser, which returns the lesser value.
    + - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    +   because with a given symbol name, you can refer to the same object throughout
    +   a Ruby program.
     
    - - find_all: Finds all elements of a collection that meet certain requirements.
    -   For example, in this sample app, we're using find_all to find all zombies that have intersected
    -   or hit the player's sprite since these zombies have been killed.
    +   In this sample app, we're using symbols for our buttons. We have buttons that
    +   light fires, save, load, etc. Each of these buttons has a distinct symbol like
    +   :light_fire, :save_game, :load_game, etc.
     
    - - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    -   Stores the frame the "down" event occurred.
    -   For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    + - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    +   if it does not already exist.
    +   For example,
    +   'car'.to_sym
    +   would return the symbol :car.
     
    - - args.outputs.sprites: An array. The values generate a sprite.
    -   The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -   For more information about sprites, go to mygame/documentation/05-sprites.md.
    + - last: Returns the last element of an array.
     
    - - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -   When we want to create a new object, we can declare it as a new entity and then define
    -   its properties. (Remember, you can use state to define ANY property and it will
    -   be retained across frames.)
    + Reminders:
     
    - - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -   as Ruby code, and the placeholder is replaced with its corresponding value or result.
    + - num1.lesser(num2): finds the lower value of the given options.
    +   For example, in the statement
    +   a = 4.lesser(3)
    +   3 has a lower value than 4, which means that the value of a would be set to 3,
    +   but if the statement had been
    +   a = 4.lesser(5)
    +   4 has a lower value than 5, which means that the value of a would be set to 4.
     
    - - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -   Can be used to perform an action on every element of a collection, such as multiplying
    -   each element by 2 or declaring every element as a new entity.
    + - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    +   For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
     
    - - sample: Chooses a random element from the array.
    + - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    +   as Ruby code, and the placeholder is replaced with its corresponding value or result.
     
    - - reject: Removes elements that meet certain requirements.
    -   In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    -   rejecting zombies that were killed more than 30 frames ago.
    + - args.outputs.labels: An array. Values generate a label.
    +   Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +   For more information, go to mygame/documentation/02-labels.md.
    +
    + - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +   with at least four values is considered a rect. The inside_rect? function returns true
    +   or false depending on if the point is inside the rect.
     
     =end
     
    -# This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    -# is to kill the zombies as fast as possible!
    +# This code allows users to perform different tasks, such as saving and loading the game.
    +# Users also have options to reset the game and light a fire.
     
    -class ProtectThePuppiesFromTheZombies
    -  attr_accessor :grid, :inputs, :state, :outputs
    +class TextedBasedGame
     
    -  # Calls the methods necessary for the game to run properly.
    +  # Contains methods needed for game to run properly.
    +  # Increments tick count by 1 each time it runs (60 times in a single second)
       def tick
    -    defaults
    -    render
    -    calc
    -    input
    +    default
    +    show_intro
    +    state.engine_tick_count += 1
    +    tick_fire
       end
     
    -  # Sets default values for the zombies and for the player.
    -  # Initialization happens only in the first frame.
    -  def defaults
    -    state.flash_at               ||= 0
    -    state.zombie_min_spawn_rate  ||= 60
    -    state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    -    state.zombies                ||= []
    -    state.killed_zombies         ||= []
    +  # Sets default values.
    +  # The ||= ensures that a variable's value is only set to the value following the = sign
    +  # if the value has not already been set before. Intialization happens only in the first frame.
    +  def default
    +    state.engine_tick_count ||= 0
    +    state.active_module     ||= :room
    +    state.fire_progress     ||= 0
    +    state.fire_ready_in     ||= 10
    +    state.previous_fire     ||= :dead
    +    state.fire              ||= :dead
    +  end
     
    -    # Declares player as a new entity and sets its properties.
    -    # The player begins the game in the center of the screen, not moving in any direction.
    -    state.player ||= state.new_entity(:player, { x: 640,
    -                                               y: 360,
    -                                               attack_angle: 0,
    -                                               dx: 0,
    -                                               dy: 0 })
    +  def show_intro
    +    return unless state.engine_tick_count == 0 # return unless the game just started
    +    set_story_line "awake." # calls set_story_line method, sets to "awake"
       end
     
    -  # Outputs a gray background.
    -  # Calls the methods needed to output the player, zombies, etc onto the screen.
    -  def render
    -    outputs.solids << [grid.rect, 100, 100, 100]
    -    render_zombies
    -    render_killed_zombies
    -    render_player
    -    render_flash
    +  # Sets story line.
    +  def set_story_line story_line
    +    state.story_line    = story_line # story line set to value of parameter
    +    state.active_module = :alert # active module set to alert
       end
     
    -  # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    -  def render_zombies
    -    outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    -      z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    -      z.sprite
    +  # Clears story line.
    +  def clear_storyline
    +    state.active_module = :none # active module set to none
    +    state.story_line = nil # story line is cleared, set to nil (or empty)
    +  end
    +
    +  # Determines fire progress (how close the fire is to being ready to light).
    +  def tick_fire
    +    return if state.active_module == :alert # return if active module is alert
    +    state.fire_progress += 1 # increment fire progress
    +    # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    +    state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
    +  end
    +
    +  # Sets the value of fire (whether it is dead or roaring), and the story line
    +  def light_fire
    +    return unless fire_ready? # returns unless the fire is ready to be lit
    +    state.fire = :roaring # fire is lit, set to roaring
    +    state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    +    if state.fire != state.previous_fire
    +      set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    +      state.previous_fire = state.fire
         end
       end
     
    -  # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    -  def render_killed_zombies
    -    outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    -      z.sprite = [z.x,
    -                  z.y,
    -                  4 * 3,
    -                  8 * 3,
    -                  animation_sprite(z, z.death_at), # calls animation_sprite method
    -                  0, # angle
    -                  255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    -                  # change the value of 30 and see what happens when a zombie is killed
    +  # Checks if the fire is ready to be lit. Returns a boolean value.
    +  def fire_ready?
    +    # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    +    # the fire is ready to be lit.
    +    state.fire_progress == state.fire_ready_in
    +  end
    +
    +  # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    +  # being able to light a fire.
    +  def light_fire_progress
    +    state.fire_progress.fdiv(10) # float division
    +  end
    +
    +  # Defines fire as the state.fire variable.
    +  def fire
    +    state.fire
    +  end
    +
    +  # Sets the title of the room.
    +  def room_title
    +    return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    +    return "a room that is lit" # room is lit if the fire is not dead
    +  end
    +
    +  # Sets the active_module to room.
    +  def go_to_room
    +    state.active_module = :room
    +  end
    +
    +  # Defines active_module as the state.active_module variable.
    +  def active_module
    +    state.active_module
    +  end
    +
    +  # Defines story_line as the state.story_line variable.
    +  def story_line
    +    state.story_line
    +  end
    +
    +  # Update every 60 frames (or every second)
    +  def should_tick?
    +    state.tick_count.mod_zero?(60)
    +  end
    +
    +  # Sets the value of the game state provider.
    +  def initialize game_state_provider
    +    @game_state_provider = game_state_provider
    +  end
    +
    +  # Defines the game state.
    +  # Any variable prefixed with an @ symbol is an instance variable.
    +  def state
    +    @game_state_provider.state
    +  end
    +
    +  # Saves the state of the game in a text file called game_state.txt.
    +  def save
    +    $gtk.serialize_state('game_state.txt', state)
    +  end
    +
    +  # Loads the game state from the game_state.txt text file.
    +  # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    +  def load
    +    parsed_state = $gtk.deserialize_state('game_state.txt')
    +    if !parsed_state
    +      set_story_line "no game to load. press save first."
    +    else
    +      $gtk.args.state = parsed_state
    +    end
    +  end
    +
    +  # Resets the game.
    +  def reset
    +    $gtk.reset
    +  end
    +end
    +
    +class TextedBasedGamePresenter
    +  attr_accessor :state, :outputs, :inputs
    +
    +  # Creates empty collection called highlights.
    +  # Calls methods necessary to run the game.
    +  def tick
    +    state.layout.highlights ||= []
    +    game.tick if game.should_tick?
    +    render
    +    process_input
    +  end
     
    -      # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    -      # The slash is tilted 45 degrees from the angle of the player's attack.
    -      # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    -      # the slash over the killed zombie's sprite.
    -      [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
    -    end
    +  # Outputs a label of the tick count (passage of time) and calls all render methods.
    +  def render
    +    outputs.labels << [10, 30, state.tick_count]
    +    render_alert
    +    render_room
    +    render_highlights
       end
     
    -  # Outputs the player sprite using the images in the sprites folder.
    -  def render_player
    -    state.player_sprite = [state.player.x,
    -                           state.player.y,
    -                          4 * 3,
    -                          8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    -    outputs.sprites << state.player_sprite
    +  # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    +  def render_alert
    +    return unless game.active_module == :alert
     
    -    # Outputs a small red square that previews the angles that the player can attack in.
    -    # It can be moved in a perfect circle around the player to show possible movements.
    -    # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    -    outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    -                        state.player.y + state.player.attack_angle.vector_y(60),
    -                        3, 3, 255, 0, 0]
    +    outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    +    outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
       end
     
    -  # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    -  def render_flash
    -    return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    -    # Transparency gradually changes (or eases) during the 10 frames of flash.
    -    outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
    -  end
    +  def render_room
    +    return unless game.active_module == :room
    +    outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
     
    -  # Calls all methods necessary for performing calculations.
    -  def calc
    -    calc_spawn_zombie
    -    calc_move_zombies
    -    calc_player
    -    calc_kill_zombie
    +    # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    +    # that positions it 60 pixels lower than the previous output.
    +
    +    # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    +    outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    +    outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    +    outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    +    outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    +    outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
       end
     
    -  # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    -  def calc_spawn_zombie
    -    if state.zombie_spawn_countdown > 0
    -      state.zombie_spawn_countdown -= 1
    -      return
    -    end
    +  # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    +  def render_highlights
    +    state.layout.highlights.each do |h| # for each highlight in the collection
    +        h.lifetime -= 1 # decrease the value of its lifetime
    +      end
     
    -    # New zombies are created, positioned on the screen, and added to the zombies collection.
    -    state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    -      if rand > 0.5
    -        z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    -        z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    -        # the possible values exceed the screen's scope so zombies appear to be coming from far away
    -      else
    -        z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    -        z.y = grid.rect.w.randomize(:ratio) # random y position on screen
    +      outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    +        [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    +        # transparency changes; divide lifetime by max_lifetime, multiply result by 255
           end
    -    end
     
    -    # Calls random_spawn_countdown method (determines how fast new zombies appear)
    -    state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    -    state.zombie_min_spawn_rate -= 1
    -    # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    -    state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
    +      # reject highlights from collection that have no remaining lifetime
    +      state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
       end
     
    -  # Moves all zombies towards the center of the screen.
    -  # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    -  def calc_move_zombies
    -    state.zombies.each do |z| # for each zombie in the collection
    -      z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    -      z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
    -    end
    -    state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
    +  # Checks whether or not a button was clicked.
    +  # Returns a boolean value.
    +  def process_input
    +    button = button_clicked? # calls button_clicked? method
       end
     
    -  # Calculates the position and movement of the player on the screen.
    -  def calc_player
    -    state.player.x += state.player.dx # changes x based on dx (change in x)
    -    state.player.y += state.player.dy # changes y based on dy (change in y)
    +  # Returns a boolean value.
    +  # Finds the button that was clicked from the button list and determines what method to call.
    +  # Adds a highlight to the highlights collection.
    +  def button_clicked?
    +    return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    +      button = @button_list.find do |k, v| # goes through button_list to find button clicked
    +        click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    +      end
    +      return unless button # return unless a button was clicked
    +      method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    +      if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    +        border = button[1][:primitives].last # sets border definition using value of last key in button list hash
     
    -    state.player.dx *= 0.9 # scales dx down
    -    state.player.dy *= 0.9 # scales dy down
    +        # declares each highlight as a new entity, sets properties
    +        state.layout.highlights << state.new_entity(:highlight) do |h|
    +            h.x = border.x
    +            h.y = border.y
    +            h.w = border.w
    +            h.h = border.h
    +            h.max_lifetime = 10
    +            h.lifetime = h.max_lifetime
    +            h.color = [120, 120, 180] # sets color to shade of purple
    +          end
     
    -    # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    -    # This ensures that the player remains within the screen's scope.
    -    state.player.x = state.player.x.lesser(1280).greater(0)
    -    state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
    -  end
    +          self.send method_to_call # invoke method identified by symbol
    +        else # otherwise, if self doesn't respond to given method
    +          border = button[1][:primitives].last # sets border definition using value of last key in hash
     
    -  # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    -  # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    -  def calc_kill_zombie
    +          # declares each highlight as a new entity, sets properties
    +          state.layout.highlights << state.new_entity(:highlight) do |h|
    +            h.x = border.x
    +            h.y = border.y
    +            h.w = border.w
    +            h.h = border.h
    +            h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    +            h.lifetime = h.max_lifetime
    +            h.color = [120, 80, 80] # sets color to dark color
    +          end
     
    -    # Find all zombies that intersect with the player. They are considered killed.
    -    killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    -    state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    -    state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
    +          # instructions for users on how to add the missing method_to_call to the code
    +          puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    +          puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    +          puts ""
    +          puts "```"
    +          puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    +          puts ""
    +          puts "  def #{method_to_call}"
    +          puts "    puts 'Yay that worked!'"
    +          puts "  end"
    +          puts ""
    +          puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    +          puts "```"
    +          puts ""
    +      end
    +  end
     
    -    if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    -      state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    -    # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    -    end
    +  # Returns the position of the mouse when it is clicked.
    +  def click_pos
    +    return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    +    return inputs.mouse.click.point # returns location of mouse click (coordinates)
    +  end
     
    -    # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    -    # Death_at stores the frame a zombie was killed.
    -    killed_this_frame.each do |z|
    -      z.death_at = state.tick_count
    -    end
    +  # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    +  def button id, x, y, text
    +    @button_list[id] ||= { # assigns values to hash keys
    +      id: id,
    +      text: text,
    +      primitives: [
    +        [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    +        [x, y, 300, 50].border,             # sets definition of border
    +      ]
    +    }
     
    -    # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    -    # They are rejected if more than 30 frames have passed since their death.
    -    state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
    +    @button_list[id][:primitives] # returns label and border for buttons
       end
     
    -  # Uses input from the user to move the player around the screen.
    -  def input
    -
    -    # If the "a" key or left key is pressed, the x position of the player decreases.
    -    # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    -    if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    -      state.player.x -= 5
    -    elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    -      state.player.x += 5
    -    end
    +  # Creates a progress bar (used for lighting the fire) and sets its values.
    +  def progress_bar id, x, y, text, percentage
    +    @button_list[id] = { # assigns values to hash keys
    +      id: id,
    +      text: text,
    +      primitives: [
    +        [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    +        [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    +        [x, y, 300, 50].border, # sets definition of border
    +      ]
    +    }
     
    -    # If the "w" or up key is pressed, the y position of the player increases.
    -    # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    -    if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    -      state.player.y += 5
    -    elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    -      state.player.y -= 5
    -    end
    +    # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    +    # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    +    @button_list[id][:primitives][0][2] = 300 * percentage
    +    @button_list[id][:primitives]
    +  end
     
    -    # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    -    # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    -    # Attack angle also contributes to the position of red square.
    -    if inputs.mouse.moved
    -      state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -    end
    +  # Defines the game.
    +  def game
    +    @game
    +  end
     
    -    if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5
    -      state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -      state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set
    -      state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position
    -      state.player.dy = state.player.attack_angle.vector_y(25)
    -    end
    +  # Initalizes the game and creates an empty list of buttons.
    +  def initialize
    +    @game = TextedBasedGame.new self
    +    @button_list ||= {}
       end
     
    -  # Sets the zombie spawn's countdown to a random number.
    -  # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)
    -  def random_spawn_countdown minimum
    -    10.randomize(:ratio, :sign).to_i + 60
    +  # Clears the storyline and takes the user to the room.
    +  def alert_dismiss_clicked
    +    game.clear_storyline
    +    game.go_to_room
       end
     
    -  # Helps to iterate through the images in the sprites folder by setting the animation index.
    -  # 3 frames is how long to show an image, and 6 is how many images to flip through.
    -  def animation_index at
    -    at.idiv(3).mod(6)
    +  # Lights the fire when the user clicks the "light fire" option.
    +  def light_fire_clicked
    +    game.light_fire
       end
     
    -  # Animates the zombies by using the animation index to go through the images in the sprites folder.
    -  def animation_sprite zombie, at = nil
    -    at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created
    -    index = animation_index at
    -    "sprites/zombie-#{index}.png" # string interpolation to iterate through images
    +  # Saves the game when the user clicks the "save" option.
    +  def save_game_clicked
    +    game.save
       end
    -end
     
    -$protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new
    +  # Resets the game when the user clicks the "reset" option.
    +  def reset_game_clicked
    +    game.reset
    +  end
     
    -def tick args
    -  $protect_the_puppies_from_the_zombies.grid    = args.grid
    -  $protect_the_puppies_from_the_zombies.inputs  = args.inputs
    -  $protect_the_puppies_from_the_zombies.state    = args.state
    -  $protect_the_puppies_from_the_zombies.outputs = args.outputs
    -  $protect_the_puppies_from_the_zombies.tick
    -  tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."
    +  # Loads the game when the user clicks the "load" option.
    +  def load_game_clicked
    +    game.load
    +  end
     end
     
    -def tick_instructions args, text, y = 715
    -  return if args.state.key_event_occurred
    -  if args.inputs.mouse.click ||
    -     args.inputs.keyboard.directional_vector ||
    -     args.inputs.keyboard.key_down.enter ||
    -     args.inputs.keyboard.key_down.escape
    -    args.state.key_event_occurred = true
    -  end
    +$text_based_rpg = TextedBasedGamePresenter.new
     
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +def tick args
    +  $text_based_rpg.state = args.state
    +  $text_based_rpg.outputs = args.outputs
    +  $text_based_rpg.inputs = args.inputs
    +  $text_based_rpg.tick
     end
     
     
    -

    Mouse - Mouse Move Paint App - main.rb

    -
    # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    -=begin
    -
    - APIs listing that haven't been encountered in previous sample apps:
    -
    - - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
    -
    -   For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    -   puts a.floor()
    -   which would print out 13.
    -   (There is also a ceil method, which returns an integer number greater than or equal to the original
    -   with no decimal. If we had called ceil on the variable a, the result would have been 14.)
    -
    - Reminders:
    -
    - - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -   using their keys.
    -
    -   For example, if we have a "numbers" hash that stores numbers in English as the
    -   key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -   numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -   and on it goes.
    -
    -   Now if we wanted to find the corresponding value of the "one" key, we could say
    -   puts numbers["one"]
    -   which would print "uno" to the console.
    +

    Advanced Audio - Audio Mixer - main.rb

    +
    # ./samples/07_advanced_audio/01_audio_mixer/app/main.rb
    +# these are the properties that you can sent on args.audio
    +def spawn_new_sound args, name, path
    +  # Spawn randomly in an area that won't be covered by UI.
    +  screenx = (rand * 600.0) + 200.0
    +  screeny = (rand * 400.0) + 100.0
     
    - - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -   In this sample app, new_entity is used to create a new button that clears the grid.
    -   (Remember, you can use state to define ANY property and it will be retained across frames.)
    +  id = new_sound_id! args
    +  # you can hang anything on the audio hashes you want, so we store the
    +  #  actual screen position in here for convenience.
    +  args.audio[id] = {
    +    name: name,
    +    input: path,
    +    screenx: screenx,
    +    screeny: screeny,
    +    x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    +    y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    +    z: 0.0,
    +    gain: 1.0,
    +    pitch: 1.0,
    +    looping: true,
    +    paused: false
    +  }
     
    - - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +  args.state.selected = id
    +end
     
    - - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +# these are values you can change on the ~args.audio~ data structure
    +def input_panel args
    +  return unless args.state.panel
    +  return if args.state.dragging
     
    - - args.outputs.labels: An array. The values in the array generate a label.
    -   The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -   For more information about labels, go to mygame/documentation/02-labels.md.
    +  audio_entry = args.audio[args.state.selected]
    +  results = args.state.panel
     
    - - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    +  if args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.pitch_slider_rect.rect)
    +    audio_entry.pitch = 2.0 * ((args.inputs.mouse.x - results.pitch_slider_rect.x).to_f / (results.pitch_slider_rect.w - 1.0))
    +  elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.playtime_slider_rect.rect)
    +    audio_entry.playtime = audio_entry.length_ * ((args.inputs.mouse.x - results.playtime_slider_rect.x).to_f / (results.playtime_slider_rect.w - 1.0))
    +  elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.gain_slider_rect.rect)
    +    audio_entry.gain = (args.inputs.mouse.x - results.gain_slider_rect.x).to_f / (results.gain_slider_rect.w - 1.0)
    +  elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.looping_checkbox_rect.rect)
    +    audio_entry.looping = !audio_entry.looping
    +  elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.paused_checkbox_rect.rect)
    +    audio_entry.paused = !audio_entry.paused
    +  elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.delete_button_rect.rect)
    +    args.audio.delete args.state.selected
    +  end
    +end
     
    -=end
    +def render_sources args
    +  args.outputs.primitives << args.audio.keys.map do |k|
    +    s = args.audio[k]
     
    -# This sample app shows an empty grid that the user can paint on.
    -# To paint, the user must keep their mouse presssed and drag it around the grid.
    -# The "clear" button allows users to clear the grid so they can start over.
    +    isselected = (k == args.state.selected)
     
    -class PaintApp
    -  attr_accessor :inputs, :state, :outputs, :grid, :args
    +    color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    +    [
    +      [s.screenx, s.screeny, args.state.boxsize, args.state.boxsize, *color].solid,
     
    -  # Runs methods necessary for the game to function properly.
    -  def tick
    -    print_title
    -    add_grid
    -    check_click
    -    draw_buttons
    +      {
    +        x: s.screenx + args.state.boxsize.half,
    +        y: s.screeny,
    +        text: s.name,
    +        r: 255,
    +        g: 255,
    +        b: 255,
    +        alignment_enum: 1
    +      }.label!
    +    ]
       end
    +end
     
    -  # Prints the title onto the screen by using a label.
    -  # Also separates the title from the grid with a line as a horizontal separator.
    -  def print_title
    -    args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    -    outputs.lines << horizontal_separator(660, 0, 1280)
    -  end
    +def playtime_str t
    +  minutes = (t / 60.0).floor
    +  seconds = t - (minutes * 60.0).to_f
    +  return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]
    +end
     
    -  # Sets the starting position, ending position, and color for the horizontal separator.
    -  # The starting and ending positions have the same y values.
    -  def horizontal_separator y, x, x2
    -    [x, y, x2, y, 150, 150, 150]
    -  end
    +def label_with_drop_shadow x, y, text
    +  [
    +    { x: x + 1, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +    { x: x + 2, y: y + 0, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +    { x: x + 0, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 200, g: 200, b: 200 }.label!
    +  ]
    +end
     
    -  # Sets the starting position, ending position, and color for the vertical separator.
    -  # The starting and ending positions have the same x values.
    -  def vertical_separator x, y, y2
    -    [x, y, x, y2, 150, 150, 150]
    -  end
    +def check_box opts = {}
    +  checkbox_template = opts.args.layout.rect(w: 0.5, h: 0.5, col: 2)
    +  final_rect = checkbox_template.center_inside_rect_y(opts.args.layout.rect(row: opts.row, col: opts.col))
    +  color = { r:   0, g:   0, b:   0 }
    +  color = { r: 255, g: 255, b: 255 } if opts.checked
     
    -  # Outputs a border and a grid containing empty squares onto the screen.
    -  def add_grid
    +  {
    +    rect: final_rect,
    +    primitives: [
    +      (final_rect.to_solid color)
    +    ]
    +  }
    +end
     
    -    # Sets the x, y, height, and width of the grid.
    -    # There are 31 horizontal lines and 31 vertical lines in the grid.
    -    # Feel free to count them yourself before continuing!
    -    x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    -    lines_h = 31
    -    lines_v = 31
    +def progress_bar opts = {}
    +  outer_rect  = opts.args.layout.rect(row: opts.row, col: opts.col, w: 5, h: 1)
    +  color = opts.percentage * 255
    +  baseline_progress_bar = opts.args
    +                              .layout
    +                              .rect(w: 5, h: 0.5)
     
    -    # Sets values for the grid's border, grid lines, and filled squares.
    -    # The filled_squares variable is initially set to an empty array.
    -    state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    -    state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    -    state.filled_squares ||= [] # there are no filled squares until the user fills them in
    +  final_rect = baseline_progress_bar.center_inside_rect(outer_rect)
    +  center = final_rect.rect_center_point
     
    -    # Outputs the grid lines, border, and filled squares onto the screen.
    -    outputs.lines.concat state.grid_lines
    -    outputs.borders << state.grid_border
    -    outputs.solids << state.filled_squares
    -  end
    +  {
    +    rect: final_rect,
    +    primitives: [
    +      final_rect.merge(r: color, g: color, b: color, a: 128).solid!,
    +      label_with_drop_shadow(center.x, center.y, opts.text)
    +    ]
    +  }
    +end
     
    -  # Draws the grid by adding in vertical and horizontal separators.
    -  def draw_grid x, y, h, w, lines_h, lines_v
    +def panel_primitives args, audio_entry
    +  results = { primitives: [] }
     
    -    # The grid starts off empty.
    -    grid = []
    +  return results unless audio_entry
     
    -    # Calculates the placement and adds horizontal lines or separators into the grid.
    -    curr_y = y # start at the bottom of the box
    -    dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    -    lines_h.times do
    -      curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    -      grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
    -    end
    +  # this uses DRGTK's layout apis to layout the controls
    +  # imagine the screen is split into equal cells (24 cells across, 12 cells up and down)
    +  # args.layout.rect returns a hash which we merge values with to create primitives
    +  # using args.layout.rect removes the need for pixel pushing
     
    -    # Calculates the placement and adds vertical lines or separators into the grid.
    -    curr_x = x # now start at the left of the box
    -    dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid
    -    lines_v.times do
    -      curr_x += dist_x # increment curr_x by the distance between the vertical lines
    -      grid << vertical_separator(curr_x, y + 1, y  + h) # add separator
    -    end
    +  # args.outputs.debug << args.layout.debug_primitives(r: 255, g: 255, b: 255)
     
    -    # paint_grid uses a hash to assign values to keys.
    -    state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    -                          "lines_v" => lines_v, "dist_x" => dist_x,
    -                          "dist_y" => dist_y }
    +  white_color = { r: 255, g: 255, b: 255 }
    +  label_style = white_color.merge(vertical_alignment_enum: 1)
     
    -    return grid
    -  end
    +  # panel background
    +  results.primitives << args.layout.rect(row: 0, col: 0, w: 7, h: 6, include_col_gutter: true, include_row_gutter: true)
    +                                   .border!(r: 255, g: 255, b: 255)
     
    -  # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    -  # If the mouse is up, the user cannot drag the mouse.
    -  def check_click
    -    if inputs.mouse.down #is mouse up or down?
    -      state.mouse_held = true # mouse is being held down
    -    elsif inputs.mouse.up # if mouse is up
    -    state.mouse_held = false # mouse is not being held down or dragged
    -      state.mouse_dragging = false
    -    end
    +  # title
    +  results.primitives << args.layout.point(row: 0, col: 3.5, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text:           "Source #{args.state.selected} (#{args.audio[args.state.selected].name})",
    +                                          size_enum:      3,
    +                                          alignment_enum: 1)
     
    -    if state.mouse_held &&    # mouse needs to be down
    -      !inputs.mouse.click &&     # must not be first click
    -      ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    -      state.mouse_dragging = true
    -    end
    +  # seperator line
    +  results.primitives << args.layout.rect(row: 1, col: 0, w: 7, h: 0)
    +                                   .line!(white_color)
     
    -    # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    -    if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    -      search_lines(inputs.mouse.click.point, :click)
    +  # screen location
    +  results.primitives << args.layout.point(row: 1.0, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "screen:")
     
    -    # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    -    elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    -      search_lines(inputs.mouse.position, :drag)
    -    end
    -  end
    +  results.primitives << args.layout.point(row: 1.0, col: 2, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "(#{audio_entry.screenx.to_i}, #{audio_entry.screeny.to_i})")
     
    -  # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    -  def search_lines (point, input_type)
    -    point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    -    point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
    +  # position
    +  results.primitives << args.layout.point(row: 1.5, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "position:")
     
    -    # Remove code following the .floor and see what happens when you try to fill in grid squares
    -    point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    -    point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
    +  results.primitives << args.layout.point(row: 1.5, col: 2, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "(#{audio_entry[:x].round(5).to_s[0..6]}, #{audio_entry[:y].round(5).to_s[0..6]})")
     
    -    point.x += state.paint_grid["x"]
    -    point.y += state.paint_grid["y"]
    +  results.primitives << args.layout.point(row: 2.0, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "pitch:")
     
    -    # Sets definition of a grid box, meaning its x, y, width, and height.
    -    # Floor is called on the point.x and point.y variables.
    -    # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    -    grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
    +  results.pitch_slider_rect = progress_bar(row: 2.0, col: 2,
    +                                           percentage: audio_entry.pitch / 2.0,
    +                                           text: "#{audio_entry.pitch.to_sf}",
    +                                           args: args)
     
    -    if input_type == :click # if user clicks their mouse
    -      if state.filled_squares.include? grid_box # if grid box is already filled in
    -        state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    -      else
    -        state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    -      end
    -    elsif input_type == :drag # if user drags mouse
    -      unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    -        state.filled_squares << grid_box # the box is filled in and added to filled_squares
    -      end
    -    end
    -  end
    +  results.primitives << results.pitch_slider_rect.primitives
     
    -  # Creates and outputs a "Clear" button on the screen using a label and a border.
    -  # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    -  def draw_buttons
    -    x, y, w, h = 390, 50, 240, 50
    -    state.clear_button        ||= state.new_entity(:button_with_fade)
    +  results.primitives << args.layout.point(row: 2.5, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "playtime:")
     
    -    # The x and y positions are set to display the label in the center of the button.
    -    # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    -    state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    -    state.clear_button.border ||= [x, y, w, h]
    +  results.playtime_slider_rect = progress_bar(args: args,
    +                                              row:  2.5,
    +                                              col:  2,
    +                                              percentage: audio_entry.playtime / audio_entry.length_,
    +                                              text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")
     
    -    # If the mouse is clicked inside the borders of the clear button,
    -    # the filled_squares collection is emptied and the squares are cleared.
    -    if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    -      state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    -      state.filled_squares.clear
    -      inputs.mouse.previous_click = nil
    -    end
    +  results.primitives << results.playtime_slider_rect.primitives
     
    -    outputs.labels << state.clear_button.label
    -    outputs.borders << state.clear_button.border
    +  results.primitives << args.layout.point(row: 3.0, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "gain:")
     
    -    # When the clear button is clicked, the color of the button changes
    -    # and the transparency changes, as well. If you change the time from
    -    # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    -    if state.clear_button.clicked_at
    -      outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    -    end
    -  end
    -end
    +  results.gain_slider_rect = progress_bar(args: args,
    +                                          row:  3.0,
    +                                          col:  2,
    +                                          percentage: audio_entry.gain,
    +                                          text: "#{audio_entry.gain.to_sf}")
     
    -$paint_app = PaintApp.new
    +  results.primitives << results.gain_slider_rect.primitives
     
    -def tick args
    -  $paint_app.inputs = args.inputs
    -  $paint_app.state = args.state
    -  $paint_app.grid = args.grid
    -  $paint_app.args = args
    -  $paint_app.outputs = args.outputs
    -  $paint_app.tick
    -  tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    -end
     
    -def tick_instructions args, text, y = 715
    -  return if args.state.key_event_occurred
    -  if args.inputs.mouse.click ||
    -     args.inputs.keyboard.directional_vector ||
    -     args.inputs.keyboard.key_down.enter ||
    -     args.inputs.keyboard.key_down.escape
    -    args.state.key_event_occurred = true
    -  end
    +  results.primitives << args.layout.point(row: 3.5, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "looping:")
     
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -end
    +  checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
     
    -
    -

    Mouse - Coordinate Systems - main.rb

    -
    # ./samples/05_mouse/04_coordinate_systems/app/main.rb
    -=begin
    +  results.looping_checkbox_rect = check_box(args: args, row: 3.5, col: 2, checked: audio_entry.looping)
    +  results.primitives << results.looping_checkbox_rect.primitives
     
    - APIs listing that haven't been encountered in previous sample apps:
    +  results.primitives << args.layout.point(row: 4.0, col: 0, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "paused:")
     
    - - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    -   Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    -   position to know the mouse's coordinates.
    -   For more information about the mouse, go to mygame/documentation/07-mouse.md.
    +  checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
     
    - Reminders:
    +  results.paused_checkbox_rect = check_box(args: args, row: 4.0, col: 2, checked: !audio_entry.paused)
    +  results.primitives << results.paused_checkbox_rect.primitives
     
    - - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +  results.delete_button_rect = { rect: args.layout.rect(row: 5, col: 0, w: 7, h: 1) }
     
    - - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +  results.primitives << results.delete_button_rect.to_solid(r: 180)
     
    - - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -   as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +  results.primitives << args.layout.point(row: 5, col: 3.5, row_anchor: 0.5)
    +                                   .merge(label_style)
    +                                   .merge(text: "DELETE", alignment_enum: 1)
     
    -   In this sample app, string interpolation is used to show the current position of the mouse
    -   in a label.
    +  return results
    +end
     
    - - args.outputs.labels: An array that generates a label.
    -   The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -   For more information about labels, go to mygame/documentation/02-labels.md.
    +def render_panel args
    +  args.state.panel = nil
    +  audio_entry = args.audio[args.state.selected]
    +  return unless audio_entry
     
    - - args.outputs.solids: An array that generates a solid.
    -   The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    -   For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +  mouse_down = (args.state.mouse_held >= 0)
    +  args.state.panel = panel_primitives args, audio_entry
    +  args.outputs.primitives << args.state.panel.primitives
    +end
     
    - - args.outputs.lines: An array that generates a line.
    -   The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    -   For more information about lines, go to mygame/documentation/04-lines.md.
    +def new_sound_id! args
    +  args.state.sound_id ||= 0
    +  args.state.sound_id  += 1
    +  args.state.sound_id
    +end
     
    -=end
    +def render_launcher args
    +  args.outputs.primitives << args.state.spawn_sound_buttons.map(&:primitives)
    +end
     
    -# This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    -# coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    -# four quadrants by pressing the button.
    +def render_ui args
    +  render_launcher args
    +  render_panel args
    +end
     
     def tick args
    +  defaults args
    +  render args
    +  input args
    +end
     
    -  # The addition and subtraction in the first two parameters of the label and solid
    -  # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    -  pos = args.inputs.mouse.position # stores coordinates of mouse's position
    -  args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    -  args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
    +def input args
    +  if !args.audio[args.state.selected]
    +    args.state.selected = nil
    +    args.state.dragging = nil
    +  end
     
    -  button = [0, 0, 370, 50] # sets definition of toggle button
    -  args.outputs.borders << button # outputs button as border (not filled in)
    -  args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    -  args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    -  args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
    +  # spawn button and node interaction
    +  if args.inputs.mouse.click
    +    spawn_sound_button = args.state.spawn_sound_buttons.find { |b| args.inputs.mouse.inside_rect? b.rect }
     
    -  if args.inputs.mouse.click # if the user clicks the mouse
    -    pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    -    if pos.inside_rect? button # if the click occurred inside the button
    -      if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    -        args.grid.origin_center! # origin will be shown in center
    -      else
    -        args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
    -      end
    +    audio_click_key, audio_click_value = args.audio.find do |k, v|
    +      args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
    +    end
    +
    +    if spawn_sound_button
    +      args.state.selected = nil
    +      spawn_new_sound args, spawn_sound_button.name, spawn_sound_button.path
    +    elsif audio_click_key
    +      args.state.selected = audio_click_key
         end
       end
     
    -  tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
    +  if args.state.mouse_state == :held && args.state.selected
    +    v = args.audio[args.state.selected]
    +    if args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
    +      args.state.dragging = args.state.selected
    +    end
    +
    +    if args.state.dragging
    +      s = args.audio[args.state.selected]
    +      # you can hang anything on the audio hashes you want, so we store the
    +      #  actual screen position so it doesn't scale weirdly vs your mouse.
    +      s.screenx = args.inputs.mouse.x - (args.state.boxsize / 2)
    +      s.screeny = args.inputs.mouse.y - (args.state.boxsize / 2)
    +
    +      s.screeny = 50 if s.screeny < 50
    +      s.screeny = (719 - args.state.boxsize) if s.screeny > (719 - args.state.boxsize)
    +      s.screenx = 0 if s.screenx < 0
    +      s.screenx = (1279 - args.state.boxsize) if s.screenx > (1279 - args.state.boxsize)
    +
    +      s.x = ((s.screenx / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    +      s.y = ((s.screeny / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    +    end
    +  elsif args.state.mouse_state == :released
    +    args.state.dragging = nil
    +  end
    +
    +  input_panel args
     end
     
    -def tick_instructions args, text, y = 715
    -  return if args.state.key_event_occurred
    -  if args.inputs.mouse.click ||
    -     args.inputs.keyboard.directional_vector ||
    -     args.inputs.keyboard.key_down.enter ||
    -     args.inputs.keyboard.key_down.escape
    -    args.state.key_event_occurred = true
    +def defaults args
    +  args.state.mouse_state      ||= :released
    +  args.state.dragging_source  ||= false
    +  args.state.selected         ||= 0
    +  args.state.next_sound_index ||= 0
    +  args.state.boxsize          ||= 30
    +  args.state.sound_files      ||= [
    +    { name: :tada,   path: "sounds/tada.wav"   },
    +    { name: :splash, path: "sounds/splash.wav" },
    +    { name: :drum,   path: "sounds/drum.wav"   },
    +    { name: :spring, path: "sounds/spring.wav" },
    +    { name: :music,  path: "sounds/music.ogg"  }
    +  ]
    +
    +  # generate buttons based off the sound collection above
    +  args.state.spawn_sound_buttons ||= begin
    +    # create a group of buttons
    +    # column centered (using col_offset to calculate the column offset)
    +    # where each item is 2 columns apart
    +    rects = args.layout.rect_group row:   11,
    +                                   col_offset: {
    +                                     count: args.state.sound_files.length,
    +                                     w:     2
    +                                   },
    +                                   dcol:  2,
    +                                   w:     2,
    +                                   h:     1,
    +                                   group: args.state.sound_files
    +
    +    # now that you have the rects
    +    # construct the metadata for the buttons
    +    rects.map do |rect|
    +      {
    +        rect: rect,
    +        name: rect.name,
    +        path: rect.path,
    +        primitives: [
    +          rect.to_border(r: 255, g: 255, b: 255),
    +          rect.to_label(x: rect.center_x,
    +                        y: rect.center_y,
    +                        text: "#{rect.name}",
    +                        alignment_enum: 1,
    +                        vertical_alignment_enum: 1,
    +                        r: 255, g: 255, b: 255)
    +        ]
    +      }
    +    end
       end
     
    -  args.outputs.debug << [0, y - 50, 1280, 60].solid
    -  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +  if args.inputs.mouse.up
    +    args.state.mouse_state = :released
    +    args.state.dragging_source = false
    +  elsif args.inputs.mouse.down
    +    args.state.mouse_state = :held
    +  end
    +
    +  args.outputs.background_color = [ 0, 0, 0, 255 ]
    +end
    +
    +def render args
    +  render_ui args
    +  render_sources args
     end
     
     
    -

    Save Load - Save Load Game - main.rb

    -
    # ./samples/06_save_load/01_save_load_game/app/main.rb
    -=begin
    +

    Advanced Audio - Audio Mixer - server_ip_address.txt

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

    Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt

    +
    # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
    +# ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
    +# Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
     
    - APIs listing that haven't been encountered in previous sample apps:
    +# teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
    +teamid=
    +# appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
    +appid=
    +# appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
    +appname=
     
    - - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    -   because with a given symbol name, you can refer to the same object throughout
    -   a Ruby program.
    +
    +

    Advanced Audio - Sound Synthesis - main.rb

    +
    # ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb
    +begin # region: top level tick methods
    +  def tick args
    +    defaults args
    +    render args
    +    input args
    +    process_audio_queue args
    +  end
     
    -   In this sample app, we're using symbols for our buttons. We have buttons that
    -   light fires, save, load, etc. Each of these buttons has a distinct symbol like
    -   :light_fire, :save_game, :load_game, etc.
    +  def defaults args
    +    args.state.sine_waves      ||= {}
    +    args.state.square_waves    ||= {}
    +    args.state.saw_tooth_waves ||= {}
    +    args.state.triangle_waves  ||= {}
    +    args.state.audio_queue     ||= []
    +    args.state.buttons         ||= [
    +      (frequency_buttons args),
    +      (sine_wave_note_buttons args),
    +      (bell_buttons args),
    +      (square_wave_note_buttons args),
    +      (saw_tooth_wave_note_buttons args),
    +      (triangle_wave_note_buttons args),
    +    ].flatten
    +  end
     
    - - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    -   if it does not already exist.
    -   For example,
    -   'car'.to_sym
    -   would return the symbol :car.
    +  def render args
    +    args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    +    args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    +    args.outputs.labels  << args.layout
    +                              .rect(row: 0, col: 11.5)
    +                              .yield_self { |r| r.merge y: r.y + r.h }
    +                              .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    +                                     alignment_enum: 1)
    +  end
     
    - - last: Returns the last element of an array.
     
    - Reminders:
    +  def input args
    +    args.state.buttons.each do |b|
    +      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    +        parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    +        args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    +        send b[:method_to_call], args, b
    +      end
    +    end
     
    - - num1.lesser(num2): finds the lower value of the given options.
    -   For example, in the statement
    -   a = 4.lesser(3)
    -   3 has a lower value than 4, which means that the value of a would be set to 3,
    -   but if the statement had been
    -   a = 4.lesser(5)
    -   4 has a lower value than 5, which means that the value of a would be set to 4.
    +    if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    +      args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    +    end
    +  end
     
    - - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    -   For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    +  def process_audio_queue args
    +    to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    +    args.state.audio_queue -= to_queue
    +    to_queue.each { |a| args.audio[a[:id]] = a }
     
    - - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    -   as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +    args.audio.find_all { |k, v| v[:decay_rate] }
    +      .each     { |k, v| v[:gain] -= v[:decay_rate] }
     
    - - args.outputs.labels: An array. Values generate a label.
    -   Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -   For more information, go to mygame/documentation/02-labels.md.
    +    sounds_to_stop = args.audio
    +                       .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    +                       .map { |k, v| k }
     
    - - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -   with at least four values is considered a rect. The inside_rect? function returns true
    -   or false depending on if the point is inside the rect.
    +    sounds_to_stop.each { |k| args.audio.delete k }
    +  end
    +end
     
    -=end
    +begin # region: button definitions, ui layout, callback functions
    +  def button args, opts
    +    button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
     
    -# This code allows users to perform different tasks, such as saving and loading the game.
    -# Users also have options to reset the game and light a fire.
    +    button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
     
    -class TextedBasedGame
    +    label_offset_x = 5
    +    label_offset_y = 30
     
    -  # Contains methods needed for game to run properly.
    -  # Increments tick count by 1 each time it runs (60 times in a single second)
    -  def tick
    -    default
    -    show_intro
    -    state.engine_tick_count += 1
    -    tick_fire
    +    button_def[:label]  = button_def[:rect].merge text: opts[:text],
    +                                                  size_enum: -2.5,
    +                                                  x: button_def[:rect].x + label_offset_x,
    +                                                  y: button_def[:rect].y + label_offset_y
    +
    +    button_def
       end
     
    -  # Sets default values.
    -  # The ||= ensures that a variable's value is only set to the value following the = sign
    -  # if the value has not already been set before. Intialization happens only in the first frame.
    -  def default
    -    state.engine_tick_count ||= 0
    -    state.active_module     ||= :room
    -    state.fire_progress     ||= 0
    -    state.fire_ready_in     ||= 10
    -    state.previous_fire     ||= :dead
    -    state.fire              ||= :dead
    +  def play_sine_wave args, sender
    +    queue_sine_wave args,
    +                    frequency: sender[:frequency],
    +                    duration: 1.seconds,
    +                    fade_out: true
       end
     
    -  def show_intro
    -    return unless state.engine_tick_count == 0 # return unless the game just started
    -    set_story_line "awake." # calls set_story_line method, sets to "awake"
    +  def play_note args, sender
    +    method_to_call = :queue_sine_wave
    +    method_to_call = :queue_square_wave    if sender[:type] == :square
    +    method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    +    method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    +    method_to_call = :queue_bell           if sender[:type] == :bell
    +
    +    send method_to_call, args,
    +         frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    +         duration: 1.seconds,
    +         fade_out: true
       end
     
    -  # Sets story line.
    -  def set_story_line story_line
    -    state.story_line    = story_line # story line set to value of parameter
    -    state.active_module = :alert # active module set to alert
    +  def frequency_buttons args
    +    [
    +      (button args,
    +              row: 4.0, col: 0, text: "300hz",
    +              frequency: 300,
    +              method_to_call: :play_sine_wave),
    +      (button args,
    +              row: 5.0, col: 0, text: "400hz",
    +              frequency: 400,
    +              method_to_call: :play_sine_wave),
    +      (button args,
    +              row: 6.0, col: 0, text: "500hz",
    +              frequency: 500,
    +              method_to_call: :play_sine_wave),
    +    ]
       end
     
    -  # Clears story line.
    -  def clear_storyline
    -    state.active_module = :none # active module set to none
    -    state.story_line = nil # story line is cleared, set to nil (or empty)
    +  def sine_wave_note_buttons args
    +    [
    +      (button args,
    +              row: 1.5, col: 2, text: "Sine C4",
    +              note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 2.5, col: 2, text: "Sine D4",
    +              note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 3.5, col: 2, text: "Sine E4",
    +              note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 4.5, col: 2, text: "Sine F4",
    +              note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 5.5, col: 2, text: "Sine G4",
    +              note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 6.5, col: 2, text: "Sine A5",
    +              note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 7.5, col: 2, text: "Sine B5",
    +              note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    +      (button args,
    +              row: 8.5, col: 2, text: "Sine C5",
    +              note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    +    ]
       end
     
    -  # Determines fire progress (how close the fire is to being ready to light).
    -  def tick_fire
    -    return if state.active_module == :alert # return if active module is alert
    -    state.fire_progress += 1 # increment fire progress
    -    # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    -    state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
    +  def square_wave_note_buttons args
    +    [
    +      (button args,
    +              row: 1.5, col: 6, text: "Square C4",
    +              note: :c, octave: 4, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 2.5, col: 6, text: "Square D4",
    +              note: :d, octave: 4, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 3.5, col: 6, text: "Square E4",
    +              note: :e, octave: 4, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 4.5, col: 6, text: "Square F4",
    +              note: :f, octave: 4, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 5.5, col: 6, text: "Square G4",
    +              note: :g, octave: 4, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 6.5, col: 6, text: "Square A5",
    +              note: :a, octave: 5, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 7.5, col: 6, text: "Square B5",
    +              note: :b, octave: 5, type: :square, method_to_call: :play_note),
    +      (button args,
    +              row: 8.5, col: 6, text: "Square C5",
    +              note: :c, octave: 5, type: :square, method_to_call: :play_note),
    +    ]
    +  end
    +  def saw_tooth_wave_note_buttons args
    +    [
    +      (button args,
    +              row: 1.5, col: 8, text: "Saw C4",
    +              note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 2.5, col: 8, text: "Saw D4",
    +              note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 3.5, col: 8, text: "Saw E4",
    +              note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 4.5, col: 8, text: "Saw F4",
    +              note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 5.5, col: 8, text: "Saw G4",
    +              note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 6.5, col: 8, text: "Saw A5",
    +              note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 7.5, col: 8, text: "Saw B5",
    +              note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +      (button args,
    +              row: 8.5, col: 8, text: "Saw C5",
    +              note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +    ]
       end
     
    -  # Sets the value of fire (whether it is dead or roaring), and the story line
    -  def light_fire
    -    return unless fire_ready? # returns unless the fire is ready to be lit
    -    state.fire = :roaring # fire is lit, set to roaring
    -    state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    -    if state.fire != state.previous_fire
    -      set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    -      state.previous_fire = state.fire
    -    end
    +  def triangle_wave_note_buttons args
    +    [
    +      (button args,
    +              row: 1.5, col: 10, text: "Triangle C4",
    +              note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 2.5, col: 10, text: "Triangle D4",
    +              note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 3.5, col: 10, text: "Triangle E4",
    +              note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 4.5, col: 10, text: "Triangle F4",
    +              note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 5.5, col: 10, text: "Triangle G4",
    +              note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 6.5, col: 10, text: "Triangle A5",
    +              note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 7.5, col: 10, text: "Triangle B5",
    +              note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    +      (button args,
    +              row: 8.5, col: 10, text: "Triangle C5",
    +              note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    +    ]
       end
     
    -  # Checks if the fire is ready to be lit. Returns a boolean value.
    -  def fire_ready?
    -    # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    -    # the fire is ready to be lit.
    -    state.fire_progress == state.fire_ready_in
    +  def bell_buttons args
    +    [
    +      (button args,
    +              row: 1.5, col: 4, text: "Bell C4",
    +              note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 2.5, col: 4, text: "Bell D4",
    +              note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 3.5, col: 4, text: "Bell E4",
    +              note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 4.5, col: 4, text: "Bell F4",
    +              note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 5.5, col: 4, text: "Bell G4",
    +              note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 6.5, col: 4, text: "Bell A5",
    +              note: :a, octave: 5, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 7.5, col: 4, text: "Bell B5",
    +              note: :b, octave: 5, type: :bell, method_to_call: :play_note),
    +      (button args,
    +              row: 8.5, col: 4, text: "Bell C5",
    +              note: :c, octave: 5, type: :bell, method_to_call: :play_note),
    +    ]
    +  end
    +end
    +
    +begin # region: wave generation
    +  begin # sine wave
    +    def defaults_sine_wave_for
    +      { frequency: 440, sample_rate: 48000 }
    +    end
    +
    +    def sine_wave_for opts = {}
    +      opts = defaults_sine_wave_for.merge opts
    +      frequency   = opts[:frequency]
    +      sample_rate = opts[:sample_rate]
    +      period_size = (sample_rate.fdiv frequency).ceil
    +      period_size.map_with_index do |i|
    +        Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)
    +      end.to_a
    +    end
    +
    +    def defaults_queue_sine_wave
    +      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +    end
    +
    +    def queue_sine_wave args, opts = {}
    +      opts        = defaults_queue_sine_wave.merge opts
    +      frequency   = opts[:frequency]
    +      sample_rate = 48000
    +
    +      sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate
    +      args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate
    +
    +      proc = lambda do
    +        generate_audio_data args.state.sine_waves[frequency], sample_rate
    +      end
    +
    +      audio_state = new_audio_state args, opts
    +      audio_state[:input] = [1, sample_rate, proc]
    +      queue_audio args, audio_state: audio_state, wave: sine_wave
    +    end
       end
     
    -  # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    -  # being able to light a fire.
    -  def light_fire_progress
    -    state.fire_progress.fdiv(10) # float division
    -  end
    +  begin # region: square wave
    +    def defaults_square_wave_for
    +      { frequency: 440, sample_rate: 48000 }
    +    end
    +
    +    def square_wave_for opts = {}
    +      opts = defaults_square_wave_for.merge opts
    +      sine_wave = sine_wave_for opts
    +      sine_wave.map do |v|
    +        if v >= 0
    +          1.0
    +        else
    +          -1.0
    +        end
    +      end.to_a
    +    end
    +
    +    def defaults_queue_square_wave
    +      { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +    end
     
    -  # Defines fire as the state.fire variable.
    -  def fire
    -    state.fire
    -  end
    +    def queue_square_wave args, opts = {}
    +      opts        = defaults_queue_square_wave.merge opts
    +      frequency   = opts[:frequency]
    +      sample_rate = 48000
     
    -  # Sets the title of the room.
    -  def room_title
    -    return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    -    return "a room that is lit" # room is lit if the fire is not dead
    -  end
    +      square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    +      args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
     
    -  # Sets the active_module to room.
    -  def go_to_room
    -    state.active_module = :room
    -  end
    +      proc = lambda do
    +        generate_audio_data args.state.square_waves[frequency], sample_rate
    +      end
     
    -  # Defines active_module as the state.active_module variable.
    -  def active_module
    -    state.active_module
    +      audio_state = new_audio_state args, opts
    +      audio_state[:input] = [1, sample_rate, proc]
    +      queue_audio args, audio_state: audio_state, wave: square_wave
    +    end
       end
     
    -  # Defines story_line as the state.story_line variable.
    -  def story_line
    -    state.story_line
    -  end
    +  begin # region: saw tooth wave
    +    def defaults_saw_tooth_wave_for
    +      { frequency: 440, sample_rate: 48000 }
    +    end
     
    -  # Update every 60 frames (or every second)
    -  def should_tick?
    -    state.tick_count.mod_zero?(60)
    -  end
    +    def saw_tooth_wave_for opts = {}
    +      opts = defaults_saw_tooth_wave_for.merge opts
    +      sine_wave = sine_wave_for opts
    +      period_size = sine_wave.length
    +      sine_wave.map_with_index do |v, i|
    +        (((i % period_size).fdiv period_size) * 2) - 1
    +      end
    +    end
     
    -  # Sets the value of the game state provider.
    -  def initialize game_state_provider
    -    @game_state_provider = game_state_provider
    -  end
    +    def defaults_queue_saw_tooth_wave
    +      { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +    end
     
    -  # Defines the game state.
    -  # Any variable prefixed with an @ symbol is an instance variable.
    -  def state
    -    @game_state_provider.state
    -  end
    +    def queue_saw_tooth_wave args, opts = {}
    +      opts        = defaults_queue_saw_tooth_wave.merge opts
    +      frequency   = opts[:frequency]
    +      sample_rate = 48000
     
    -  # Saves the state of the game in a text file called game_state.txt.
    -  def save
    -    $gtk.serialize_state('game_state.txt', state)
    -  end
    +      saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +      args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
     
    -  # Loads the game state from the game_state.txt text file.
    -  # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    -  def load
    -    parsed_state = $gtk.deserialize_state('game_state.txt')
    -    if !parsed_state
    -      set_story_line "no game to load. press save first."
    -    else
    -      $gtk.args.state = parsed_state
    +      proc = lambda do
    +        generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    +      end
    +
    +      audio_state = new_audio_state args, opts
    +      audio_state[:input] = [1, sample_rate, proc]
    +      queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
         end
       end
     
    -  # Resets the game.
    -  def reset
    -    $gtk.reset
    -  end
    -end
    +  begin # region: triangle wave
    +    def defaults_triangle_wave_for
    +      { frequency: 440, sample_rate: 48000 }
    +    end
     
    -class TextedBasedGamePresenter
    -  attr_accessor :state, :outputs, :inputs
    +    def triangle_wave_for opts = {}
    +      opts = defaults_saw_tooth_wave_for.merge opts
    +      sine_wave = sine_wave_for opts
    +      period_size = sine_wave.length
    +      sine_wave.map_with_index do |v, i|
    +        ratio = (i.fdiv period_size)
    +        if ratio <= 0.5
    +          (ratio * 4) - 1
    +        else
    +          ratio -= 0.5
    +          1 - (ratio * 4)
    +        end
    +      end
    +    end
     
    -  # Creates empty collection called highlights.
    -  # Calls methods necessary to run the game.
    -  def tick
    -    state.layout.highlights ||= []
    -    game.tick if game.should_tick?
    -    render
    -    process_input
    -  end
    +    def defaults_queue_triangle_wave
    +      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +    end
     
    -  # Outputs a label of the tick count (passage of time) and calls all render methods.
    -  def render
    -    outputs.labels << [10, 30, state.tick_count]
    -    render_alert
    -    render_room
    -    render_highlights
    -  end
    +    def queue_triangle_wave args, opts = {}
    +      opts        = defaults_queue_triangle_wave.merge opts
    +      frequency   = opts[:frequency]
    +      sample_rate = 48000
     
    -  # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    -  def render_alert
    -    return unless game.active_module == :alert
    +      triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    +      args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
     
    -    outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    -    outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
    +      proc = lambda do
    +        generate_audio_data args.state.triangle_waves[frequency], sample_rate
    +      end
    +
    +      audio_state = new_audio_state args, opts
    +      audio_state[:input] = [1, sample_rate, proc]
    +      queue_audio args, audio_state: audio_state, wave: triangle_wave
    +    end
       end
     
    -  def render_room
    -    return unless game.active_module == :room
    -    outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
    +  begin # region: bell
    +    def defaults_queue_bell
    +      { frequency: 440, duration: 1.seconds, queue_in: 0 }
    +    end
     
    -    # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    -    # that positions it 60 pixels lower than the previous output.
    +    def queue_bell args, opts = {}
    +      (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
    +    end
     
    -    # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    -    outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    -    outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    -    outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    -    outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    -    outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
    -  end
    +    def bell_harmonics
    +      [
    +        { frequency_ratio: 0.5, duration_ratio: 1.00 },
    +        { frequency_ratio: 1.0, duration_ratio: 0.80 },
    +        { frequency_ratio: 2.0, duration_ratio: 0.60 },
    +        { frequency_ratio: 3.0, duration_ratio: 0.40 },
    +        { frequency_ratio: 4.2, duration_ratio: 0.25 },
    +        { frequency_ratio: 5.4, duration_ratio: 0.20 },
    +        { frequency_ratio: 6.8, duration_ratio: 0.15 }
    +      ]
    +    end
     
    -  # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    -  def render_highlights
    -    state.layout.highlights.each do |h| # for each highlight in the collection
    -        h.lifetime -= 1 # decrease the value of its lifetime
    -      end
    +    def defaults_bell_to_sine_waves
    +      { frequency: 440, duration: 1.seconds, queue_in: 0 }
    +    end
     
    -      outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    -        [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    -        # transparency changes; divide lifetime by max_lifetime, multiply result by 255
    +    def bell_to_sine_waves opts = {}
    +      opts = defaults_bell_to_sine_waves.merge opts
    +      bell_harmonics.map do |b|
    +        {
    +          frequency: opts[:frequency] * b[:frequency_ratio],
    +          duration:  opts[:duration] * b[:duration_ratio],
    +          queue_in:  opts[:queue_in],
    +          gain:      (1.fdiv bell_harmonics.length),
    +          fade_out:  true
    +        }
           end
    -
    -      # reject highlights from collection that have no remaining lifetime
    -      state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
    +    end
       end
     
    -  # Checks whether or not a button was clicked.
    -  # Returns a boolean value.
    -  def process_input
    -    button = button_clicked? # calls button_clicked? method
    -  end
    +  begin # audio entity construction
    +    def generate_audio_data sine_wave, sample_rate
    +      sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    +      copy_count  = (sample_size.fdiv sine_wave.length).ceil
    +      sine_wave * copy_count
    +    end
     
    -  # Returns a boolean value.
    -  # Finds the button that was clicked from the button list and determines what method to call.
    -  # Adds a highlight to the highlights collection.
    -  def button_clicked?
    -    return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    -      button = @button_list.find do |k, v| # goes through button_list to find button clicked
    -        click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    -      end
    -      return unless button # return unless a button was clicked
    -      method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    -      if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    -        border = button[1][:primitives].last # sets border definition using value of last key in button list hash
    +    def defaults_new_audio_state
    +      { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +    end
     
    -        # declares each highlight as a new entity, sets properties
    -        state.layout.highlights << state.new_entity(:highlight) do |h|
    -            h.x = border.x
    -            h.y = border.y
    -            h.w = border.w
    -            h.h = border.h
    -            h.max_lifetime = 10
    -            h.lifetime = h.max_lifetime
    -            h.color = [120, 120, 180] # sets color to shade of purple
    -          end
    +    def new_audio_state args, opts = {}
    +      opts        = defaults_new_audio_state.merge opts
    +      decay_rate  = 0
    +      decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    +      frequency   = opts[:frequency]
    +      sample_rate = 48000
     
    -          self.send method_to_call # invoke method identified by symbol
    -        else # otherwise, if self doesn't respond to given method
    -          border = button[1][:primitives].last # sets border definition using value of last key in hash
    +      {
    +        id:               (new_id! args),
    +        frequency:        frequency,
    +        sample_rate:      48000,
    +        stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    +        gain:             opts[:gain].to_f,
    +        queue_at:         args.state.tick_count + opts[:queue_in],
    +        decay_rate:       decay_rate,
    +        pitch:            1.0,
    +        looping:          true,
    +        paused:           false
    +      }
    +    end
     
    -          # declares each highlight as a new entity, sets properties
    -          state.layout.highlights << state.new_entity(:highlight) do |h|
    -            h.x = border.x
    -            h.y = border.y
    -            h.w = border.w
    -            h.h = border.h
    -            h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    -            h.lifetime = h.max_lifetime
    -            h.color = [120, 80, 80] # sets color to dark color
    -          end
    +    def queue_audio args, opts = {}
    +      graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    +      args.state.audio_queue << opts[:audio_state]
    +    end
     
    -          # instructions for users on how to add the missing method_to_call to the code
    -          puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    -          puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    -          puts ""
    -          puts "```"
    -          puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    -          puts ""
    -          puts "  def #{method_to_call}"
    -          puts "    puts 'Yay that worked!'"
    -          puts "  end"
    -          puts ""
    -          puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    -          puts "```"
    -          puts ""
    -      end
    -  end
    +    def new_id! args
    +      args.state.audio_id ||= 0
    +      args.state.audio_id  += 1
    +    end
     
    -  # Returns the position of the mouse when it is clicked.
    -  def click_pos
    -    return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    -    return inputs.mouse.click.point # returns location of mouse click (coordinates)
    -  end
    +    def graph_wave args, wave, frequency
    +      if args.state.tick_count != args.state.graphed_at
    +        args.outputs.static_lines.clear
    +        args.outputs.static_sprites.clear
    +      end
     
    -  # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    -  def button id, x, y, text
    -    @button_list[id] ||= { # assigns values to hash keys
    -      id: id,
    -      text: text,
    -      primitives: [
    -        [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    -        [x, y, 300, 50].border,             # sets definition of border
    -      ]
    -    }
    +      wave = wave
     
    -    @button_list[id][:primitives] # returns label and border for buttons
    -  end
    +      r, g, b = frequency.to_i % 85,
    +                frequency.to_i % 170,
    +                frequency.to_i % 255
     
    -  # Creates a progress bar (used for lighting the fire) and sets its values.
    -  def progress_bar id, x, y, text, percentage
    -    @button_list[id] = { # assigns values to hash keys
    -      id: id,
    -      text: text,
    -      primitives: [
    -        [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    -        [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    -        [x, y, 300, 50].border, # sets definition of border
    -      ]
    -    }
    +      starting_rect = args.layout.rect(row: 5, col: 13)
    +      x_scale    = 10
    +      y_scale    = 100
    +      max_points = 25
     
    -    # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    -    # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    -    @button_list[id][:primitives][0][2] = 300 * percentage
    -    @button_list[id][:primitives]
    -  end
    +      points = wave
    +      if wave.length > max_points
    +        resolution = wave.length.idiv max_points
    +        points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    +      end
     
    -  # Defines the game.
    -  def game
    -    @game
    -  end
    +      args.outputs.static_lines << points.map_with_index do |y, x|
    +        next_y = points[x + 1]
     
    -  # Initalizes the game and creates an empty list of buttons.
    -  def initialize
    -    @game = TextedBasedGame.new self
    -    @button_list ||= {}
    -  end
    +        if next_y
    +          {
    +            x:  starting_rect.x + (x * x_scale),
    +            y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    +            x2: starting_rect.x + ((x + 1) * x_scale),
    +            y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    +            r:  r,
    +            g:  g,
    +            b:  b
    +          }
    +        end
    +      end
     
    -  # Clears the storyline and takes the user to the room.
    -  def alert_dismiss_clicked
    -    game.clear_storyline
    -    game.go_to_room
    -  end
    +      args.outputs.static_sprites << points.map_with_index do |y, x|
    +        {
    +          x:  (starting_rect.x + (x * x_scale)) - 2,
    +          y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    +          w:  4,
    +          h:  4,
    +          path: 'sprites/square-white.png',
    +          r: r,
    +          g: g,
    +          b: b
    +        }
    +      end
     
    -  # Lights the fire when the user clicks the "light fire" option.
    -  def light_fire_clicked
    -    game.light_fire
    +      args.state.graphed_at = args.state.tick_count
    +    end
       end
     
    -  # Saves the game when the user clicks the "save" option.
    -  def save_game_clicked
    -    game.save
    -  end
    +  begin # region: musical note mapping
    +    def defaults_frequency_for
    +      { note: :a, octave: 5, sharp:  false, flat:   false }
    +    end
     
    -  # Resets the game when the user clicks the "reset" option.
    -  def reset_game_clicked
    -    game.reset
    -  end
    +    def frequency_for opts = {}
    +      opts = defaults_frequency_for.merge opts
    +      octave_offset_multiplier  = opts[:octave] - 5
    +      note = note_frequencies_octave_5[opts[:note]]
    +      if octave_offset_multiplier < 0
    +        note = note * 1 / (octave_offset_multiplier.abs + 1)
    +      elsif octave_offset_multiplier > 0
    +        note = note * (octave_offset_multiplier.abs + 1) / 1
    +      end
    +      note
    +    end
     
    -  # Loads the game when the user clicks the "load" option.
    -  def load_game_clicked
    -    game.load
    +    def note_frequencies_octave_5
    +      {
    +        a: 440.0,
    +        a_sharp: 466.16, b_flat: 466.16,
    +        b: 493.88,
    +        c: 523.25,
    +        c_sharp: 554.37, d_flat: 587.33,
    +        d: 587.33,
    +        d_sharp: 622.25, e_flat: 659.25,
    +        e: 659.25,
    +        f: 698.25,
    +        f_sharp: 739.99, g_flat: 739.99,
    +        g: 783.99,
    +        g_sharp: 830.61, a_flat: 830.61
    +      }
    +    end
       end
     end
     
    -$text_based_rpg = TextedBasedGamePresenter.new
    -
    -def tick args
    -  $text_based_rpg.state = args.state
    -  $text_based_rpg.outputs = args.outputs
    -  $text_based_rpg.inputs = args.inputs
    -  $text_based_rpg.tick
    -end
    +$gtk.reset
     
     
    -

    Advanced Rendering - Simple Render Targets - main.rb

    +

    Advanced Rendering - Simple Render Targets - main.rb

    # ./samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
     def tick args
       # args.outputs.render_targets are really really powerful.
    @@ -11586,7 +11964,7 @@ end
     $gtk.reset
     
     
    -

    Advanced Rendering - Render Targets With Tile Manipulation - main.rb

    +

    Advanced Rendering - Render Targets With Tile Manipulation - main.rb

    # ./samples/07_advanced_rendering/02_render_targets_with_tile_manipulation/app/main.rb
     # This sample is meant to show you how to do that dripping transition thing
     #  at the start of the original Doom. Most of this file is here to animate
    @@ -11685,7 +12063,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Advanced Rendering - Render Target Viewports - main.rb

    +

    Advanced Rendering - Render Target Viewports - main.rb

    # ./samples/07_advanced_rendering/03_render_target_viewports/app/main.rb
     =begin
     
    @@ -12157,7 +12535,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Advanced Rendering - Render Primitive Hierarchies - main.rb

    +

    Advanced Rendering - Render Primitive Hierarchies - main.rb

    # ./samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb
     =begin
     
    @@ -12333,7 +12711,7 @@ def collection_of_sprites args
     end
     
     
    -

    Advanced Rendering - Render Primitives As Hash - main.rb

    +

    Advanced Rendering - Render Primitives As Hash - main.rb

    # ./samples/07_advanced_rendering/05_render_primitives_as_hash/app/main.rb
     =begin
     
    @@ -12473,7 +12851,7 @@ def tick args
         flip_horizontally: false,
         angle_anchor_x: 0.5,            # rotation center set to middle
         angle_anchor_y: 0.5
    -  }.sprite
    +  }.sprite!
     
       # Outputs label as primitive using a hash
       args.outputs.primitives << {
    @@ -12487,7 +12865,7 @@ def tick args
         b:         50,
         a:         255,                 # transparency
         font:      "fonts/manaspc.ttf"  # font style
    -  }.label
    +  }.label!
     
       # Outputs solid as primitive using a hash
       args.outputs.primitives << {
    @@ -12499,7 +12877,7 @@ def tick args
         g:  50,
         b:  50,
         a: 255                          # transparency
    -  }.solid
    +  }.solid!
     
       # Outputs border as primitive using a hash
       # Same parameters as solid
    @@ -12512,7 +12890,7 @@ def tick args
         g:  50,
         b:  50,
         a: 255                          # transparency
    -  }.border
    +  }.border!
     
       # Outputs line as primitive using a hash
       args.outputs.primitives << {
    @@ -12524,11 +12902,11 @@ def tick args
         g:   50,
         b:   50,
         a:  255                         # transparency
    -  }.line
    +  }.line!
     end
     
     
    -

    Advanced Rendering - Pixel Arrays - main.rb

    +

    Advanced Rendering - Pixel Arrays - main.rb

    # ./samples/07_advanced_rendering/06_pixel_arrays/app/main.rb
     $gtk.reset
     
    @@ -12573,8 +12951,105 @@ end
     
     
     
    -

    Advanced Rendering - Splitscreen Camera - main.rb

    -
    # ./samples/07_advanced_rendering/07_splitscreen_camera/app/main.rb
    +

    Advanced Rendering - Simple Camera - main.rb

    +
    # ./samples/07_advanced_rendering/07_simple_camera/app/main.rb
    +def tick args
    +  # variables you can play around with
    +  args.state.world.w      ||= 1280
    +  args.state.world.h      ||= 720
    +
    +  args.state.player.x     ||= 0
    +  args.state.player.y     ||= 0
    +  args.state.player.size  ||= 32
    +
    +  args.state.enemy.x      ||= 700
    +  args.state.enemy.y      ||= 700
    +  args.state.enemy.size   ||= 16
    +
    +  args.state.camera.x                ||= 640
    +  args.state.camera.y                ||= 300
    +  args.state.camera.scale            ||= 1.0
    +  args.state.camera.show_empty_space ||= :yes
    +
    +  # instructions
    +  args.outputs.primitives << { x: 0, y:  80.from_top, w: 360, h: 80, r: 0, g: 0, b: 0, a: 128 }.solid!
    +  args.outputs.primitives << { x: 10, y: 10.from_top, text: "arrow keys to move around", r: 255, g: 255, b: 255}.label!
    +  args.outputs.primitives << { x: 10, y: 30.from_top, text: "+/- to change zoom of camera", r: 255, g: 255, b: 255}.label!
    +  args.outputs.primitives << { x: 10, y: 50.from_top, text: "tab to change camera edge behavior", r: 255, g: 255, b: 255}.label!
    +
    +  # render scene
    +  args.outputs[:scene].w = args.state.world.w
    +  args.outputs[:scene].h = args.state.world.h
    +
    +  args.outputs[:scene].solids << { x: 0, y: 0, w: args.state.world.w, h: args.state.world.h, r: 20, g: 60, b: 80 }
    +  args.outputs[:scene].solids << { x: args.state.player.x, y: args.state.player.y,
    +                                   w: args.state.player.size, h: args.state.player.size, r: 80, g: 155, b: 80 }
    +  args.outputs[:scene].solids << { x: args.state.enemy.x, y: args.state.enemy.y,
    +                                   w: args.state.enemy.size, h: args.state.enemy.size, r: 155, g: 80, b: 80 }
    +
    +  # render camera
    +  scene_position = calc_scene_position args
    +  args.outputs.sprites << { x: scene_position.x,
    +                            y: scene_position.y,
    +                            w: scene_position.w,
    +                            h: scene_position.h,
    +                            path: :scene }
    +
    +  # move player
    +  if args.inputs.directional_angle
    +    args.state.player.x += args.inputs.directional_angle.vector_x * 5
    +    args.state.player.y += args.inputs.directional_angle.vector_y * 5
    +    args.state.player.x  = args.state.player.x.clamp(0, args.state.world.w - args.state.player.size)
    +    args.state.player.y  = args.state.player.y.clamp(0, args.state.world.h - args.state.player.size)
    +  end
    +
    +  # +/- to zoom in and out
    +  if args.inputs.keyboard.plus && args.state.tick_count.zmod?(3)
    +    args.state.camera.scale += 0.05
    +  elsif args.inputs.keyboard.hyphen && args.state.tick_count.zmod?(3)
    +    args.state.camera.scale -= 0.05
    +  elsif args.inputs.keyboard.key_down.tab
    +    if args.state.camera.show_empty_space == :yes
    +      args.state.camera.show_empty_space = :no
    +    else
    +      args.state.camera.show_empty_space = :yes
    +    end
    +  end
    +
    +  args.state.camera.scale = args.state.camera.scale.greater(0.1)
    +end
    +
    +def calc_scene_position args
    +  result = { x: args.state.camera.x - (args.state.player.x * args.state.camera.scale),
    +             y: args.state.camera.y - (args.state.player.y * args.state.camera.scale),
    +             w: args.state.world.w * args.state.camera.scale,
    +             h: args.state.world.h * args.state.camera.scale,
    +             scale: args.state.camera.scale }
    +
    +  return result if args.state.camera.show_empty_space == :yes
    +
    +  if result.w < args.grid.w
    +    result.merge!(x: (args.grid.w - result.w).half)
    +  elsif (args.state.player.x * result.scale) < args.grid.w.half
    +    result.merge!(x: 10)
    +  elsif (result.x + result.w) < args.grid.w
    +    result.merge!(x: - result.w + (args.grid.w - 10))
    +  end
    +
    +  if result.h < args.grid.h
    +    result.merge!(y: (args.grid.h - result.h).half)
    +  elsif (result.y) > 10
    +    result.merge!(y: 10)
    +  elsif (result.y + result.h) < args.grid.h
    +    result.merge!(y: - result.h + (args.grid.h - 10))
    +  end
    +
    +  result
    +end
    +
    +
    +

    Advanced Rendering - Splitscreen Camera - main.rb

    +
    # ./samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb
     class CameraMovement
       attr_accessor :state, :inputs, :outputs, :grid
     
    @@ -12972,8 +13447,8 @@ def tick args
     end
     
     
    -

    Advanced Rendering - Z Targeting Camera - main.rb

    -
    # ./samples/07_advanced_rendering/08_z_targeting_camera/app/main.rb
    +

    Advanced Rendering - Z Targeting Camera - main.rb

    +
    # ./samples/07_advanced_rendering/09_z_targeting_camera/app/main.rb
     class Game
       attr_gtk
     
    @@ -13082,7 +13557,60 @@ end
     $gtk.reset
     
     
    -

    Tweening Lerping Easing Functions - Easing Functions - main.rb

    +

    Advanced Rendering - Blend Modes - main.rb

    +
    # ./samples/07_advanced_rendering/10_blend_modes/app/main.rb
    +$gtk.reset
    +
    +def draw_blendmode args, mode
    +  w = 160
    +  h = w
    +  args.state.x += (1280-w) / (args.state.blendmodes.length + 1)
    +  x = args.state.x
    +  y = (720 - h) / 2
    +  s = 'sprites/blue-feathered.png'
    +  args.outputs.sprites << { blendmode_enum: mode.value, x: x, y: y, w: w, h: h, path: s }
    +  args.outputs.labels << [x + (w/2), y, mode.name.to_s, 1, 1, 255, 255, 255]
    +end
    +
    +def tick args
    +
    +  # Different blend modes do different things, depending on what they
    +  # blend against (in this case, the pixels of the background color).
    +  args.state.bg_element ||= 1
    +  args.state.bg_color ||= 255
    +  args.state.bg_color_direction ||= 1
    +  bg_r = (args.state.bg_element == 1) ? args.state.bg_color : 0
    +  bg_g = (args.state.bg_element == 2) ? args.state.bg_color : 0
    +  bg_b = (args.state.bg_element == 3) ? args.state.bg_color : 0
    +  args.state.bg_color += args.state.bg_color_direction
    +  if (args.state.bg_color_direction > 0) && (args.state.bg_color >= 255)
    +    args.state.bg_color_direction = -1
    +    args.state.bg_color = 255
    +  elsif (args.state.bg_color_direction < 0) && (args.state.bg_color <= 0)
    +    args.state.bg_color_direction = 1
    +    args.state.bg_color = 0
    +    args.state.bg_element += 1
    +    if args.state.bg_element >= 4
    +      args.state.bg_element = 1
    +    end
    +  end
    +
    +  args.outputs.background_color = [ bg_r, bg_g, bg_b, 255 ]
    +
    +  args.state.blendmodes ||= [
    +    { name: :none,  value: 0 },
    +    { name: :blend, value: 1 },
    +    { name: :add,   value: 2 },
    +    { name: :mod,   value: 3 },
    +    { name: :mul,   value: 4 }
    +  ]
    +
    +  args.state.x = 0  # reset this, draw_blendmode will increment it.
    +  args.state.blendmodes.each { |blendmode| draw_blendmode args, blendmode }
    +end
    +
    +
    +

    Tweening Lerping Easing Functions - Easing Functions - main.rb

    # ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb
     def tick args
       # STOP! Watch the following presentation first!!!!
    @@ -13218,7 +13746,7 @@ module Easing
     end
     
     
    -

    Tweening Lerping Easing Functions - Cubic Bezier - main.rb

    +

    Tweening Lerping Easing Functions - Cubic Bezier - main.rb

    # ./samples/08_tweening_lerping_easing_functions/02_cubic_bezier/app/main.rb
     def tick args
       args.outputs.background_color = [33, 33, 33]
    @@ -13283,7 +13811,7 @@ def pow n, to
     end
     
     
    -

    Tweening Lerping Easing Functions - Easing Using Spline - main.rb

    +

    Tweening Lerping Easing Functions - Easing Using Spline - main.rb

    # ./samples/08_tweening_lerping_easing_functions/03_easing_using_spline/app/main.rb
     def tick args
       args.state.duration = 10.seconds
    @@ -13305,7 +13833,7 @@ def tick args
     end
     
     
    -

    Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb

    +

    Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb

    # ./samples/08_tweening_lerping_easing_functions/04_parametric_enemy_movement/app/main.rb
     def new_star args
       { x: 1280.randomize(:ratio),
    @@ -13522,7 +14050,7 @@ def tick args
     end
     
     
    -

    Performance - Sprites As Hash - main.rb

    +

    Performance - Sprites As Hash - main.rb

    # ./samples/09_performance/01_sprites_as_hash/app/main.rb
     
     # Sprites represented as Hashes using the queue ~args.outputs.sprites~
    @@ -13565,7 +14093,11 @@ def tick args
     
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    -    puts "* INFO - Please specify the number of sprites to render."
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Sprites, Hashes"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
    @@ -13590,7 +14122,7 @@ def reset_with count: count
     end
     
     
    -

    Performance - Sprites As Entities - main.rb

    +

    Performance - Sprites As Entities - main.rb

    # ./samples/09_performance/02_sprites_as_entities/app/main.rb
     # Sprites represented as Entities using the queue ~args.outputs.sprites~
     # yields nicer access apis over Hashes, but require a bit more code upfront.
    @@ -13633,7 +14165,11 @@ def tick args
     
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    -    puts "* INFO - Please specify the number of sprites to render."
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Sprites, Open Entities"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
    @@ -13658,7 +14194,7 @@ def reset_with count: count
     end
     
     
    -

    Performance - Sprites As Strict Entities - main.rb

    +

    Performance - Sprites As Strict Entities - main.rb

    # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb
     # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
     # yields apis access similar to Entities, but all properties that can be set on the
    @@ -13705,7 +14241,11 @@ def tick args
     
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    -    puts "* INFO - Please specify the number of sprites to render."
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Sprites, Strict Entities"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
    @@ -13730,7 +14270,7 @@ def reset_with count: count
     end
     
     
    -

    Performance - Sprites As Classes - main.rb

    +

    Performance - Sprites As Classes - main.rb

    # ./samples/09_performance/04_sprites_as_classes/app/main.rb
     # Sprites represented as Classes using the queue ~args.outputs.sprites~.
     # gives you full control of property declaration and method invocation.
    @@ -13760,6 +14300,11 @@ end
     def tick args
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Sprites, Classes"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
    @@ -13784,7 +14329,7 @@ def reset_with count: count
     end
     
     
    -

    Performance - Static Sprites As Classes - main.rb

    +

    Performance - Static Sprites As Classes - main.rb

    # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb
     # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.
     # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held
    @@ -13815,19 +14360,24 @@ end
     def tick args
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Static Sprites, Classes"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
       # init
       if args.state.tick_count == 0
         args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
    +    args.outputs.static_sprites << args.state.stars
       end
     
       # update
       args.state.stars.each(&:move)
     
       # render
    -  args.outputs.sprites << args.state.stars
       args.outputs.background_color = [0, 0, 0]
       args.outputs.primitives << args.gtk.current_framerate_primitives
     end
    @@ -13839,7 +14389,7 @@ def reset_with count: count
     end
     
     
    -

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

    +

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

    # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb
     # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.
     # is the fastest approach. This is comparable to what other game engines set as the default behavior.
    @@ -13883,10 +14433,21 @@ class Star
         # path,
         # angle,
         # alpha, red_saturation, green_saturation, blue_saturation
    +    # tile_x, tile_y, tile_w, tile_h,
         # flip_horizontally, flip_vertically,
    -    # tile_x, tile_y, tile_w, tile_h
         # angle_anchor_x, angle_anchor_y,
         # source_x, source_y, source_w, source_h
    +
    +    # The argument order for ffi_draw.draw_sprite_4 is:
    +    # x, y, w, h,
    +    # path,
    +    # angle,
    +    # alpha, red_saturation, green_saturation, blue_saturation
    +    # tile_x, tile_y, tile_w, tile_h,
    +    # flip_horizontally, flip_vertically,
    +    # angle_anchor_x, angle_anchor_y,
    +    # source_x, source_y, source_w, source_h,
    +    # blendmode_enum
       end
     end
     
    @@ -13894,6 +14455,11 @@ end
     def tick args
       # sets console command when sample app initially opens
       if Kernel.global_tick_count == 0
    +    puts ""
    +    puts ""
    +    puts "========================================================="
    +    puts "* INFO: Static Sprites, Classes, Draw Override"
    +    puts "* INFO: Please specify the number of sprites to render."
         args.gtk.console.set_command "reset_with count: 100"
       end
     
    @@ -13915,7 +14481,7 @@ def reset_with count: count
     end
     
     
    -

    Performance - Collision Limits - main.rb

    +

    Performance - Collision Limits - main.rb

    # ./samples/09_performance/07_collision_limits/app/main.rb
     =begin
     
    @@ -13974,7 +14540,7 @@ end
     $gtk.reset
     
     
    -

    Advanced Debugging - Trace Debugging - main.rb

    +

    Advanced Debugging - Trace Debugging - main.rb

    # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb
     class Game
       attr_gtk
    @@ -14031,7 +14597,7 @@ def tick args
     end
     
     
    -

    Advanced Debugging - Trace Debugging Classes - main.rb

    +

    Advanced Debugging - Trace Debugging Classes - main.rb

    # ./samples/10_advanced_debugging/02_trace_debugging_classes/app/main.rb
     class Foobar
       def initialize
    @@ -14057,7 +14623,54 @@ def tick args
     end
     
     
    -

    Advanced Debugging - Unit Tests - exception_raising_tests.rb

    +

    Advanced Debugging - Unit Tests - benchmark_api_tests.rb

    +
    # ./samples/10_advanced_debugging/03_unit_tests/benchmark_api_tests.rb
    +def test_benchmark_api args, assert
    +  result = args.gtk.benchmark iterations: 100,
    +                              only_one: -> () {
    +                                r = 0
    +                                (1..100).each do |i|
    +                                  r += 1
    +                                end
    +                              }
    +
    +  assert.equal! result.first_place.name, :only_one
    +
    +  result = args.gtk.benchmark iterations: 100,
    +                              iterations_100: -> () {
    +                                r = 0
    +                                (1..100).each do |i|
    +                                  r += 1
    +                                end
    +                              },
    +                              iterations_50: -> () {
    +                                r = 0
    +                                (1..50).each do |i|
    +                                  r += 1
    +                                end
    +                              }
    +
    +  assert.equal! result.first_place.name, :iterations_50
    +
    +  result = args.gtk.benchmark iterations: 1,
    +                              iterations_100: -> () {
    +                                r = 0
    +                                (1..100).each do |i|
    +                                  r += 1
    +                                end
    +                              },
    +                              iterations_50: -> () {
    +                                r = 0
    +                                (1..50).each do |i|
    +                                  r += 1
    +                                end
    +                              }
    +
    +  assert.equal! result.too_small_to_measure, true
    +end
    +
    +
    +

    Advanced Debugging - Unit Tests - exception_raising_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb
     begin :shared
       class ExceptionalClass
    @@ -14080,7 +14693,7 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - fn_tests.rb

    +

    Advanced Debugging - Unit Tests - fn_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/fn_tests.rb
     def infinity
       1 / 0
    @@ -14264,13 +14877,13 @@ def test_array_hash args, assert
     end
     
     
    -

    Advanced Debugging - Unit Tests - gen_docs.rb

    +

    Advanced Debugging - Unit Tests - gen_docs.rb

    # ./samples/10_advanced_debugging/03_unit_tests/gen_docs.rb
     # ./dragonruby mygame --eval samples/99_zz_gtk_unit_tests/gen_docs.rb --no-tick
     Kernel.export_docs!
     
     
    -

    Advanced Debugging - Unit Tests - geometry_tests.rb

    +

    Advanced Debugging - Unit Tests - geometry_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/geometry_tests.rb
     begin :shared
       def primitive_representations x, y, w, h
    @@ -14388,7 +15001,7 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - http_tests.rb

    +

    Advanced Debugging - Unit Tests - http_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/http_tests.rb
     def try_assert_or_schedule args, assert
       if $result[:complete]
    @@ -14414,7 +15027,7 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - nil_coercion_tests.rb

    +

    Advanced Debugging - Unit Tests - nil_coercion_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/nil_coercion_tests.rb
     # numbers
     def test_open_entity_add_number args, assert
    @@ -14510,7 +15123,7 @@ def test_open_entity_nil_bug args, assert
     end
     
     
    -

    Advanced Debugging - Unit Tests - object_to_primitive_tests.rb

    +

    Advanced Debugging - Unit Tests - object_to_primitive_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/object_to_primitive_tests.rb
     class PlayerSpriteForTest
     end
    @@ -14530,7 +15143,7 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - parsing_tests.rb

    +

    Advanced Debugging - Unit Tests - parsing_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/parsing_tests.rb
     def test_parse_json args, assert
       result = args.gtk.parse_json '{ "name": "John Doe", "aliases": ["JD"] }'
    @@ -14561,7 +15174,141 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - require_tests.rb

    +

    Advanced Debugging - Unit Tests - pretty_format_tests.rb

    +
    # ./samples/10_advanced_debugging/03_unit_tests/pretty_format_tests.rb
    +def H opts
    +  opts
    +end
    +
    +def A *opts
    +  opts
    +end
    +
    +def assert_format args, assert, hash, expected
    +  actual = args.fn.pretty_format hash
    +  assert.are_equal! actual, expected
    +end
    +
    +def test_pretty_print args, assert
    +  # =============================
    +  # hash with single value
    +  # =============================
    +  input = (H first_name: "John")
    +  expected = <<-S
    +{:first_name "John"}
    +S
    +  (assert_format args, assert, input, expected)
    +
    +  # =============================
    +  # hash with two values
    +  # =============================
    +  input = (H first_name: "John", last_name: "Smith")
    +  expected = <<-S
    +{:first_name "John"
    + :last_name "Smith"}
    +S
    +
    +  (assert_format args, assert, input, expected)
    +
    +  # =============================
    +  # hash with inner hash
    +  # =============================
    +  input = (H first_name: "John",
    +             last_name: "Smith",
    +             middle_initial: "I",
    +             so: (H first_name: "Pocahontas",
    +                    last_name: "Tsenacommacah"),
    +             friends: (A (H first_name: "Side", last_name: "Kick"),
    +                         (H first_name: "Tim", last_name: "Wizard")))
    +  expected = <<-S
    +{:first_name "John"
    + :last_name "Smith"
    + :middle_initial "I"
    + :so {:first_name "Pocahontas"
    +      :last_name "Tsenacommacah"}
    + :friends [{:first_name "Side"
    +            :last_name "Kick"}
    +           {:first_name "Tim"
    +            :last_name "Wizard"}]}
    +S
    +
    +  (assert_format args, assert, input, expected)
    +
    +  # =============================
    +  # array with one value
    +  # =============================
    +  input = (A 1)
    +  expected = <<-S
    +[1]
    +S
    +  (assert_format args, assert, input, expected)
    +
    +  # =============================
    +  # array with multiple values
    +  # =============================
    +  input = (A 1, 2, 3)
    +  expected = <<-S
    +[1
    + 2
    + 3]
    +S
    +  (assert_format args, assert, input, expected)
    +
    +  # =============================
    +  # array with multiple values hashes
    +  # =============================
    +  input = (A (H first_name: "Side", last_name: "Kick"),
    +             (H first_name: "Tim", last_name: "Wizard"))
    +  expected = <<-S
    +[{:first_name "Side"
    +  :last_name "Kick"}
    + {:first_name "Tim"
    +  :last_name "Wizard"}]
    +S
    +
    +  (assert_format args, assert, input, expected)
    +end
    +
    +def test_nested_nested args, assert
    +  # =============================
    +  # nested array in nested hash
    +  # =============================
    +  input = (H type: :root,
    +             text: "Root",
    +             children: (A (H level: 1,
    +                             text: "Level 1",
    +                             children: (A (H level: 2,
    +                                             text: "Level 2",
    +                                             children: [])))))
    +
    +  expected = <<-S
    +{:type :root
    + :text "Root"
    + :children [{:level 1
    +             :text "Level 1"
    +             :children [{:level 2
    +                         :text "Level 2"
    +                         :children []}]}]}
    +
    +S
    +
    +  (assert_format args, assert, input, expected)
    +end
    +
    +def test_scene args, assert
    +  script = <<-S
    +* Scene 1
    +** Narrator
    +They say happy endings don't exist.
    +** Narrator
    +They say true love is a lie.
    +S
    +  input = parse_org args, script
    +  puts (args.fn.pretty_format input)
    +end
    +
    +
    +

    Advanced Debugging - Unit Tests - require_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb
     def write_src path, src
       $gtk.write_file path, src
    @@ -14603,7 +15350,7 @@ def test_require args, assert
     end
     
     
    -

    Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb

    +

    Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb
     def test_serialize args, assert
       GTK::Entity.__reset_id__!
    @@ -14722,7 +15469,7 @@ def test_by_reference_state_strict_entities args, assert
     end
     
     
    -

    Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb

    +

    Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb
     MAX_CODE_GEN_LENGTH = 50
     
    @@ -14832,7 +15579,7 @@ $gtk.reset 100
     $gtk.log_level = :off
     
     
    -

    Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb

    +

    Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb

    # ./samples/10_advanced_debugging/03_unit_tests/suggest_autocompletion_tests.rb
     def default_suggest_autocompletion args
       {
    @@ -14874,7 +15621,7 @@ S
     end
     
     
    -

    Http - Retrieve Images - main.rb

    +

    Http - Retrieve Images - main.rb

    # ./samples/11_http/01_retrieve_images/app/main.rb
     def tick args
       args.outputs.background_color = [0, 0, 0]
    @@ -14931,7 +15678,7 @@ def tick args
     end
     
     
    -

    Http - Web Server - main.rb

    +

    Http - Web Server - main.rb

    # ./samples/11_http/02_web_server/app/main.rb
     def tick args
       args.state.port ||= 3000
    @@ -14962,7 +15709,7 @@ def tick args
     end
     
     
    -

    C Extensions - Basics - main.rb

    +

    C Extensions - Basics - main.rb

    # ./samples/12_c_extensions/01_basics/app/main.rb
     $gtk.ffi_misc.gtk_dlopen("ext")
     include FFI::CExt
    @@ -14976,7 +15723,7 @@ end
     
     
     
    -

    C Extensions - Intermediate - main.rb

    +

    C Extensions - Intermediate - main.rb

    # ./samples/12_c_extensions/02_intermediate/app/main.rb
     $gtk.ffi_misc.gtk_dlopen("ext")
     include FFI::RE
    @@ -14999,7 +15746,7 @@ def tick args
     end
     
     
    -

    C Extensions - Native Pixel Arrays - main.rb

    +

    C Extensions - Native Pixel Arrays - main.rb

    # ./samples/12_c_extensions/03_native_pixel_arrays/app/main.rb
     $gtk.ffi_misc.gtk_dlopen("ext")
     include FFI::CExt
    @@ -15025,7 +15772,7 @@ end
     
     
     
    -

    Path Finding Algorithms - Breadth First Search - main.rb

    +

    Path Finding Algorithms - Breadth First Search - main.rb

    # ./samples/13_path_finding_algorithms/01_breadth_first_search/app/main.rb
     # A visual demonstration of a breadth first search
     # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
    @@ -15721,7 +16468,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Detailed Breadth First Search - main.rb

    +

    Path Finding Algorithms - Detailed Breadth First Search - main.rb

    # ./samples/13_path_finding_algorithms/02_detailed_breadth_first_search/app/main.rb
     # A visual demonstration of a breadth first search
     # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
    @@ -16371,7 +17118,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Breadcrumbs - main.rb

    +

    Path Finding Algorithms - Breadcrumbs - main.rb

    # ./samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb
     class Breadcrumbs
       attr_gtk
    @@ -16920,7 +17667,7 @@ end
      #  end
     
     
    -

    Path Finding Algorithms - Early Exit - main.rb

    +

    Path Finding Algorithms - Early Exit - main.rb

    # ./samples/13_path_finding_algorithms/04_early_exit/app/main.rb
     # Comparison of a breadth first search with and without early exit
     # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
    @@ -17555,7 +18302,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Dijkstra - main.rb

    +

    Path Finding Algorithms - Dijkstra - main.rb

    # ./samples/13_path_finding_algorithms/05_dijkstra/app/main.rb
     # Demonstrates how Dijkstra's Algorithm allows movement costs to be considered
     
    @@ -18403,7 +19150,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Heuristic - main.rb

    +

    Path Finding Algorithms - Heuristic - main.rb

    # ./samples/13_path_finding_algorithms/06_heuristic/app/main.rb
     # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
     
    @@ -19387,7 +20134,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Heuristic With Walls - main.rb

    +

    Path Finding Algorithms - Heuristic With Walls - main.rb

    # ./samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb
     # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
     # The effectiveness of the Heuristic search algorithm is shown through this demonstration.
    @@ -20404,7 +21151,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - A Star - main.rb

    +

    Path Finding Algorithms - A Star - main.rb

    # ./samples/13_path_finding_algorithms/08_a_star/app/main.rb
     # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html
     
    @@ -21437,7 +22184,7 @@ def reset
     end
     
     
    -

    Path Finding Algorithms - Tower Defense - main.rb

    +

    Path Finding Algorithms - Tower Defense - main.rb

    # ./samples/13_path_finding_algorithms/09_tower_defense/app/main.rb
     # An example of some major components in a tower defence game
     # The pathing of the tanks is determined by A* algorithm -- try editing the walls
    @@ -21742,7 +22489,7 @@ def a_star_color
     end
     
     
    -

    3d - 3d Cube - main.rb

    +

    3d - 3d Cube - main.rb

    # ./samples/99_genre_3d/01_3d_cube/app/main.rb
     STARTX             = 0.0
     STARTY             = 0.0
    @@ -21796,7 +22543,7 @@ end
     $gtk.reset
     
     
    -

    3d - Wireframe - main.rb

    +

    3d - Wireframe - main.rb

    # ./samples/99_genre_3d/02_wireframe/app/main.rb
     def tick args
       args.state.model   ||= Object3D.new('data/shuttle.off')
    @@ -21949,11 +22696,11 @@ class Vertex
       end
     end
     
    -

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

    +

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

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

    Arcade - Bullet Hell - main.rb

    +

    Arcade - Bullet Hell - main.rb

    # ./samples/99_genre_arcade/bullet_hell/app/main.rb
     def tick args
       args.state.base_columns   ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }
    @@ -22146,7 +22893,7 @@ def update_enemy_positions args
     end
     
     
    -

    Arcade - Dueling Starships - main.rb

    +

    Arcade - Dueling Starships - main.rb

    # ./samples/99_genre_arcade/dueling_starships/app/main.rb
     class DuelingSpaceships
       attr_accessor :state, :inputs, :outputs, :grid
    @@ -22515,14 +23262,14 @@ def tick args
     end
     
     
    -

    arcade/flappy dragon/credits.txt

    +

    arcade/flappy dragon/credits.txt

    # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt
     code: Amir Rajan, https://twitter.com/amirrajan
     graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel
     
     
     
    -

    arcade/flappy dragon/main.rb

    +

    arcade/flappy dragon/main.rb

    # ./samples/99_genre_arcade/flappy_dragon/app/main.rb
     class FlappyDragon
       attr_accessor :grid, :inputs, :state, :outputs
    @@ -22886,7 +23633,7 @@ def tick args
     end
     
     
    -

    Arcade - Pong - main.rb

    +

    Arcade - Pong - main.rb

    # ./samples/99_genre_arcade/pong/app/main.rb
     def tick args
       defaults args
    @@ -23049,7 +23796,7 @@ begin :assets
     end
     
     
    -

    Arcade - Snakemoji - main.rb

    +

    Arcade - Snakemoji - main.rb

    # ./samples/99_genre_arcade/snakemoji/app/main.rb
     # coding: utf-8
     ################################
    @@ -23218,7 +23965,7 @@ def defaults 🎮
     end
     
     
    -

    Arcade - Solar System - main.rb

    +

    Arcade - Solar System - main.rb

    # ./samples/99_genre_arcade/solar_system/app/main.rb
     # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4
     # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8
    @@ -23330,7 +24077,7 @@ def r
     end
     
     
    -

    Arcade - Sound Golf - main.rb

    +

    Arcade - Sound Golf - main.rb

    # ./samples/99_genre_arcade/sound_golf/app/main.rb
     =begin
     
    @@ -23524,7 +24271,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Arcade - Twinstick - main.rb

    +

    Arcade - Twinstick - main.rb

    # ./samples/99_genre_arcade/twinstick/app/main.rb
     def tick args
       args.state.player         ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}
    @@ -23678,7 +24425,7 @@ def shoot_directional_vector args
       [dx, dy]
     end
     
    -

    Crafting - Craft Game Starting Point - main.rb

    +

    Crafting - Craft Game Starting Point - main.rb

    # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb
     # ==================================================
     # A NOTE TO JAM CRAFT PARTICIPANTS:
    @@ -24105,7 +24852,439 @@ end
     $gtk.reset
     
     
    -

    Dev Tools - Add Buttons To Console - main.rb

    +

    Crafting - Farming Game Starting Point - main.rb

    +
    # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb
    +def tick args
    +  args.state.tile_size     = 80
    +  args.state.player_speed  = 4
    +  args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
    +  generate_map args
    +  #press j to plant a green onion
    +  if args.inputs.keyboard.j
    +  #change this part you can change what you want to plant
    +   args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)
    +   args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)
    +  end
    +  # Adds walls, background, and player to args.outputs.solids so they appear on screen
    +  args.outputs.solids << [0,0,1280,720, 237,189,101]
    +  args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
    +  args.outputs.solids << args.state.walls
    +  args.outputs.solids << args.state.player
    +  args.outputs.solids << args.state.plants
    +  args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]
    +
    +  move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed
    +  move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed
    +  move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed
    +  move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed
    +end
    +
    +# Sets position, size, and color of the tile
    +def tile args, x, y, *color
    +  [x * args.state.tile_size, # sets definition for array using method parameters
    +   y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
    +   args.state.tile_size,
    +   args.state.tile_size,
    +   *color]
    +end
    +
    +# Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
    +def generate_map args
    +  return if args.state.area
    +
    +  # Creates the area of the map. There are 9 rows running horizontally across the screen
    +  # and 16 columns running vertically on the screen. Any spot with a "1" is not
    +  # open for the player to move into (and is green), and any spot with a "0" is available
    +  # for the player to move in.
    +  args.state.area = [
    +    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
    +    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
    +  ].reverse # reverses the order of the area collection
    +
    +  # By reversing the order, the way that the area appears above is how it appears
    +  # on the screen in the game. If we did not reverse, the map would appear inverted.
    +
    +  #The wall starts off with no tiles.
    +  args.state.walls = []
    +  args.state.plants = []
    +
    +  # If v is 1, a green tile is added to args.state.walls.
    +  # If v is 2, a black tile is created as the goal.
    +  args.state.area.map_2d do |y, x, v|
    +    if    v == 1
    +      args.state.walls << tile(args, x, y, 255, 160, 156) # green tile
    +    end
    +  end
    +end
    +
    +# Allows the player to move their box around the screen
    +def move_player args, *vector
    +  box = args.state.player.shift_rect(vector) # box is able to move at an angle
    +
    +  # If the player's box hits a wall, it is not able to move further in that direction
    +  return if args.state.walls
    +                .any_intersect_rect?(box)
    +
    +  # Player's box is able to move at angles (not just the four general directions) fast
    +  args.state.player =
    +    args.state.player
    +        .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then
    +                    vector.y * args.state.player_speed) # the box will move extremely slow
    +end
    +
    +
    +

    Crafting - Farming Game Starting Point - repl.rb

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

    Crafting - Farming Game Starting Point - tests.rb

    +
    # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb
    +# For advanced users:
    +# You can put some quick verification tests here, any method
    +# that starts with the `test_` will be run when you save this file.
    +
    +# Here is an example test and game
    +
    +# To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
    +
    +class MySuperHappyFunGame
    +  attr_gtk
    +
    +  def tick
    +    outputs.solids << [100, 100, 300, 300]
    +  end
    +end
    +
    +def test_universe args, assert
    +  game = MySuperHappyFunGame.new
    +  game.args = args
    +  game.tick
    +  assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    +  assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    +  puts "test_universe completed successfully"
    +end
    +
    +puts "running tests"
    +$gtk.reset 100
    +$gtk.log_level = :off
    +$gtk.tests.start
    +
    +
    +

    Dev Tools - Add Buttons To Console - main.rb

    # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb
     # You can customize the buttons that show up in the Console.
     class GTK::Console::Menu
    @@ -24167,7 +25346,7 @@ def tick args
     end
     
     
    -

    Dev Tools - Animation Creator Starting Point - main.rb

    +

    Dev Tools - Animation Creator Starting Point - main.rb

    # ./samples/99_genre_dev_tools/animation_creator_starting_point/app/main.rb
     class OneBitLowrezPaint
       attr_gtk
    @@ -24272,12 +25451,12 @@ class OneBitLowrezPaint
           label = { x: b.x + state.buttons_frame_selection.size.half,
                     y: b.y,
                     text: "#{i + 1}", r: 180, g: 180, b: 180,
    -                size_enum: -4, alignment_enum: 1 }.label
    +                size_enum: -4, alignment_enum: 1 }.label!
     
    -      selection_border = b.merge(r: 40, g: 40, b: 40).border
    +      selection_border = b.merge(r: 40, g: 40, b: 40).border!
     
           if i == state.animation_frames_selected_index
    -        selection_border = b.merge(r: 40, g: 230, b: 200).border
    +        selection_border = b.merge(r: 40, g: 230, b: 200).border!
           end
     
           [selection_border, label]
    @@ -24616,7 +25795,7 @@ end
     # $gtk.reset
     
     
    -

    Dev Tools - Tile Editor Starting Point - main.rb

    +

    Dev Tools - Tile Editor Starting Point - main.rb

    # ./samples/99_genre_dev_tools/tile_editor_starting_point/app/main.rb
     =begin
     
    @@ -25011,7 +26190,525 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Lowrez - Nokia 3310 - main.rb

    +

    Dungeon Crawl - Classics Jam - main.rb

    +
    # ./samples/99_genre_dungeon_crawl/classics_jam/app/main.rb
    +class Game
    +  attr_gtk
    +
    +  def tick
    +    defaults
    +    render
    +    input
    +    calc
    +  end
    +
    +  def defaults
    +    player.x              ||= 640
    +    player.y              ||= 360
    +    player.w              ||= 16
    +    player.h              ||= 16
    +    player.attacked_at    ||= -1
    +    player.angle          ||= 0
    +    player.future_player  ||= future_player_position 0, 0
    +    player.projectiles    ||= []
    +    player.damage         ||= 0
    +    state.level           ||= create_level level_one_template
    +  end
    +
    +  def render
    +    outputs.sprites << level.walls.map do |w|
    +      w.merge(path: 'sprites/square/gray.png')
    +    end
    +
    +    outputs.sprites << level.spawn_locations.map do |s|
    +      s.merge(path: 'sprites/square/blue.png')
    +    end
    +
    +    outputs.sprites << player.projectiles.map do |p|
    +      p.merge(path: 'sprites/square/blue.png')
    +    end
    +
    +    outputs.sprites << level.enemies.map do |e|
    +      e.merge(path: 'sprites/square/red.png')
    +    end
    +
    +    outputs.sprites << player.merge(path: 'sprites/circle/green.png', angle: player.angle)
    +
    +    outputs.labels << { x: 30, y: 30.from_top, text: "damage: #{player.damage || 0}" }
    +  end
    +
    +  def input
    +    player.angle = inputs.directional_angle || player.angle
    +    if inputs.controller_one.key_down.a || inputs.keyboard.key_down.space
    +      player.attacked_at = state.tick_count
    +    end
    +  end
    +
    +  def calc
    +    calc_player
    +    calc_projectiles
    +    calc_enemies
    +    calc_spawn_locations
    +  end
    +
    +  def calc_player
    +    if player.attacked_at == state.tick_count
    +      player.projectiles << { at: state.tick_count,
    +                              x: player.x,
    +                              y: player.y,
    +                              angle: player.angle,
    +                              w: 4,
    +                              h: 4 }.center_inside_rect(player)
    +    end
    +
    +    if player.attacked_at.elapsed_time > 5
    +      future_player = future_player_position inputs.left_right * 2, inputs.up_down * 2
    +      future_player_collision = future_collision player, future_player, level.walls
    +      player.x = future_player_collision.x if !future_player_collision.dx_collision
    +      player.y = future_player_collision.y if !future_player_collision.dy_collision
    +    end
    +  end
    +
    +  def calc_projectile_collisions entities
    +    entities.each do |e|
    +      e.damage ||= 0
    +      player.projectiles.each do |p|
    +        if !p.collided && (p.intersect_rect? e)
    +          p.collided = true
    +          e.damage  += 1
    +        end
    +      end
    +    end
    +  end
    +
    +  def calc_projectiles
    +    player.projectiles.map! do |p|
    +      dx, dy = p.angle.vector 10
    +      p.merge(x: p.x + dx, y: p.y + dy)
    +    end
    +
    +    calc_projectile_collisions level.walls + level.enemies + level.spawn_locations
    +    player.projectiles.reject! { |p| p.at.elapsed_time > 10000 }
    +    player.projectiles.reject! { |p| p.collided }
    +    level.enemies.reject! { |e| e.damage > e.hp }
    +    level.spawn_locations.reject! { |s| s.damage > s.hp }
    +  end
    +
    +  def calc_enemies
    +    level.enemies.map! do |e|
    +      dx =  0
    +      dx =  1 if e.x < player.x
    +      dx = -1 if e.x > player.x
    +      dy =  0
    +      dy =  1 if e.y < player.y
    +      dy = -1 if e.y > player.y
    +      future_e           = future_entity_position dx, dy, e
    +      future_e_collision = future_collision e, future_e, level.enemies + level.walls
    +      e.next_x = e.x
    +      e.next_y = e.y
    +      e.next_x = future_e_collision.x if !future_e_collision.dx_collision
    +      e.next_y = future_e_collision.y if !future_e_collision.dy_collision
    +      e
    +    end
    +
    +    level.enemies.map! do |e|
    +      e.x = e.next_x
    +      e.y = e.next_y
    +      e
    +    end
    +
    +    level.enemies.each do |e|
    +      player.damage += 1 if e.intersect_rect? player
    +    end
    +  end
    +
    +  def calc_spawn_locations
    +    level.spawn_locations.map! do |s|
    +      s.merge(countdown: s.countdown - 1)
    +    end
    +    level.spawn_locations
    +         .find_all { |s| s.countdown.neg? }
    +         .each do |s|
    +      s.countdown = s.rate
    +      s.merge(countdown: s.rate)
    +      new_enemy = create_enemy s
    +      if !(level.enemies.find { |e| e.intersect_rect? new_enemy })
    +        level.enemies << new_enemy
    +      end
    +    end
    +  end
    +
    +  def create_enemy spawn_location
    +    to_cell(spawn_location.ordinal_x, spawn_location.ordinal_y).merge hp: 2
    +  end
    +
    +  def create_level level_template
    +    {
    +      walls:           level_template.walls.map { |w| to_cell(w.ordinal_x, w.ordinal_y).merge(w) },
    +      enemies:         [],
    +      spawn_locations: level_template.spawn_locations.map { |s| to_cell(s.ordinal_x, s.ordinal_y).merge(s) }
    +    }
    +  end
    +
    +  def level_one_template
    +    {
    +      walls:           [{ ordinal_x: 25, ordinal_y: 20},
    +                        { ordinal_x: 25, ordinal_y: 21},
    +                        { ordinal_x: 25, ordinal_y: 22},
    +                        { ordinal_x: 25, ordinal_y: 23}],
    +      spawn_locations: [{ ordinal_x: 10, ordinal_y: 10, rate: 120, countdown: 0, hp: 5 }]
    +    }
    +  end
    +
    +  def player
    +    state.player ||= {}
    +  end
    +
    +  def level
    +    state.level  ||= {}
    +  end
    +
    +  def future_collision entity, future_entity, others
    +    dx_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dx) }
    +    dy_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dy) }
    +
    +    {
    +      dx_collision: dx_collision,
    +      x: future_entity.dx.x,
    +      dy_collision: dy_collision,
    +      y: future_entity.dy.y
    +    }
    +  end
    +
    +  def future_entity_position dx, dy, entity
    +    {
    +      dx:   entity.merge(x: entity.x + dx),
    +      dy:   entity.merge(y: entity.y + dy),
    +      both: entity.merge(x: entity.x + dx, y: entity.y + dy)
    +    }
    +  end
    +
    +  def future_player_position  dx, dy
    +    future_entity_position dx, dy, player
    +  end
    +
    +  def to_cell ordinal_x, ordinal_y
    +    { x: ordinal_x * 16, y: ordinal_y * 16, w: 16, h: 16 }
    +  end
    +end
    +
    +def tick args
    +  $game ||= Game.new
    +  $game.args = args
    +  $game.tick
    +end
    +
    +$gtk.reset
    +$game = nil
    +
    +
    +

    Fighting - Special Move Inputs - main.rb

    +
    # ./samples/99_genre_fighting/01_special_move_inputs/app/main.rb
    +def tick args
    +  #tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    +  defaults args
    +  render args
    +  input args
    +  calc args
    +end
    +
    +# sets default values and creates empty collections
    +# initialization only happens in the first frame
    +def defaults args
    +  fiddle args
    +
    +  args.state.tick_count = args.state.tick_count
    +  args.state.bridge_top = 128
    +  args.state.player.x  ||= 0                        # initializes player's properties
    +  args.state.player.y  ||= args.state.bridge_top
    +  args.state.player.w  ||= 64
    +  args.state.player.h  ||= 64
    +  args.state.player.dy ||= 0
    +  args.state.player.dx ||= 0
    +  args.state.player.r  ||= 0
    +  args.state.game_over_at ||= 0
    +  args.state.animation_time ||=0
    +
    +  args.state.timeleft ||=0
    +  args.state.timeright ||=0
    +  args.state.lastpush ||=0
    +
    +  args.state.inputlist ||=  ["j","k","l"]
    +end
    +
    +# sets enemy, player, hammer values
    +def fiddle args
    +  args.state.gravity                     = -0.5
    +  args.state.player_jump_power           = 10      # sets player values
    +  args.state.player_jump_power_duration  = 5
    +  args.state.player_max_run_speed        = 20
    +  args.state.player_speed_slowdown_rate  = 0.9
    +  args.state.player_acceleration         = 0.9
    +end
    +
    +# outputs objects onto the screen
    +def render args
    +  if (args.state.player.dx < 0.01) && (args.state.player.dx > -0.01)
    +    args.state.player.dx = 0
    +  end
    +
    +  #move list
    +  (args.layout.rect_group row: 0, col_from_right: 8, drow: 0.3,
    +                          merge: { vertical_alignment_enum: 0, size_enum: -2 },
    +                          group: [
    +                            { text: "move:             WASD" },
    +                            { text: "jump:             Space" },
    +                            { text: "attack forwards:  J (while on ground" },
    +                            { text: "attack upwards:   K (while on groud)" },
    +                            { text: "attack backwards: J (while on ground and holding A)" },
    +                            { text: "attack downwards: K (while in air)" },
    +                            { text: "dash attack:      J, K in quick succession." },
    +                            { text: "shield: hold      J, K at the same time." },
    +                            { text: "dash backwards:   A, A in quick succession." },
    +                          ]).into args.outputs.labels
    +
    +  # registered moves
    +  args.outputs.labels << { x: 0.to_layout_col,
    +                           y: 0.to_layout_row,
    +                           text: "input history",
    +                           size_enum: -2,
    +                           vertical_alignment_enum: 0 }
    +
    +  (args.state.inputlist.take(5)).map do |s|
    +    { text: s, size_enum: -2, vertical_alignment_enum: 0 }
    +  end.yield_self do |group|
    +    (args.layout.rect_group row: 0.3, col: 0, drow: 0.3, group: group).into args.outputs.labels
    +  end
    +
    +
    +  #sprites
    +  player = [args.state.player.x, args.state.player.y,
    +            args.state.player.w, args.state.player.h,
    +            "sprites/square/white.png",
    +            args.state.player.r]
    +
    +  playershield = [args.state.player.x - 20, args.state.player.y - 10,
    +                  args.state.player.w + 20, args.state.player.h + 20,
    +                  "sprites/square/blue.png",
    +                  args.state.player.r,
    +                  0]
    +
    +  playerjab = [args.state.player.x + 32, args.state.player.y,
    +               args.state.player.w, args.state.player.h,
    +               "sprites/isometric/indigo.png",
    +               args.state.player.r,
    +               0]
    +
    +  playerupper = [args.state.player.x, args.state.player.y + 32,
    +                 args.state.player.w, args.state.player.h,
    +                 "sprites/isometric/indigo.png",
    +                 args.state.player.r+90,
    +                 0]
    +
    +  if ((args.state.tick_count - args.state.lastpush) <= 15)
    +    if (args.state.inputlist[0] == "<<")
    +      player = [args.state.player.x, args.state.player.y,
    +                args.state.player.w, args.state.player.h,
    +                "sprites/square/yellow.png", args.state.player.r]
    +    end
    +
    +    if (args.state.inputlist[0] == "shield")
    +      player = [args.state.player.x, args.state.player.y,
    +                args.state.player.w, args.state.player.h,
    +                "sprites/square/indigo.png", args.state.player.r]
    +
    +      playershield = [args.state.player.x - 10, args.state.player.y - 10,
    +                      args.state.player.w + 20, args.state.player.h + 20,
    +                      "sprites/square/blue.png", args.state.player.r, 50]
    +    end
    +
    +    if (args.state.inputlist[0] == "back-attack")
    +      playerjab = [args.state.player.x - 20, args.state.player.y,
    +                   args.state.player.w - 10, args.state.player.h,
    +                   "sprites/isometric/indigo.png", args.state.player.r, 255]
    +    end
    +
    +    if (args.state.inputlist[0] == "forward-attack")
    +      playerjab = [args.state.player.x + 32, args.state.player.y,
    +                   args.state.player.w, args.state.player.h,
    +                   "sprites/isometric/indigo.png", args.state.player.r, 255]
    +    end
    +
    +    if (args.state.inputlist[0] == "up-attack")
    +      playerupper = [args.state.player.x, args.state.player.y + 32,
    +                     args.state.player.w, args.state.player.h,
    +                     "sprites/isometric/indigo.png", args.state.player.r + 90, 255]
    +    end
    +
    +    if (args.state.inputlist[0] == "dair")
    +      playerupper = [args.state.player.x, args.state.player.y - 32,
    +                     args.state.player.w, args.state.player.h,
    +                     "sprites/isometric/indigo.png", args.state.player.r + 90, 255]
    +    end
    +
    +    if (args.state.inputlist[0] == "dash-attack")
    +      playerupper = [args.state.player.x, args.state.player.y + 32,
    +                     args.state.player.w, args.state.player.h,
    +                     "sprites/isometric/violet.png", args.state.player.r + 90, 255]
    +
    +      playerjab = [args.state.player.x + 32, args.state.player.y,
    +                   args.state.player.w, args.state.player.h,
    +                   "sprites/isometric/violet.png", args.state.player.r, 255]
    +    end
    +  end
    +
    +  args.outputs.sprites << playerjab
    +  args.outputs.sprites << playerupper
    +  args.outputs.sprites << player
    +  args.outputs.sprites << playershield
    +
    +  args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    +    [i * 64, args.state.bridge_top - 64, 64, 64]
    +  end
    +end
    +
    +# Performs calculations to move objects on the screen
    +def calc args
    +  # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    +  args.state.player.x  += args.state.player.dx
    +  args.state.player.y  += args.state.player.dy
    +
    +  # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    +  args.state.player.dy += args.state.gravity
    +
    +  # player's y position is either current y position or y position of top of
    +  # bridge, whichever has a greater value
    +  # ensures that the player never goes below the bridge
    +  args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
    +
    +  # player's x position is either the current x position or 0, whichever has a greater value
    +  # ensures that the player doesn't go too far left (out of the screen's scope)
    +  args.state.player.x  = args.state.player.x.greater(0)
    +
    +  # player is not falling if it is located on the top of the bridge
    +  args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    +  #args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
    +end
    +
    +# Resets the player by changing its properties back to the values they had at initialization
    +def reset_player args
    +  args.state.player.x = 0
    +  args.state.player.y = args.state.bridge_top
    +  args.state.player.dy = 0
    +  args.state.player.dx = 0
    +  args.state.enemy.hammers.clear # empties hammer collection
    +  args.state.enemy.hammer_queue.clear # empties hammer_queue
    +  args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    +end
    +
    +# Processes input from the user to move the player
    +def input args
    +  if args.state.inputlist.length > 5
    +    args.state.inputlist.pop
    +  end
    +
    +  should_process_special_move = (args.inputs.keyboard.key_down.j)           ||
    +                                (args.inputs.keyboard.key_down.k)           ||
    +                                (args.inputs.keyboard.key_down.a)           ||
    +                                (args.inputs.keyboard.key_down.d)           ||
    +                                (args.inputs.controller_one.key_down.y)     ||
    +                                (args.inputs.controller_one.key_down.x)     ||
    +                                (args.inputs.controller_one.key_down.left)  ||
    +                                (args.inputs.controller_one.key_down.right)
    +
    +  if (should_process_special_move)
    +    if (args.inputs.keyboard.key_down.j && args.inputs.keyboard.key_down.k) ||
    +       (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.y)
    +      args.state.inputlist.unshift("shield")
    +    elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&
    +          (args.state.inputlist[0] == "forward-attack") && ((args.state.tick_count - args.state.lastpush) <= 15)
    +      args.state.inputlist.unshift("dash-attack")
    +      args.state.player.dx = 20
    +    elsif (args.inputs.keyboard.key_down.j && args.inputs.keyboard.a) ||
    +          (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.left)
    +      args.state.inputlist.unshift("back-attack")
    +    elsif ( args.inputs.controller_one.key_down.x || args.inputs.keyboard.key_down.j)
    +      args.state.inputlist.unshift("forward-attack")
    +    elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&
    +          (args.state.player.y > 128)
    +      args.state.inputlist.unshift("dair")
    +    elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y)
    +      args.state.inputlist.unshift("up-attack")
    +    elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) &&
    +          (args.state.inputlist[0] == "<") &&
    +          ((args.state.tick_count - args.state.lastpush) <= 10)
    +      args.state.inputlist.unshift("<<")
    +      args.state.player.dx = -15
    +    elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a)
    +      args.state.inputlist.unshift("<")
    +      args.state.timeleft = args.state.tick_count
    +    elsif (args.inputs.controller_one.key_down.right || args.inputs.keyboard.key_down.d)
    +      args.state.inputlist.unshift(">")
    +    end
    +
    +    args.state.lastpush = args.state.tick_count
    +  end
    +
    +  if args.inputs.keyboard.space || args.inputs.controller_one.r2   # if the user presses the space bar
    +    args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
    +
    +    # if the time that has passed since the jump is less than the player's jump duration and
    +    # the player is not falling
    +    if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    +      args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
    +    end
    +  end
    +
    +  # if the space bar is in the "up" state (or not being pressed down)
    +  if args.inputs.keyboard.key_up.space || args.inputs.controller_one.key_up.r2
    +    args.state.player.jumped_at = nil # jumped_at is empty
    +    args.state.player.falling = true # the player is falling
    +  end
    +
    +  if args.inputs.left # if left key is pressed
    +    if args.state.player.dx < -5
    +      args.state.player.dx = args.state.player.dx
    +    else
    +      args.state.player.dx = -5
    +    end
    +
    +  elsif args.inputs.right # if right key is pressed
    +    if args.state.player.dx > 5
    +      args.state.player.dx = args.state.player.dx
    +    else
    +      args.state.player.dx = 5
    +    end
    +  else
    +    args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
    +  end
    +
    +  if ((args.state.player.dx).abs > 5) #&& ((args.state.tick_count - args.state.lastpush) <= 10)
    +    args.state.player.dx *= 0.95
    +  end
    +end
    +
    +def tick_instructions args, text, y = 715
    +  return if args.state.key_event_occurred
    +  if args.inputs.mouse.click ||
    +     args.inputs.keyboard.directional_vector ||
    +     args.inputs.keyboard.key_down.enter ||
    +     args.inputs.keyboard.key_down.space ||
    +     args.inputs.keyboard.key_down.escape
    +    args.state.key_event_occurred = true
    +  end
    +
    +  args.outputs.debug << [0, y - 50, 1280, 60].solid
    +  args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +  args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +end
    +
    +
    +

    Lowrez - Nokia 3310 - main.rb

    # ./samples/99_genre_lowrez/nokia_3310/app/main.rb
     require 'app/nokia.rb'
     
    @@ -25620,7 +27317,7 @@ def render_debug args
           text: text,
           size_enum: -1.5,
           r: 255, g: 255, b: 255
    -    }.label
    +    }.label!
       end
     
       args.outputs.debug << {
    @@ -25630,7 +27327,7 @@ def render_debug args
         size_enum: -0.5,
         alignment_enum: 1,
         r: 255, g: 255, b: 255
    -  }.label
    +  }.label!
     end
     
     def snake_demo args
    @@ -25640,7 +27337,7 @@ end
     $gtk.reset
     
     
    -

    Lowrez - Nokia 3310 - nokia.rb

    +

    Lowrez - Nokia 3310 - nokia.rb

    # ./samples/99_genre_lowrez/nokia_3310/app/nokia.rb
     # Emulation of a 64x64 canvas. Don't change this file unless you know what you're doing :-)
     # Head over to main.rb and study the code there.
    @@ -25880,7 +27577,7 @@ module GTK
                 g: 240,
                 b: 216,
                 a: 100
    -          }.line
    +          }.line!
             end
     
             (NOKIA_WIDTH + 1).map_with_index do |i|
    @@ -25893,7 +27590,7 @@ module GTK
                 g: 240,
                 b: 216,
                 a: 100
    -          }.line
    +          }.line!
             end
     
             @args.state.overlay_rendered = true
    @@ -25903,7 +27600,7 @@ module GTK
     end
     
     
    -

    Lowrez - Resolution 64x64 - lowrez.rb

    +

    Lowrez - Resolution 64x64 - lowrez.rb

    # ./samples/99_genre_lowrez/resolution_64x64/app/lowrez.rb
     # Emulation of a 64x64 canvas. Don't change this file unless you know what you're doing :-)
     # Head over to main.rb and study the code there.
    @@ -26077,7 +27774,7 @@ module GTK
     end
     
     
    -

    Lowrez - Resolution 64x64 - main.rb

    +

    Lowrez - Resolution 64x64 - main.rb

    # ./samples/99_genre_lowrez/resolution_64x64/app/main.rb
     require 'app/lowrez.rb'
     
    @@ -26641,7 +28338,7 @@ def render_debug args
             g: 128,
             b: 128,
             a: 80
    -      }.line
    +      }.line!
     
           args.outputs.static_debug << {
             x:  LOWREZ_X_OFFSET + (i * 10),
    @@ -26652,7 +28349,7 @@ def render_debug args
             g: 128,
             b: 128,
             a: 80
    -      }.line
    +      }.line!
         end
       end
     
    @@ -26679,7 +28376,7 @@ def render_debug args
           y: 720 - (i * 20),
           text: text,
           size_enum: -1.5
    -    }.label
    +    }.label!
       end
     
       args.outputs.debug << {
    @@ -26688,13 +28385,13 @@ def render_debug args
         text: "INFO: dev mode is currently enabled. Comment out the invocation of ~render_debug~ within the ~tick~ method to hide the debug layer.",
         size_enum: -0.5,
         alignment_enum: 1
    -  }.label
    +  }.label!
     end
     
     $gtk.reset
     
     
    -

    Platformer - Clepto Frog - main.rb

    +

    Platformer - Clepto Frog - main.rb

    # ./samples/99_genre_platformer/clepto_frog/app/main.rb
     MAP_FILE_PATH = 'app/map.txt'
     
    @@ -27562,7 +29259,7 @@ def tick_instructions args, text, y = 715
     end
     
     
    -

    Platformer - Clepto Frog - map.rb

    +

    Platformer - Clepto Frog - map.rb

    # ./samples/99_genre_platformer/clepto_frog/app/map.rb
     $collisions = [
       [326, 463, 64, 64],
    @@ -28591,14 +30288,14 @@ $mugs = [
     ]
     
     
    -

    Platformer - Gorillas Basic - credits.txt

    +

    Platformer - Gorillas Basic - credits.txt

    # ./samples/99_genre_platformer/gorillas_basic/CREDITS.txt
     code: Amir Rajan, https://twitter.com/amirrajan
     graphics: Nick Culbertson, https://twitter.com/MobyPixel
     
     
     
    -

    Platformer - Gorillas Basic - main.rb

    +

    Platformer - Gorillas Basic - main.rb

    # ./samples/99_genre_platformer/gorillas_basic/app/main.rb
     class YouSoBasicGorillas
       attr_accessor :outputs, :grid, :state, :inputs
    @@ -28975,7 +30672,7 @@ def tick args
     end
     
     
    -

    Platformer - Gorillas Basic - tests.rb

    +

    Platformer - Gorillas Basic - tests.rb

    # ./samples/99_genre_platformer/gorillas_basic/app/tests.rb
     $gtk.reset 100
     $gtk.supress_framerate_warning = true
    @@ -28983,7 +30680,7 @@ $gtk.require 'app/tests/building_generation_tests.rb'
     $gtk.tests.start
     
     
    -

    Platformer - Gorillas Basic - Tests - building_generation_tests.rb

    +

    Platformer - Gorillas Basic - Tests - building_generation_tests.rb

    # ./samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb
     def test_solids args, assert
       game = YouSoBasicGorillas.new
    @@ -29002,7 +30699,7 @@ def test_solids args, assert
     end
     
     
    -

    Platformer - The Little Probe - main.rb

    +

    Platformer - The Little Probe - main.rb

    # ./samples/99_genre_platformer/the_little_probe/app/main.rb
     class FallingCircle
       attr_gtk
    @@ -29893,7 +31590,7 @@ def reset
     end
     
     
    -

    Platformer - The Little Probe - Data - level.txt

    +

    Platformer - The Little Probe - Data - level.txt

    # ./samples/99_genre_platformer/the_little_probe/data/level.txt
     640,8840,1180,8840
     -60,10220,0,9960
    @@ -31377,7 +33074,7 @@ end
     1910,11280,2200,11180
     923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157
     
    -

    Platformer - The Little Probe - Data - level_lava.txt

    +

    Platformer - The Little Probe - Data - level_lava.txt

    # ./samples/99_genre_platformer/the_little_probe/data/level_lava.txt
     100,10740,500,10780
     500,10780,960,10760
    @@ -31615,7 +33312,7 @@ end
     2200,11130,2360,11090
     1840,11230,2200,11130
     
    -

    Rpg Narrative - Choose Your Own Adventure - decision.rb

    +

    Rpg Narrative - Choose Your Own Adventure - decision.rb

    # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/decision.rb
     # Hey there! Welcome to Four Decisions. Here is how you
     # create your decision tree. Remove =being and =end from the text to
    @@ -31656,7 +33353,7 @@ def game
     end
     
     
    -

    Rpg Narrative - Choose Your Own Adventure - main.rb

    +

    Rpg Narrative - Choose Your Own Adventure - main.rb

    # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/main.rb
     =begin
     
    @@ -31792,7 +33489,7 @@ end
     $gtk.reset
     
     
    -

    Rpg Narrative - Return Of Serenity - lowrez_simulator.rb

    +

    Rpg Narrative - Return Of Serenity - lowrez_simulator.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/lowrez_simulator.rb
     ###################################################################################
     # YOU CAN PLAY AROUND WITH THE CODE BELOW, BUT USE CAUTION AS THIS IS WHAT EMULATES
    @@ -31887,7 +33584,7 @@ def render_gridlines_if_needed args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - main.rb

    +

    Rpg Narrative - Return Of Serenity - main.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/main.rb
     require 'app/require.rb'
     
    @@ -32364,7 +34061,7 @@ def player_xs args, x, y
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - require.rb

    +

    Rpg Narrative - Return Of Serenity - require.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/require.rb
     require 'app/lowrez_simulator.rb'
     require 'app/storyline_day_one.rb'
    @@ -32379,7 +34076,7 @@ require 'app/storyline_final_decision.rb'
     require 'app/storyline.rb'
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline.rb

    +

    Rpg Narrative - Return Of Serenity - storyline.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline.rb
     def hotspot_top
       [4, 61, 56, 3]
    @@ -32529,7 +34226,7 @@ def reload_current_scene
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_anka.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_anka.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_anka.rb
     def anka_inside_room args
       {
    @@ -32660,7 +34357,7 @@ def replied_to_anka_back_home args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_blinking_light.rb
     def the_blinking_light args
       {
    @@ -32739,7 +34436,7 @@ def blinking_light_inside_mainframe args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_day_one.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_day_one.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_day_one.rb
     def day_one_beginning args
       {
    @@ -32949,7 +34646,7 @@ def explaining_the_special_power_inside_computer args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_final_decision.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_final_decision.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_decision.rb
     def final_decision_side_of_home args
       {
    @@ -33089,7 +34786,7 @@ def final_decision_ship_status_shared args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_final_message.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_final_message.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_message.rb
     def final_message_sad args
       {
    @@ -33309,7 +35006,7 @@ def final_message_summary args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_alive.rb
     def serenity_alive_side_of_home args
       {
    @@ -33532,7 +35229,7 @@ def serenity_alive_current_message args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_bio.rb
     def serenity_bio_infront_of_home args
       {
    @@ -33687,7 +35384,7 @@ def bad_dream_last_reply args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_introduction.rb
     # decision_graph "Message from Sasha",
     #                "I should reply.",
    @@ -33786,7 +35483,7 @@ def replied_to_introduction_side_of_home args
     end
     
     
    -

    Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb

    +

    Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb

    # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_speed_of_light.rb
     def speed_of_light_front_of_home args
       {
    @@ -33894,7 +35591,7 @@ def speed_of_light_end_of_day args
     end
     
     
    -

    Rpg Roguelike - Roguelike Starting Point - constants.rb

    +

    Rpg Roguelike - Roguelike Starting Point - constants.rb

    # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/constants.rb
     SHOW_LEGEND = true
     SOURCE_TILE_SIZE = 16
    @@ -33906,7 +35603,7 @@ TILE_B = 0
     TILE_A = 255
     
     
    -

    Rpg Roguelike - Roguelike Starting Point - legend.rb

    +

    Rpg Roguelike - Roguelike Starting Point - legend.rb

    # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/legend.rb
     def tick_legend args
       return unless SHOW_LEGEND
    @@ -33975,7 +35672,7 @@ def tick_legend args
     end
     
     
    -

    Rpg Roguelike - Roguelike Starting Point - main.rb

    +

    Rpg Roguelike - Roguelike Starting Point - main.rb

    # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/main.rb
     require 'app/constants.rb'
     require 'app/sprite_lookup.rb'
    @@ -34076,7 +35773,7 @@ def tile_in_game x, y, tile_key
     end
     
     
    -

    Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb

    +

    Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb

    # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/sprite_lookup.rb
     def sprite_lookup
       {
    @@ -34204,7 +35901,7 @@ end
     $gtk.args.state.reserved.sprite_lookup = sprite_lookup
     
     
    -

    Rpg Roguelike - Roguelike Line Of Sight - main.rb

    +

    Rpg Roguelike - Roguelike Line Of Sight - main.rb

    # ./samples/99_genre_rpg_roguelike/02_roguelike_line_of_sight/app/main.rb
     =begin
     
    @@ -34647,7 +36344,7 @@ def tick args
     end
     
     
    -

    Rpg Tactical - Hexagonal Grid - main.rb

    +

    Rpg Tactical - Hexagonal Grid - main.rb

    # ./samples/99_genre_rpg_tactical/hexagonal_grid/app/main.rb
     class HexagonTileGame
       attr_gtk
    @@ -34719,7 +36416,7 @@ end
     $gtk.reset
     
     
    -

    Rpg Tactical - Isometric Grid - main.rb

    +

    Rpg Tactical - Isometric Grid - main.rb

    # ./samples/99_genre_rpg_tactical/isometric_grid/app/main.rb
     class Isometric
         attr_accessor :grid, :inputs, :state, :outputs
    @@ -34985,7 +36682,7 @@ def tick args
     end
     
     
    -

    Rpg Topdown - Topdown Starting Point - main.rb

    +

    Rpg Topdown - Topdown Starting Point - main.rb

    # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb
     =begin
     
    @@ -35101,7 +36798,7 @@ end
     

    Follows is a source code listing for all files that have been open sourced. This code can be found online at https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/.

    -

    args.rb

    +

    args.rb

    # ./dragon/args.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -35115,58 +36812,21 @@ module GTK
       class Args
         include ArgsDeprecated
         include Serialize
    -
    -    # Contains information related to input devices and input events.
    -    #
    -    # @return [Inputs]
         attr_accessor :inputs
    -
    -    # Contains the means to interact with output devices such as the screen.
    -    #
    -    # @return [Outputs]
         attr_accessor :outputs
    -
    -    # Contains the means to interact with the audio mixer.
    -    #
    -    # @return [Hash]
         attr_accessor :audio
    -
    -    # Contains display size information to assist in positioning things on the screen.
    -    #
    -    # @return [Grid]
         attr_accessor :grid
    -
    -    # Provides access to game play recording facilities within Game Toolkit.
    -    #
    -    # @return [Recording]
         attr_accessor :recording
    -
    -    # Gives you access to geometry related functions.
    -    #
    -    # @return [Geometry]
         attr_accessor :geometry
    -
         attr_accessor :fn
    -
    -    # This is where you'll put state associated with your video game.
    -    #
    -    # @return [OpenEntity]
         attr_accessor :state
    -
    -    # Gives you access to the top level DragonRuby runtime.
    -    #
    -    # @return [Runtime]
    +    attr_accessor :temp_state
         attr_accessor :runtime
         alias_method :gtk, :runtime
    -
         attr_accessor :passes
    -
         attr_accessor :wizards
    -
         attr_accessor :layout
    -
         attr_accessor :easing
    -
         attr_accessor :string
     
         def initialize runtime, recording
    @@ -35175,6 +36835,7 @@ module GTK
           @audio = {}
           @passes = []
           @state = OpenEntity.new
    +      @temp_state = OpenEntity.new
           @state.tick_count = -1
           @runtime = runtime
           @recording = recording
    @@ -35204,11 +36865,12 @@ module GTK
     
         def serialize
           {
    -        state: state.as_hash,
    -        inputs: inputs.serialize,
    -        passes: passes.serialize,
    -        outputs: outputs.serialize,
    -        grid: grid.serialize
    +        state:      state.as_hash,
    +        temp_state: temp_state.as_hash,
    +        inputs:     inputs.serialize,
    +        passes:     passes.serialize,
    +        outputs:    outputs.serialize,
    +        grid:       grid.serialize
           }
         end
     
    @@ -35344,7 +37006,7 @@ module GTK
     end
     
     
    -

    assert.rb

    +

    assert.rb

    # ./dragon/assert.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -35372,10 +37034,10 @@ To add an assertion open up this class and write:
     
     class Assert
       def custom_assertion actual, expected, message = nil
    -    # this tell Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).
    +    # this tells Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).
         @assertion_performed = true
     
    -    # perform your custom logic here and rais an exception to denote a failure.
    +    # perform your custom logic here and raise an exception to denote a failure.
     
         raise "Some Error. #{message}."
       end
    @@ -35385,14 +37047,14 @@ end
         attr :assertion_performed
     
     =begin
    -Us this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).
    +Use this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).
     =end
         def ok!
           @assertion_performed = true
         end
     
     =begin
    -Assert if a value is a thruthy value. All assert method take an optional final parameter that is the message to display to the user.
    +Assert if a value is a truthy value. All assert methods take an optional final parameter that is the message to display to the user.
     
     @example
     
    @@ -35446,7 +37108,7 @@ end
           @assertion_performed = true
           if actual != expected
             actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip
    -        message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}.\n#{message}"
    +        message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}\n#{message}"
             raise message
           end
           nil
    @@ -35456,7 +37118,7 @@ end
           @assertion_performed = true
           if actual == expected
             actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip
    -        message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}.\n#{message}"
    +        message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}\n#{message}"
             raise message
           end
           nil
    @@ -35486,7 +37148,7 @@ end
     end
     
     
    -

    attr_gtk.rb

    +

    attr_gtk.rb

    # ./dragon/attr_gtk.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -35509,6 +37171,10 @@ module AttrGTK
         args.state
       end
     
    +  def temp_state
    +    args.temp_state
    +  end
    +
       def inputs
         args.inputs
       end
    @@ -35536,10 +37202,18 @@ module AttrGTK
       def layout
         args.layout
       end
    +
    +  def new_entity entity_type, init_hash = nil, &block
    +    args.state.new_entity entity_type, init_hash, &block
    +  end
    +
    +  def new_entity_strict entity_type, init_hash = nil, &block
    +    args.state.new_entity_strict entity_type, init_hash, &block
    +  end
     end
     
     
    -

    attr_sprite.rb

    +

    attr_sprite.rb

    # ./dragon/attr_sprite.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -35580,7 +37254,7 @@ module AttrSprite
       attr_accessor :x, :y, :w, :h, :path, :angle, :a, :r, :g, :b, :tile_x,
                     :tile_y, :tile_w, :tile_h, :flip_horizontally,
                     :flip_vertically, :angle_anchor_x, :angle_anchor_y, :id,
    -                :source_x, :source_y, :source_w, :source_h
    +                :source_x, :source_y, :source_w, :source_h, :blendmode_enum
     
       def primitive_marker
         :sprite
    @@ -35600,7 +37274,7 @@ module AttrSprite
     end
     
     
    -

    console.rb

    +

    console.rb

    # ./dragon/console.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -35623,7 +37297,7 @@ module GTK
                       :font_style, :menu
     
         def initialize
    -      @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1, line_height: 1.1)
    +      @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)
           @menu = Menu.new self
           @disabled = false
           @log_offset = 0
    @@ -35643,6 +37317,8 @@ module GTK
           @text_color = Color.new [255, 255, 255]
           @error_color = Color.new [200, 50, 50]
           @header_color = Color.new [100, 200, 220]
    +      @code_color = Color.new [210, 168, 255]
    +      @comment_color    = Color.new [0, 200, 100]
           @animation_duration = 1.seconds
           @shown_at = -1
           load_history
    @@ -35917,6 +37593,8 @@ S
     
             if cmd == 'quit' || cmd == ':wq' || cmd == ':q!' || cmd == ':q' || cmd == ':wqa'
               $gtk.request_quit
    +        elsif cmd.start_with? ':'
    +          send ((cmd.gsub '-', '_').gsub ':', '')
             else
               puts "-> #{cmd}"
               begin
    @@ -35925,13 +37603,19 @@ S
                 if $results.nil?
                   puts "=> nil"
                 elsif $results == :console_silent_eval
    +              # do nothing since the console is silent
                 else
                   puts "=> #{$results}"
                 end
                 @last_command_errored = false
               rescue Exception => e
                 try_search_docs e
    -            puts  "* EXCEPTION: #{e}"
    +            # if an exception is thrown and the bactrace includes something helpful, then show it
    +            if (e.backtrace || []).first && (e.backtrace.first.include? "(eval)")
    +              puts  "* EXCEPTION: #{e}"
    +            else
    +              puts  "* EXCEPTION: #{e}\n#{e.__backtrace_to_org__}"
    +            end
               end
             end
           end
    @@ -36158,6 +37842,11 @@ S
           end
     
           render_log_offset args
    +
    +      args.outputs.reserved << { x: 10.from_right, y: @bottom + 10,
    +                                 text: "Press CTRL+g or ESCAPE to clear the prompt.",
    +                                 vertical_alignment_enum: 0,
    +                                 alignment_enum: 2, r: 80, g: 80, b: 80 }.label!
         end
     
         def render_log_offset args
    @@ -36180,7 +37869,7 @@ S
         end
     
         def include_subdued_markers? text
    -      include_any_words? text, subdued_markers
    +      (text.start_with? "* INFO: ") && (include_any_words? text, subdued_markers)
         end
     
         def include_any_words? text, words
    @@ -36326,8 +38015,32 @@ S
           (log_entry.start_with? "**** ")
         end
     
    +    def code? log_entry
    +      (just_symbol? log_entry) || (codeblock_marker? log_entry)
    +    end
    +
    +    def just_symbol? log_entry
    +      scrubbed = log_entry.gsub("*", "").strip
    +      (scrubbed.start_with? ":") && (!scrubbed.include? " ") && (!scrubbed.include? "=>")
    +    end
    +
    +    def code_comment? log_entry
    +      return true  if log_entry.strip.start_with?("# ")
    +      return false
    +    end
    +
    +    def codeblock_marker? log_entry
    +      return true if log_entry.strip.start_with?("#+begin_src")
    +      return true if log_entry.strip.start_with?("#+end_src")
    +      return false
    +    end
    +
         def color_for_log_entry(log_entry)
    -      if include_row_marker? log_entry
    +      if code? log_entry
    +        @code_color
    +      elsif code_comment? log_entry
    +        @comment_color
    +      elsif include_row_marker? log_entry
             @text_color
           elsif include_error_marker? log_entry
             @error_color
    @@ -36374,7 +38087,7 @@ S
     end
     
     
    -

    console_color.rb

    +

    console_color.rb

    # ./dragon/console_color.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -36400,6 +38113,10 @@ module GTK
             @color
           end
     
    +      def to_s
    +        "GTK::Console::Color #{to_h}"
    +      end
    +
           def to_h
             { r: @color[0], g: @color[1], b: @color[2], a: @color[3] }
           end
    @@ -36408,7 +38125,7 @@ module GTK
     end
     
     
    -

    console_font_style.rb

    +

    console_font_style.rb

    # ./dragon/console_font_style.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -36445,14 +38162,14 @@ module GTK
               size_enum: size_enum,
               alignment_enum: alignment_enum,
               **color.to_h,
    -        }.label
    +        }.label!
           end
         end
       end
     end
     
     
    -

    console_menu.rb

    +

    console_menu.rb

    # ./dragon/console_menu.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -36507,7 +38224,7 @@ module GTK
     
           def itch_wizard_clicked
             @console.scroll_to_bottom
    -        $wizards.itch.start
    +        $wizards.itch.restart
           end
     
           def docs_clicked
    @@ -36532,6 +38249,7 @@ module GTK
               @buttons = [
                 (button id: :record,      row: 0, col:   9, text: "record gameplay",       method: :record_clicked),
                 (button id: :replay,      row: 0, col:  10, text: "start replay",          method: :replay_clicked),
    +            *custom_buttons
               ]
             elsif @menu_shown == :hidden
               @buttons = [
    @@ -36590,8 +38308,8 @@ module GTK
               method: method
             }.let do |entity|
               primitives = []
    -          primitives << entity[:rect].merge(a: 164).solid
    -          primitives << entity[:rect].merge(r: 255, g: 255, b: 255).border
    +          primitives << entity[:rect].solid!(a: 164)
    +          primitives << entity[:rect].border!(r: 255, g: 255, b: 255)
               primitives << text.wrapped_lines(5)
                                 .map_with_index do |l, i|
                                   [
    @@ -36615,7 +38333,7 @@ module GTK
     end
     
     
    -

    console_prompt.rb

    +

    console_prompt.rb

    # ./dragon/console_prompt.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -36793,17 +38511,17 @@ S
               "#{" " * (string_width.length - c.length) } #{c} |"
             end.join
     
    -        # remove seperators between empty values
    +        # remove separators between empty values
             formated_row = formated_row.gsub("  |  ", "     ")
     
             puts formated_row
           end
     
    -      def pretty_print_row_seperator string_width, cell_width, column_width, columns
    +      def pretty_print_row_separator string_width, cell_width, column_width, columns
             # this is a joint: +--------
             column_joint = "+#{"-" * cell_width}"
     
    -        # multiple joints create a row seperator: +----+----+
    +        # multiple joints create a row separator: +----+----+
             puts (column_joint * columns) + "+"
           end
     
    @@ -36812,12 +38530,12 @@ S
             args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 0.5,
                                                                y: y + 5,
                                                                x2: x + @cursor_position_px + 0.5,
    -                                                           y2: y + @font_style.letter_size.y + 5)
    +                                                           y2: y + @font_style.letter_size.y + 4)
     
             args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 1,
                                                                y: y + 5,
                                                                x2: x + @cursor_position_px + 1,
    -                                                           y2: y + @font_style.letter_size.y + 5)
    +                                                           y2: y + @font_style.letter_size.y + 4)
     
             # debugging rectangle for string
             # args.outputs.reserved << (@cursor_color.to_h.merge x: x,
    @@ -36892,7 +38610,7 @@ S
     end
     
     
    -

    controller.rb

    +

    controller.rb

    # ./dragon/controller.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37018,7 +38736,7 @@ end
     
     
     
    -

    controller/config.rb

    +

    controller/config.rb

    # ./dragon/controller/config.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37421,7 +39139,7 @@ module GTK
     end
     
     
    -

    controller/keys.rb

    +

    controller/keys.rb

    # ./dragon/controller/keys.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37439,7 +39157,7 @@ module GTK
             :l1, :r1,
             :l2, :r2,
             :l3, :r3,
    -        :start, :select,
    +        :start, :select, :home,
             :directional_up, :directional_down, :directional_left, :directional_right
           ].freeze
     
    @@ -37447,6 +39165,22 @@ module GTK
             attr label
           end
     
    +      def back
    +        @select
    +      end
    +
    +      def back= value
    +        @select = value
    +      end
    +
    +      def guide
    +        @home
    +      end
    +
    +      def guide= value
    +        @home = value
    +      end
    +
           # Activate a key.
           #
           # @return [void]
    @@ -37476,7 +39210,7 @@ module GTK
     end
     
     
    -

    directional_input_helper_methods.rb

    +

    directional_input_helper_methods.rb

    # ./dragon/directional_input_helper_methods.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37493,7 +39227,7 @@ module GTK
     
           error_message = <<-S
     * ERROR
    -The GTK::DirectionalKeys module should only be included in objects that respond to the following api heirarchy:
    +The GTK::DirectionalKeys module should only be included in objects that respond to the following api hierarchy:
     
     - (#{ directional_methods.join("|") })
     - key_held.(#{ directional_methods.join("|") })
    @@ -37550,6 +39284,12 @@ S
           end
         end
     
    +    def directional_angle
    +      return nil unless directional_vector
    +
    +      Math.atan2(up_down, left_right).to_degrees
    +    end
    +
         def method_missing m, *args
           # combine the key with ctrl_
           if m.to_s.start_with?("ctrl_")
    @@ -37572,7 +39312,7 @@ S
     end
     
     
    -

    easing.rb

    +

    easing.rb

    # ./dragon/easing.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37672,7 +39412,7 @@ end
     Easing = GTK::Easing
     
     
    -

    entity.rb

    +

    entity.rb

    # ./dragon/entity.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37767,7 +39507,7 @@ S
     end
     
     
    -

    geometry.rb

    +

    geometry.rb

    # ./dragon/geometry.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -37776,6 +39516,22 @@ end
     
     module GTK
       module Geometry
    +    def self.rotate_point point, angle, around = nil
    +      s = Math.sin a.to_radians
    +      c = Math.cos a.to_radians
    +      px = point.x
    +      py = point.y
    +      cx = 0
    +      cy = 0
    +      if around
    +        cx = around.x
    +        cy = around.y
    +      end
    +
    +      point.merge(x: ((px - cx) * c - (py - cy) * s) + cx,
    +                  y: ((px - cx) * s + (py - cy) * c) + cy)
    +    end
    +
         # Returns f(t) for a cubic Bezier curve.
         def self.cubic_bezier t, a, b, c, d
           s  = 1 - t
    @@ -37857,7 +39613,7 @@ module GTK
         rescue Exception => e
           raise e, <<-S
     * ERROR:
    -center_inside_rect for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +center_inside_rect for self #{self} and other_rect #{other_rect}.\n#{e}.
     S
         end
     
    @@ -37874,7 +39630,7 @@ S
         rescue Exception => e
           raise e, <<-S
     * ERROR:
    -center_inside_rect_x for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +center_inside_rect_x for self #{self} and other_rect #{other_rect}.\n#{e}.
     S
         end
     
    @@ -37891,7 +39647,7 @@ S
         rescue Exception => e
           raise e, <<-S
     * ERROR:
    -center_inside_rect_y for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +center_inside_rect_y for self #{self} and other_rect #{other_rect}.\n#{e}.
     S
         end
     
    @@ -37900,7 +39656,7 @@ S
         end
     
     
    -    # Returns a primitive that is anchored/repositioned based off its retangle.
    +    # Returns a primitive that is anchored/repositioned based off its rectangle.
         # @gtk
         def anchor_rect anchor_x, anchor_y
           current_w = self.w
    @@ -38036,10 +39792,10 @@ S
     
         # @gtk
         def self.intersect_rect? rect_one, rect_two, tolerance = 0.1
    -      return false if rect_one.right - tolerance < rect_two.left + tolerance
    -      return false if rect_one.left + tolerance > rect_two.right - tolerance
    -      return false if rect_one.top - tolerance < rect_two.bottom + tolerance
    -      return false if rect_one.bottom + tolerance > rect_two.top - tolerance
    +      return false if ((rect_one.x + rect_one.w) - tolerance) < (rect_two.x + tolerance)
    +      return false if (rect_one.x + tolerance) > ((rect_two.x + rect_two.w) - tolerance)
    +      return false if ((rect_one.y + rect_one.h) - tolerance) < (rect_two.y + tolerance)
    +      return false if (rect_one.y + tolerance) > ((rect_two.y + rect_two.h) - tolerance)
           return true
         rescue Exception => e
           context_help_rect_one = (rect_one.__help_contract_implementation contract_intersect_rect?)[:not_implemented_methods]
    @@ -38067,6 +39823,7 @@ S
     - rect_one: #{rect_one}
     - rect_two: #{rect_two}
     #{context_help}
    +\n#{e}
     S
         end
     
    @@ -38077,14 +39834,14 @@ S
           y = y.shift_down(size * anchor_y)
           [x, y, size, size]
         rescue Exception => e
    -      raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}."
    +      raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"
         end
     
         # @gtk
         def self.distance point_one, point_two
           Math.sqrt((point_two.x - point_one.x)**2 + (point_two.y - point_one.y)**2)
         rescue Exception => e
    -      raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}."
    +      raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}.\n#{e}"
         end
     
         # @gtk
    @@ -38093,31 +39850,34 @@ S
           d_x = end_point.x - start_point.x
           Math::PI.+(Math.atan2(d_y, d_x)).to_degrees
         rescue Exception => e
    -      raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}."
    +      raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"
         end
     
         # @gtk
         def self.angle_to start_point, end_point
           angle_from end_point, start_point
         rescue Exception => e
    -      raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}."
    +      raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"
         end
     
         # @gtk
         def self.point_inside_circle? point, circle_center_point, radius
           (point.x - circle_center_point.x) ** 2 + (point.y - circle_center_point.y) ** 2 < radius ** 2
         rescue Exception => e
    -      raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}"
    +      raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}.\n#{e}"
         end
     
         # @gtk
         def self.inside_rect? inner_rect, outer_rect, tolerance = 0.0
    +      return nil if !inner_rect
    +      return nil if !outer_rect
    +
           inner_rect.x     + tolerance >= outer_rect.x     - tolerance &&
    -      inner_rect.right - tolerance <= outer_rect.right + tolerance &&
    +      (inner_rect.x + inner_rect.w) - tolerance <= (outer_rect.x + outer_rect.w) + tolerance &&
           inner_rect.y     + tolerance >= outer_rect.y     - tolerance &&
    -      inner_rect.top   - tolerance <= outer_rect.top   + tolerance
    +      (inner_rect.y + inner_rect.h) - tolerance <= (outer_rect.y + outer_rect.h) + tolerance
         rescue Exception => e
    -      raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}."
    +      raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}.\n#{e}"
         end
     
         # @gtk
    @@ -38152,7 +39912,7 @@ S
             return rect
           end
         rescue Exception => e
    -      raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}."
    +      raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"
         end
     
         # @gtk
    @@ -38166,13 +39926,27 @@ S
                                        anchor_x: anchor_x,
                                        anchor_y: anchor_y
         rescue Exception => e
    -      raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)]."
    +      raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)].\n#{e}"
    +    end
    +
    +    def self.rect_to_line rect
    +      l = rect.to_hash.line
    +      l.merge(x2: l.x + l.w - 1,
    +              y2: l.y + l.h)
    +    end
    +
    +    def self.rect_center_point rect
    +      { x: rect.x + rect.w.half, y: rect.y + rect.h.half }
    +    end
    +
    +    def rect_center_point
    +      Geometry.rect_center_point self
         end
       end # module Geometry
     end # module GTK
     
     
    -

    grid.rb

    +

    grid.rb

    # ./dragon/grid.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -38361,11 +40135,19 @@ module GTK
         def bottom_right
           [@right, @bottom].point
         end
    +
    +    def x
    +      0
    +    end
    +
    +    def y
    +      0
    +    end
       end
     end
     
     
    -

    inputs.rb

    +

    inputs.rb

    # ./dragon/inputs.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -38560,6 +40342,30 @@ module GTK
           }
         end
     
    +    def self.method_to_key_hash
    +      return @method_to_key_hash if @method_to_key_hash
    +      @method_to_key_hash = {}
    +      string_representation_overrides ||= {
    +        backspace: '\b'
    +      }
    +      char_to_method_hash.each do |k, v|
    +        v.each do |vi|
    +          t = { char_or_raw_key: k }
    +
    +          if k.is_a? Numeric
    +            t[:raw_key] = k
    +            t[:string_representation] = "raw_key == #{k}"
    +          else
    +            t[:char] = k
    +            t[:string_representation] = "\"#{k.strip}\""
    +          end
    +
    +          @method_to_key_hash[vi] = t
    +        end
    +      end
    +      @method_to_key_hash
    +    end
    +
         def self.char_to_method char, int = nil
           methods = char_to_method_hash[char] || char_to_method_hash[int]
           methods ? methods.dup : [char.to_sym || int]
    @@ -38674,24 +40480,32 @@ S
         end
     
         def method_missing m, *args
    -      begin
    -        define_singleton_method(m) do
    -          r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)
    -          clear_key m
    -          return r
    -        end
    +      if KeyboardKeys.method_to_key_hash[m.without_ending_bang]
    +        begin
    +          define_singleton_method(m) do
    +            r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)
    +            clear_key m
    +            return r
    +          end
     
    -        return self.send m
    -      rescue Exception => e
    -        log_important "#{e}"
    +          return self.send m
    +        rescue Exception => e
    +          log_important "#{e}"
    +        end
           end
     
    +      did_you_mean = KeyboardKeys.method_to_key_hash.find_all do |k, v|
    +        k.to_s[0..1] == m.to_s[0..1]
    +      end.map {|k, v| ":#{k} (#{v[:string_representation]})" }
    +      did_you_mean_string = ""
    +      did_you_mean_string = ". Did you mean #{did_you_mean.join ", "}?"
    +
           raise <<-S
     * ERROR:
    -There is no member on the keyboard called #{m}. Here is a to_s representation of what's available:
    -
    -#{KeyboardKeys.char_to_method_hash.map { |k, v| "[#{k} => #{v.join(",")}]" }.join("  ")}
    +#{KeyboardKeys.method_to_key_hash.map { |k, v| "** :#{k} #{v.string_representation}" }.join("\n")}
     
    +There is no key on the keyboard called :#{m}#{did_you_mean_string}.
    +Full list of available keys =:points_up:=.
     S
         end
     
    @@ -39075,6 +40889,10 @@ module GTK
             (controller_one && controller_one.directional_vector)
         end
     
    +    def directional_angle
    +      keyboard.directional_angle || (controller_one && controller_one.directional_angle)
    +    end
    +
         # Returns a signal indicating right (`1`), left (`-1`), or neither ('0').
         #
         # @return [Integer]
    @@ -39142,21 +40960,14 @@ module GTK
     end
     
     
    -

    ios_wizard.rb

    +

    ios_wizard.rb

    # ./dragon/ios_wizard.rb
    +# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
     # Copyright 2019 DragonRuby LLC
     # MIT License
     # ios_wizard.rb has been released under MIT (*only this file*).
     
    -class WizardException < Exception
    -  attr_accessor :console_primitives
    -
    -  def initialize *console_primitives
    -    @console_primitives = console_primitives
    -  end
    -end
    -
    -class IOSWizard
    +class IOSWizard < Wizard
       def initialize
         @doctor_executed_at = 0
       end
    @@ -39169,23 +40980,45 @@ class IOSWizard
         @steps ||= []
       end
     
    -  def steps_development_build
    +  def prerequisite_steps
         [
           :check_for_xcode,
           :check_for_brew,
           :check_for_certs,
    -      :check_for_device,
    -      :check_for_dev_profile,
    +    ]
    +  end
    +
    +  def app_metadata_retrieval_steps
    +    [
           :determine_team_identifier,
           :determine_app_name,
           :determine_app_id,
    -      :blow_away_temp,
    +    ]
    +  end
    +
    +  def steps_development_build
    +    [
    +      *prerequisite_steps,
    +
    +      :check_for_device,
    +      :check_for_dev_profile,
    +
    +      *app_metadata_retrieval_steps,
    +
    +      :clear_tmp_directory,
           :stage_app,
    +
           :development_write_info_plist,
    +
           :write_entitlements_plist,
           :compile_icons,
    -      :create_payload_directory,
    +      :clear_payload_directory,
    +
    +      :create_payload_directory_dev,
    +
    +      :create_payload,
           :code_sign_payload,
    +
           :create_ipa,
           :deploy
         ]
    @@ -39193,20 +41026,27 @@ class IOSWizard
     
       def steps_production_build
         [
    -      :check_for_xcode,
    -      :check_for_brew,
    -      :check_for_certs,
    +      *prerequisite_steps,
    +
           :check_for_distribution_profile,
    -      :determine_team_identifier,
    -      :determine_app_name,
    -      :determine_app_id,
    -      :blow_away_temp,
    +      :determine_app_version,
    +
    +      *app_metadata_retrieval_steps,
    +
    +      :clear_tmp_directory,
           :stage_app,
    +
           :production_write_info_plist,
    +
           :write_entitlements_plist,
           :compile_icons,
    -      :create_payload_directory,
    +      :clear_payload_directory,
    +
    +      :create_payload_directory_prod,
    +
    +      :create_payload,
           :code_sign_payload,
    +
           :create_ipa,
           :print_publish_help
         ]
    @@ -39242,6 +41082,8 @@ class IOSWizard
         @steps = steps_development_build
         @steps = steps_production_build if @production_build
         @certificate_name = nil
    +    @app_version = opts[:version]
    +    @app_version = "1.0" if @opts[:env] == :dev && !@app_version
         init_wizard_status
         log_info "Starting iOS Wizard so we can deploy to your device."
         @start_at = Kernel.global_tick_count
    @@ -39263,8 +41105,10 @@ class IOSWizard
           log "=" * $console.console_text_width
         else
           log_error e.to_s
    +      log e.__backtrace_to_org__
         end
     
    +    init_wizard_status
         $console.set_command "$wizards.ios.start env: :#{@opts[:env]}"
       end
     
    @@ -39371,13 +41215,66 @@ class IOSWizard
         return "profiles/development.mobileprovision"
       end
     
    +  def ios_metadata_template
    +    <<-S
    +# ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
    +# Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
    +
    +# teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
    +teamid=
    +# appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
    +appid=
    +# appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
    +appname=
    +S
    +  end
    +
    +  def ios_metadata
    +    contents = $gtk.read_file 'metadata/ios_metadata.txt'
    +
    +    if !contents
    +      $gtk.write_file 'metadata/ios_metadata.txt', ios_metadata_template
    +      contents = $gtk.read_file 'metadata/ios_metadata.txt'
    +    end
    +
    +    kvps = contents.each_line
    +                   .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }
    +                   .map do |l|
    +                     key, value = l.split("=")
    +                     [key.strip.to_sym, value.strip]
    +                   end.flatten
    +    Hash[*kvps]
    +  end
    +
    +  def game_metadata
    +    contents = $gtk.read_file 'metadata/game_metadata.txt'
    +
    +    kvps = contents.each_line
    +                   .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }
    +                   .map do |l|
    +                     key, value = l.split("=")
    +                     [key.strip.to_sym, value.strip]
    +                   end.flatten
    +    Hash[*kvps]
    +  end
    +
    +  def raise_ios_metadata_required
    +    raise WizardException.new(
    +            "* mygame/metadata/ios_metadata.txt needs to be filled out.",
    +            "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",
    +            "Instructions for where the values should come from are within metadata/ios_metadata.txt."
    +          )
    +  end
    +
       def determine_team_identifier
    -    @team_name = (team_identifier_from_provisioning_profile @opts[:env])
    -    log_info "Team Identifer is: #{@team_name}"
    +    @team_id = (ios_metadata.teamid || "")
    +    raise_ios_metadata_required if @team_id.strip.length == 0
    +    log_info "Team Identifer is: #{@team_id}"
       end
     
       def determine_app_name
    -    @app_name = (provisioning_profile_xml @opts[:env])[:children].first[:children].first[:children][1][:children].first[:data]
    +    @app_name = (ios_metadata.appname || "")
    +    raise_ios_metadata_required if @app_name.strip.length == 0
         log_info "App name is: #{@app_name}."
       end
     
    @@ -39401,36 +41298,9 @@ class IOSWizard
         $gtk.parse_xml scrubbed
       end
     
    -  def app_id_from_provisioning_profile environment
    -    application_identifier_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]
    -    (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|
    -      if node[:children] && node[:children][0] && node[:children][0][:data] == "application-identifier"
    -        application_identifier_index = i
    -        break
    -      end
    -    end
    -
    -    app_id_with_team_identifier = (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][application_identifier_index + 1][:children].first[:data]
    -    team_identifer = team_identifier_from_provisioning_profile environment
    -    app_id_with_team_identifier.gsub "#{team_identifer}.", ""
    -  end
    -
    -  def team_identifier_from_provisioning_profile environment
    -    team_identifer_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]
    -
    -    (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|
    -      if node[:children] && node[:children][0] && node[:children][0][:data] == "com.apple.developer.team-identifier"
    -        team_identifer_index = i
    -        break
    -      end
    -    end
    -
    -    (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][team_identifer_index + 1][:children].first[:data]
    -  end
    -
       def determine_app_id
    -    @app_id = app_id_from_provisioning_profile @opts[:env]
    -
    +    @app_id = ios_metadata.appid
    +    raise_ios_metadata_required if @app_id.strip.length == 0
         log_info "App Identifier is set to : #{@app_id}"
       end
     
    @@ -39449,7 +41319,7 @@ class IOSWizard
         end
       end
     
    -  def blow_away_temp
    +  def clear_tmp_directory
         sh "rm -rf #{tmp_directory}"
       end
     
    @@ -39590,7 +41460,8 @@ XML
     
         log_info "Creating Entitlements.plist"
     
    -    $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_name}.#{@app_id}").strip
    +    $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip
    +    $gtk.write_file_root "tmp/ios/Entitlements.txt", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip
     
         sh "/usr/bin/plutil -convert binary1 \"#{tmp_directory}/Entitlements.plist\""
         sh "/usr/bin/plutil -convert xml1 \"#{tmp_directory}/Entitlements.plist\""
    @@ -39628,15 +41499,15 @@ XML
             CFBundleExecutable
             :app_name
             CFBundleInfoDictionaryVersion
    -        6.0
    +        :app_version
             CFBundlePackageType
             APPL
             CFBundleShortVersionString
    -        5.6
    +        :app_version
             CFBundleSignature
             ????
             CFBundleVersion
    -        5.6
    +        :app_version
             CFBundleIcons
             
                 CFBundlePrimaryIcon
    @@ -39785,13 +41656,13 @@ XML
             CFBundleIdentifier
             :app_id
             CFBundleInfoDictionaryVersion
    -        6.0
    +        :app_version
             CFBundleName
             :app_name
             CFBundlePackageType
             APPL
             CFBundleShortVersionString
    -        5.2
    +        :app_version
             CFBundleSignature
             ????
             CFBundleSupportedPlatforms
    @@ -39799,7 +41670,7 @@ XML
                     iPhoneOS
             
             CFBundleVersion
    -        5.2
    +        :app_version
             DTCompiler
             com.apple.compilers.llvm.clang.1_0
             DTPlatformBuild
    @@ -39885,6 +41756,7 @@ XML
         info_plist_string.gsub!(":app_id", @app_id)
     
         $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip
    +    $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip
     
         @info_plist_written = true
       end
    @@ -39938,13 +41810,13 @@ XML
             CFBundleIdentifier
             :app_id
             CFBundleInfoDictionaryVersion
    -        6.0
    +        :app_version
             CFBundleName
             :app_name
             CFBundlePackageType
             APPL
             CFBundleShortVersionString
    -        5.2
    +        :app_version
             CFBundleSignature
             ????
             CFBundleSupportedPlatforms
    @@ -39952,7 +41824,7 @@ XML
                     iPhoneOS
             
             CFBundleVersion
    -        5.2
    +        :app_version
             DTCompiler
             com.apple.compilers.llvm.clang.1_0
             DTPlatformBuild
    @@ -40036,8 +41908,10 @@ XML
     
         info_plist_string.gsub!(":app_name", @app_name)
         info_plist_string.gsub!(":app_id", @app_id)
    +    info_plist_string.gsub!(":app_version", @app_version)
     
         $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip
    +    $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip
     
         @info_plist_written = true
       end
    @@ -40059,28 +41933,53 @@ XML
         "#{relative_path}/#{$gtk.cli_arguments[:dragonruby]}"
       end
     
    -  def write_ip_address
    +  def embed_mobileprovision
    +    sh %Q[cp #{@provisioning_profile_path} "#{app_path}/embedded.mobileprovision"]
    +    sh %Q[/usr/bin/plutil -convert binary1 "#{app_path}/Info.plist"]
    +  end
    +
    +  def clear_payload_directory
    +    sh %Q[rm "#{@app_name}".ipa]
    +    sh %Q[rm -rf "#{app_path}/app"]
    +    sh %Q[rm -rf "#{app_path}/sounds"]
    +    sh %Q[rm -rf "#{app_path}/sprites"]
    +    sh %Q[rm -rf "#{app_path}/data"]
    +    sh %Q[rm -rf "#{app_path}/fonts"]
    +  end
    +
    +  def stage_app
    +    sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]
    +    sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]
    +    sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]
    +    sh %Q[cp -r "#{root_folder}/data/" "#{app_path}/data/"]
    +    sh %Q[cp -r "#{root_folder}/fonts/" "#{app_path}/fonts/"]
    +  end
    +
    +  def create_payload
    +    sh %Q[mkdir -p #{tmp_directory}/ipa_root/Payload]
    +    sh %Q[cp -r "#{app_path}" "#{tmp_directory}/ipa_root/Payload"]
    +    sh %Q[chmod -R 755 "#{tmp_directory}/ipa_root/Payload"]
    +  end
    +
    +  def create_payload_directory_dev
    +    # write dev machine's ip address for hotloading
         $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip
    +
    +    embed_mobileprovision
    +    clear_payload_directory
    +    stage_app
       end
     
    -  def create_payload_directory
    -    sh "cp #{@provisioning_profile_path} \"#{app_path}/embedded.mobileprovision\""
    -    sh "/usr/bin/plutil -convert binary1 \"#{app_path}/Info.plist\""
    -    write_ip_address
    -    sh "rm \"#{@app_name}\".ipa"
    -    sh "rm -rf \"#{app_path}/app\""
    -    sh "rm -rf \"#{app_path}/sounds\""
    -    sh "rm -rf \"#{app_path}/sprites\""
    -    sh "rm -rf \"#{app_path}/data\""
    -    sh "rm -rf \"#{app_path}/fonts\""
    -    sh "cp -r \"#{root_folder}/app/\" \"#{app_path}/app/\""
    -    sh "cp -r \"#{root_folder}/sounds/\" \"#{app_path}/sounds/\""
    -    sh "cp -r \"#{root_folder}/sprites/\" \"#{app_path}/sprites/\""
    -    sh "cp -r \"#{root_folder}/data/\" \"#{app_path}/data/\""
    -    sh "cp -r \"#{root_folder}/fonts/\" \"#{app_path}/fonts/\""
    -    sh "mkdir -p #{tmp_directory}/ipa_root/Payload"
    -    sh "cp -r \"#{app_path}\" \"#{tmp_directory}/ipa_root/Payload\""
    -    sh "chmod -R 755 \"#{tmp_directory}/ipa_root/Payload\""
    +  def create_payload_directory_prod
    +    # production builds does not hotload ip address
    +    sh %Q[rm "#{root_folder}/app/server_ip_address.txt"]
    +
    +    embed_mobileprovision
    +    stage_app
    +
    +    # production build marker
    +    sh %Q[mkdir -p "#{app_path}/metadata/"]
    +    sh %Q[touch metadata/DRAGONRUBY_PRODUCTION_BUILD]
       end
     
       def create_ipa
    @@ -40113,10 +42012,22 @@ SCRIPT
       end
     
       def print_publish_help
    -      log_info "Go to https://appstoreconnect.apple.com/apps and create an App if you haven't already done so."
    -      log_info "Go to https://appleid.apple.com and create a 'Application Specific Password'."
    -      log_info "To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."
    -      log_info "Your app is located at ./tmp/ios/#{@app_name}.ipa"
    +    has_transporter = (sh "ls /Applications/Transporter.app").include? "Contents"
    +    if !has_transporter
    +      $gtk.openurl "https://apps.apple.com/us/app/transporter/id1450874784?mt=12"
    +      $console.set_command "$wizards.ios.start env: :#{@opts[:env]}, version: \"#{@opts[:version]}\""
    +      raise WizardException.new(
    +        "* To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."
    +      )
    +    else
    +      sh "mkdir ./tmp/ios/intermediary_artifacts"
    +      sh "mv \"#{tmp_directory}/#{@app_name}.app\" #{tmp_directory}/intermediary_artifacts/"
    +      sh "mv \"#{tmp_directory}/do_zip.sh\" #{tmp_directory}/intermediary_artifacts"
    +      sh "mv \"#{tmp_directory}/Entitlements.plist\" #{tmp_directory}/intermediary_artifacts"
    +      sh "mv \"#{tmp_directory}/ipa_root\" #{tmp_directory}/intermediary_artifacts/"
    +      sh "open /Applications/Transporter.app"
    +      sh "open ./tmp/ios/"
    +    end
       end
     
       def compile_icons
    @@ -40137,47 +42048,43 @@ S
         sh "cp -r \"#{root_folder}/native/\" \"#{app_path}/native/\""
         sh "CODESIGN_ALLOCATE=\"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate\" /usr/bin/codesign -f -s \"#{@certificate_name}\" --entitlements #{tmp_directory}/Entitlements.plist \"#{tmp_directory}/#{@app_name}.app/native/ios-device/ext.dylib\""
       end
    +
    +  def set_version version
    +    @app_version = version
    +    start env: @opts[:env], version: version
    +  end
    +
    +  def app_version
    +    log_info "Attempting to retrieve App Version from metadata/ios_metadata.txt."
    +    ios_version_number = (ios_metadata.version || "").strip
    +    if ios_version_number.length == 0
    +      log_info "Not found. Attempting to retrieve App Version from metadata/game_metadata.txt."
    +      ios_version_number = (game_metadata.version || "").strip
    +    end
    +    ios_version_number
    +  end
    +
    +  def determine_app_version
    +    @app_version = app_version
    +    return if @app_version
    +  end
     end
     
     
    -

    itch_wizard.rb

    +

    itch_wizard.rb

    # ./dragon/itch_wizard.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
     # itch_wizard.rb has been released under MIT (*only this file*).
     
    -class ItchWizard
    +class ItchWizard < Wizard
       def steps
         [
           :check_metadata,
    -      :deploy
    +      :deploy,
         ]
       end
     
    -  def metadata_file_path
    -    "metadata/game_metadata.txt"
    -  end
    -
    -  def get_metadata
    -    metadata = $gtk.read_file metadata_file_path
    -
    -    if !metadata
    -      write_blank_metadata
    -      metadata = $gtk.read_file metadata_file_path
    -    end
    -
    -    dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    -
    -    {
    -      dev_id: dev_id.strip,
    -      dev_title: dev_title.strip,
    -      game_id: game_id.strip,
    -      game_title: game_title.strip,
    -      version: version.strip,
    -      icon: icon.strip
    -    }
    -  end
    -
       def write_blank_metadata
           $gtk.write_file metadata_file_path, <<-S.strip
     #devid=myname
    @@ -40195,7 +42102,7 @@ S
           write_blank_metadata
         end
     
    -    if metadata_text.each_line.to_a.length != 6
    +    if metadata_text.strip.each_line.to_a.length < 6
           write_blank_metadata
         end
     
    @@ -40207,70 +42114,67 @@ S
     
         if metadata[:dev_id].start_with?("#") || !@dev_id
           log "* PROMPT: Please provide your username for Itch."
    -      $console.set_command "$wizards.itch.set_dev_id \"your-itch-username\""
    +      $console.set_command "$wizards.itch.set_dev_id \"#{metadata[:dev_id]}\""
           return :need_dev_id
         end
     
         if metadata[:dev_title].start_with?("#") || !@dev_title
           log "* PROMPT: Please provide developer's/company's name that you want displayed."
    -      $console.set_command "$wizards.itch.set_dev_title \"Your Name\""
    +      $console.set_command "$wizards.itch.set_dev_title \"#{metadata[:dev_title]}\""
           return :need_dev_title
         end
     
         if metadata[:game_id].start_with?("#") || !@game_id
           log "* PROMPT: Please provide the id for you game. This is the id you specified when you set up a new game page on Itch."
    -      $console.set_command "$wizards.itch.set_game_id \"your-game-id\""
    +      $console.set_command "$wizards.itch.set_game_id \"#{metadata[:game_id]}\""
           return :need_game_id
         end
     
         if metadata[:game_title].start_with?("#") || !@game_title
           log "* PROMPT: Please provide the display name for your game. (This can include spaces)"
    -      $console.set_command "$wizards.itch.set_game_title \"Your Game\""
    +      $console.set_command "$wizards.itch.set_game_title \"#{metadata[:game_title]}\""
           return :need_game_title
         end
     
         if metadata[:version].start_with?("#") || !@version
           log "* PROMPT: Please provide the version for your game."
    -      $console.set_command "$wizards.itch.set_version \"1.0\""
    +      $console.set_command "$wizards.itch.set_version \"#{metadata[:version]}\""
           return :need_version
         end
     
         if metadata[:icon].start_with?("#") || !@icon
           log "* PROMPT: Please provide icon path for your game."
    -      $console.set_command "$wizards.itch.set_icon \"icon.png\""
    +      $console.set_command "$wizards.itch.set_icon \"#{metadata[:icon]}\""
           return :need_icon
         end
     
    +    puts "here!! success!!!"
    +
         return :success
       end
     
       def set_dev_id value
         @dev_id = value
    -    write_metadata
         start
       end
     
       def set_dev_title value
         @dev_title = value
    -    write_metadata
         start
       end
     
       def set_game_id value
         @game_id = value
    -    write_metadata
         start
       end
     
       def set_game_title value
         @game_title = value
    -    write_metadata
         start
       end
     
       def set_version value
         @version = value
    -    write_metadata
         start
       end
     
    @@ -40313,7 +42217,7 @@ S
         end
     
         if @icon
    -      text += "icon=metadata/#{@icon}\n"
    +      text += "icon=#{@icon}\n"
         else
           text += "#icon=metadata/icon.png\n"
         end
    @@ -40331,10 +42235,25 @@ S
     
       def deploy
         log_info "* Running dragonruby-publish: #{package_command}"
    -    results = $gtk.exec package_command
    +    $gtk.openurl "http://itch.io/dashboard" if $gtk.platform == "Mac OS X"
    +    if $gtk.platform? :mac
    +      $gtk.exec "rm -rf ./builds"
    +    end
    +    results = $gtk.exec "#{package_command} --only-package"
    +    puts File.expand_path("./builds")
    +
         log "#+begin_src"
         log results
         log "#+end_src"
    +
    +    if $gtk.platform? :mac
    +      $gtk.exec "open ./builds/"
    +    elsif $gtk.platform? :windows
    +      $gtk.exec "powershell \"ii .\""
    +    end
    +
    +    $gtk.openurl "https://itch.io/dashboard"
    +
         :success
       end
     
    @@ -40345,7 +42264,7 @@ S
         steps.each do |m|
           begin
             log_info "Running Itch Wizard Step: ~$wizards.itch.#{m}~"
    -        result = (send m) || :success if @wizard_status[m][:result] != :success
    +        result = (send m) || :success
             @wizard_status[m][:result] = result
             if result != :success
               log_info "Exiting wizard. :#{result}"
    @@ -40412,7 +42331,7 @@ S
     end
     
     
    -

    layout.rb

    +

    layout.rb

    # ./dragon/layout.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -40692,10 +42611,18 @@ module GTK
           device.grid_area.row_count
         end
     
    +    def row_max_index
    +      row_count - 1
    +    end
    +
         def col_count
           device.grid_area.col_count
         end
     
    +    def col_max_index
    +      col_count - 1
    +    end
    +
         def gutter_height
           device.grid_area.gutter
         end
    @@ -40718,18 +42645,124 @@ module GTK
     
         def rect_defaults
           {
    -        row: nil,
    -        col: nil,
    -        h:   1,
    -        w:   1,
    -        dx:  0,
    -        dy:  0,
    -        rect: :control_rect
    +        row:      nil,
    +        col:      nil,
    +        h:        1,
    +        w:        1,
    +        dx:       0,
    +        dx_ratio: 1,
    +        dy:       0,
    +        dy_ratio: 1,
    +        dh_ratio: 1,
    +        dw_ratio: 1,
    +        merge:    nil,
    +        rect:     :control_rect
           }
         end
     
    -    def rect opts
    +    def row n
    +      (rect row: n, col: 0, w: 0, h: 0).x
    +    end
    +
    +    def row_from_bottom n
    +      (rect row: row_count - n, col: 0, w: 0, h: 0).x
    +    end
    +
    +    def col n
    +      (rect row: 0, col: n, w: 0, h: 0).y
    +    end
    +
    +    def col_from_right n
    +      (rect row: 0, col: col_max_index - n, w: 0, h: 0).y
    +    end
    +
    +    def w n
    +      (rect row: 0, col: 0, w: n, h: 1).w
    +    end
    +
    +    def h n
    +      (rect row: 0, col: 0, w: 1, h: n).h
    +    end
    +
    +    def rect_group opts
    +      group = opts.group
    +      r     = opts.row || 0
    +      r     = row_max_index - opts.row_from_bottom if opts.row_from_bottom
    +      c     = opts.col || 0
    +      c     = col_max_index - opts.col_from_right  if opts.col_from_right
    +      drow  = opts.drow || 0
    +      dcol  = opts.dcol || 0
    +      w     = opts.w    || 0
    +      h     = opts.h    || 0
    +      merge = opts[:merge]
    +
    +      running_row = r
    +      running_col = c
    +
    +      running_col = calc_col_offset(opts.col_offset) if opts.col_offset
    +      running_row = calc_row_offset(opts.row_offset) if opts.row_offset
    +
    +      group.map do |i|
    +        group_layout_opts = i.layout || {}
    +        group_layout_opts = group_layout_opts.merge row: running_row,
    +                                                    col: running_col,
    +                                                    merge: merge,
    +                                                    w: w, h: h
    +        result = (rect group_layout_opts).merge i
    +
    +        if (i.is_a? Hash) && (i.primitive_marker == :label)
    +          if    i.alignment_enum == 1
    +            result.x += result.w.half
    +          elsif i.alignment_enum == 2
    +            result.x += result.w
    +          end
    +        end
    +
    +        running_row += drow
    +        running_col += dcol
    +        result
    +      end
    +    end
    +
    +    def calc_row_offset opts = {}
    +      count = opts[:count] || opts[:length] || 0
    +      h     = opts.h || 1
    +      (row_count - (count * h)) / 2.0
    +    end
    +
    +    def calc_col_offset opts = {}
    +      count = opts[:count] || opts[:length] || 0
    +      w     = opts.w || 1
    +      (col_count - (count * w)) / 2.0
    +    end
    +
    +    def point opts = {}
    +      opts.w = 1
    +      opts.h = 1
    +      opts.row ||= 0
    +      opts.col ||= 0
    +      r = rect opts
    +      r.x  += r.w * opts.col_anchor if opts.col_anchor
    +      r.y  += r.h * opts.row_anchor if opts.row_anchor
    +      r
    +    end
    +
    +    def rect *all_opts
    +      if all_opts.length == 1
    +        opts = all_opts.first
    +      else
    +        opts = {}
    +        all_opts.each do |o|
    +          opts.merge! o
    +        end
    +      end
    +
    +      opts.row = row_max_index - opts.row_from_bottom if opts.row_from_bottom
    +      opts.col = col_max_index - opts.col_from_right if opts.col_from_right
           opts = rect_defaults.merge opts
    +      opts.row ||= 0
    +      opts.col ||= 0
    +
           result = send opts[:rect]
           if opts[:row] && opts[:col] && opts[:w] && opts[:h]
             col = rect_col opts[:col], opts[:w]
    @@ -40737,7 +42770,9 @@ module GTK
             result = control_rect.merge x: col.x,
                                         y: row.y,
                                         w: col.w,
    -                                    h: row.h
    +                                    h: row.h,
    +                                    center_x: col.center_x,
    +                                    center_y: row.center_y
           elsif opts[:row] && !opts[:col]
             result = rect_row opts[:row], opts[:h]
           elsif !opts[:row] && opts[:col]
    @@ -40775,13 +42810,21 @@ module GTK
             result[:h] += device.grid_area.gutter * 2
           end
     
    -      result[:x] += opts[:dx] if opts[:dx]
    -      result[:y] += opts[:dy] if opts[:dy]
    -      result[:w] += opts[:dw] if opts[:dw]
    -      result[:h] += opts[:dh] if opts[:dh]
    +      result[:x] += opts[:dx]       if opts[:dx]
    +      result[:x] *= opts[:dx_ratio] if opts[:dx_ratio]
    +      result[:y] += opts[:dy]       if opts[:dy]
    +      result[:y] *= opts[:dy_ratio] if opts[:dy_ratio]
    +      result[:w] += opts[:dw]       if opts[:dw]
    +      result[:w] *= opts[:dw_ratio] if opts[:dw_ratio]
    +      result[:h] += opts[:dh]       if opts[:dh]
    +      result[:h] *= opts[:dh_ratio] if opts[:dh_ratio]
    +      result.merge! opts[:merge]    if opts[:merge]
           result[:row] = opts[:row]
           result[:col] = opts[:col]
     
    +      result[:h] = result[:h].clamp 0
    +      result[:w] = result[:w].clamp 0
    +
           if $gtk.args.grid.name == :center
             result[:x] -= 640
             result[:y] -= 360
    @@ -40816,7 +42859,7 @@ module GTK
     
           row_y = device.h - row_y - row_h
     
    -      result = control_rect.merge y: row_y, h: row_h
    +      result = control_rect.merge y: row_y, h: row_h, center_y: (row_y + row_h.half)
           @rect_cache[:row][index][h] = result
           @rect_cache[:row][index][h]
         end
    @@ -40839,7 +42882,7 @@ module GTK
           col_w = col_w.to_i
           col_w -= 1 if col_w.odd?
     
    -      result = control_rect.merge x: col_x, w: col_w
    +      result = control_rect.merge x: col_x, w: col_w, center_x: (col_x + col_w.half)
           @rect_cache[:col][index][w] = result
           @rect_cache[:col][index][w]
         end
    @@ -40890,6 +42933,26 @@ module GTK
           @device
         end
     
    +    def debug_primitives opts = {}
    +      @primitives ||= col_count.map_with_index do |col|
    +                        row_count.map_with_index do |row|
    +                          cell   = rect row: row, col: col
    +                          center = Geometry.rect_center_point cell
    +                          [
    +                            cell.merge(opts).border,
    +                            cell.merge(opts)
    +                                .label!(x: center.x,
    +                                        y: center.y,
    +                                        text: "#{row},#{col}",
    +                                        size_enum: -3,
    +                                        vertical_alignment_enum: 1,
    +                                        alignment_enum: 1)
    +                          ]
    +                        end
    +                      end
    +                      @primitives
    +    end
    +
         def serialize
           {
             device: @device.serialize,
    @@ -40903,11 +42966,18 @@ module GTK
         def to_s
           serialize.to_s
         end
    +
    +    def reset
    +      @primitives = nil
    +      @rect_cache ||= {}
    +      @rect_cache.clear
    +    end
    +
       end
     end
     
     
    -

    log.rb

    +

    log.rb

    # ./dragon/log.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -41040,6 +43110,11 @@ module GTK
           self.puts message
         end
     
    +    def self.reset
    +      @once = {}
    +      nil
    +    end
    +
         def self.puts_once *ids, message
           id = "#{ids}"
           @once ||= {}
    @@ -41175,7 +43250,52 @@ class Object
     end
     
     
    -

    numeric.rb

    +

    metadata.rb

    +
    # ./dragon/metadata.rb
    +# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
    +# Copyright 2021 DragonRuby LLC
    +# MIT License
    +# metadata.rb has been released under MIT (*only this file*).
    +
    +module Metadata
    +  def metadata_file_path
    +    "metadata/game_metadata.txt"
    +  end
    +
    +  def get_metadata
    +    metadata = $gtk.read_file metadata_file_path
    +
    +    if !metadata
    +      write_blank_metadata
    +      metadata = $gtk.read_file metadata_file_path
    +    end
    +
    +    dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    +
    +    {
    +      dev_id: dev_id.strip,
    +      dev_title: dev_title.strip,
    +      game_id: game_id.strip,
    +      game_title: game_title.strip,
    +      version: version.strip,
    +      icon: icon.strip
    +    }
    +  end
    +
    +  def write_blank_metadata
    +      $gtk.write_file metadata_file_path, <<-S.strip
    +#devid=myname
    +#devtitle=My Name
    +#gameid=mygame
    +#gametitle=My Game
    +#version=0.1
    +#icon=metadata/icon.png
    +S
    +  end
    +end
    +
    +
    +

    numeric.rb

    # ./dragon/numeric.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -41192,6 +43312,35 @@ class Numeric
       alias_method :lte, :<=
       alias_method :__original_eq_eq__, :== unless Numeric.instance_methods.include? :__original_eq_eq__
     
    +  def to_layout_row opts = {}
    +    $layout.rect(row: self,
    +                 col: opts.col || 0,
    +                 w:   opts.w || 0,
    +                 h:   opts.h || 0).y
    +  end
    +
    +  def to_layout_col opts = {}
    +    $layout.rect(row: 0,
    +                 col: self,
    +                 w:   opts.w || 0,
    +                 h:   opts.h || 0).x
    +  end
    +
    +  def to_layout_w
    +    $layout.rect(row: 0, col: 0, w: self, h: 1).w
    +  end
    +
    +  def to_layout_h
    +    $layout.rect(row: 0, col: 0, w: 1, h: self).h
    +  end
    +
    +  def to_layout_row_from_bottom opts = {}
    +    ($layout.row_max_index - self).to_layout_row opts
    +  end
    +
    +  def to_layout_col_from_right opts = {}
    +    ($layout.col_max_index - self).to_layout_col opts
    +  end
     
       # Converts a numeric value representing seconds into frames.
       #
    @@ -41207,10 +43356,26 @@ class Numeric
         self / 2.0
       end
     
    +  def third
    +    self / 3.0
    +  end
    +
    +  def quarter
    +    self / 4.0
    +  end
    +
       def to_byte
         clamp(0, 255).to_i
       end
     
    +  def clamp *opts
    +    min = (opts.at 0)
    +    max = (opts.at 1)
    +    return min if min && self < min
    +    return max if max && self > max
    +    return self
    +  end
    +
       def clamp_wrap min, max
         max, min = min, max if min > max
         return self if self >= min && self <= max
    @@ -41435,7 +43600,7 @@ S
         self * Math::PI.fdiv(180)
       end
     
    -  # Converts a number representing an angle in radians to degress.
    +  # Converts a number representing an angle in radians to degrees.
       #
       # @gtk
       def to_degrees
    @@ -41452,21 +43617,21 @@ S
         GTK::Geometry.to_square(self, x, y, anchor_x, anchor_y)
       end
     
    -  # Returns a normal vector for a number that represents an angle in degress.
    +  # Returns a normal vector for a number that represents an angle in degrees.
       #
       # @gtk
       def vector max_value = 1
         [vector_x(max_value), vector_y(max_value)]
       end
     
    -  # Returns the y component of a normal vector for a number that represents an angle in degress.
    +  # Returns the y component of a normal vector for a number that represents an angle in degrees.
       #
       # @gtk
       def vector_y max_value = 1
         max_value * Math.sin(self.to_radians)
       end
     
    -  # Returns the x component of a normal vector for a number that represents an angle in degress.
    +  # Returns the x component of a normal vector for a number that represents an angle in degrees.
       #
       # @gtk
       def vector_x max_value = 1
    @@ -41493,6 +43658,18 @@ S
         (self % n) == 0
       end
     
    +  def multiply n
    +    self * n
    +  end
    +
    +  def fmult n
    +    self * n.to_f
    +  end
    +
    +  def imult n
    +    (self * n).to_i
    +  end
    +
       def mult n
         self * n
       end
    @@ -41614,12 +43791,6 @@ S
         return gt other
       end
     
    -  def == other
    -    return true if __original_eq_eq__ other
    -    return __original_eq_eq__ other.entity_id if other.is_a? OpenEntity
    -    return false
    -  end
    -
       # @gtk
       def map
         unless block_given?
    @@ -41706,29 +43877,29 @@ S
       end
     
       def - other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self - other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :-, e
       end
     
       def + other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self + other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :+, e
       end
     
       def * other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self * other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :*, e
       end
     
       def / other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self / other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :/, e
       end
    @@ -41758,6 +43929,10 @@ S
       def self.clamp n, min, max
         n.clamp min, max
       end
    +
    +  def mid? l, r
    +    (between? l, r) || (between? r, l)
    +  end
     end
     
     class Fixnum
    @@ -41784,39 +43959,33 @@ class Fixnum
       end
     
       def + other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self + other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :+, e
       end
     
       def * other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self * other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :*, e
       end
     
       def / other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self / other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :/, e
       end
     
       def - other
    -    return nil unless other
    -    super
    +    return self unless other
    +    self - other
       rescue Exception => e
         __raise_arithmetic_exception__ other, :-, e
       end
     
    -  def == other
    -    return true if __original_eq_eq__ other
    -    return __original_eq_eq__ other.entity_id if other.is_a? GTK::OpenEntity
    -    return false
    -  end
    -
       # Returns `-1` if the number is less than `0`. `+1` if the number
       # is greater than `0`. Returns `0` if the number is equal to `0`.
       #
    @@ -41873,28 +44042,28 @@ class Float
       alias_method :__original_divide__,   :- unless Float.instance_methods.include? :__original_divide__
     
       def - other
    -    return nil unless other
    +    return self unless other
         super
       rescue Exception => e
         __raise_arithmetic_exception__ other, :-, e
       end
     
       def + other
    -    return nil unless other
    +    return self unless other
         super
       rescue Exception => e
         __raise_arithmetic_exception__ other, :+, e
       end
     
       def * other
    -    return nil unless other
    +    return self unless other
         super
       rescue Exception => e
         __raise_arithmetic_exception__ other, :*, e
       end
     
       def / other
    -    return nil unless other
    +    return self unless other
         super
       rescue Exception => e
         __raise_arithmetic_exception__ other, :/, e
    @@ -41941,10 +44110,14 @@ class Integer
       def nan?
         false
       end
    +
    +  def center other
    +    (self - other).abs.fdiv(2)
    +  end
     end
     
     
    -

    remote_hotload_client.rb

    +

    remote_hotload_client.rb

    # ./dragon/remote_hotload_client.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -41995,7 +44168,7 @@ module GTK
         def local_state
           @local_state ||= OpenEntity.new
           @local_state.hotload_client ||= @local_state.new_entity(:hotload_client,
    -                                                              notes: "This enitity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",
    +                                                              notes: "This entity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",
                                                                   changes: { },
                                                                   changes_queue: [],
                                                                   reloaded_files_times: [])
    @@ -42141,7 +44314,7 @@ module GTK
     end
     
     
    -

    runtime/autocomplete.rb

    +

    runtime/autocomplete.rb

    # ./dragon/runtime/autocomplete.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -42169,7 +44342,7 @@ module GTK
               sub_index       = index - previous_line[:sum]
               word            = (cursor_line[:line][0..sub_index - 1]).strip
               token           = (word.split " ")[-1]
    -          dots            = (token.split ".")
    +          dots            = (token.split ".").flat_map { |s| s.split "[" }.flat_map { |s| s.split "]" }.flat_map { |s| s.split "(" }.flat_map { |s| s.split ")" }
               dot             = dots[-1]
             end
     
    @@ -42190,6 +44363,10 @@ module GTK
             ignores ||= []
             ignores   = [ignores].flatten
             keys   = keys.map { |k| k.to_s }
    +        keys   = keys.reject { |k| k.include? '"' }
    +                     .reject { |k| k.start_with? "'" }
    +                     .reject { |k| k.include? "," }
    +                     .reject { |k| k.start_with? "#" }
             others = ["def", "end"] +
                      [ :entity_keys_by_ref,
                        :entity_name,
    @@ -42247,6 +44424,10 @@ module GTK
     
               return autocomplete_filter_methods lookup_result.call if lookup_result
     
    +          if dot[0].upcase == dot[0] && (Object.const_defined? dot.to_sym)
    +            return (Object.const_get dot.to_sym).autocomplete_methods
    +          end
    +
               start_collecting = false
               dots_after_state = dots.find_all do |s|
                 if s == "state"
    @@ -42262,10 +44443,16 @@ module GTK
                 target = target.as_hash[k.to_sym] if target.respond_to? :as_hash
               end
     
    -          return autocomplete_filter_methods target.as_hash.keys
    +          if target.respond_to? :as_hash
    +            return autocomplete_filter_methods target.as_hash.keys
    +          else
    +            return autocomplete_filter_methods target.autocomplete_methods
    +          end
             end
     
     
    +        text = text.each_line.reject { |l| l.strip.start_with? "#" }.join "\n"
    +        text = text.each_line.map { |l| l.split("#").first }.join "\n"
             text.gsub!("[", " ")
             text.gsub!("]", " ")
             text.gsub!("(", " ")
    @@ -42281,153 +44468,155 @@ module GTK
     end # end GTK
     
     
    -

    runtime/draw.rb

    -
    # ./dragon/runtime/draw.rb
    +

    runtime/benchmark.rb

    +
    # ./dragon/runtime/benchmark.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    -# draw.rb has been released under MIT (*only this file*).
    +# benchmark.rb has been released under MIT (*only this file*).
     
     module GTK
       class Runtime
    -    module Draw
    -      def primitives pass
    -        if $top_level.respond_to? :primitives_override
    -          return $top_level.tick_render @args, pass
    -        end
    -
    -        # Don't change this draw order unless you understand
    -        # the implications.
    -
    -        # pass.solids.each            { |s| draw_solid s }
    -        # while loops are faster than each with block
    +    module Benchmark
    +      def benchmark_single iterations, name, proc
    +        log <<-S
    +** Invoking :#{name}...
    +S
    +        time_start = Time.now
             idx = 0
    -        length = pass.solids.length
    -        while idx < pass.solids.length
    -          draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster
    +        r = nil
    +        while idx < iterations
    +          r = proc.call
               idx += 1
             end
     
    -        # pass.static_solids.each     { |s| draw_solid s }
    -        idx = 0
    -        length = pass.static_solids.length
    -        while idx < length
    -          draw_solid (pass.static_solids.at idx)
    -          idx += 1
    -        end
    +        result = (Time.now - time_start).round 3
     
    -        # pass.sprites.each           { |s| draw_sprite s }
    -        idx = 0
    -        length = pass.sprites.length
    -        while idx < length
    -          draw_sprite (pass.sprites.at idx)
    -          idx += 1
    -        end
    +        { name: name,
    +          time: result,
    +          time_ms: (result * 1000).to_i }
    +      end
     
    -        # pass.static_sprites.each    { |s| draw_sprite s }
    -        idx = 0
    -        length = pass.static_sprites.length
    -        while idx < length
    -          draw_sprite (pass.static_sprites.at idx)
    -          idx += 1
    -        end
    +      def benchmark opts = {}
    +        iterations = opts.iterations
     
    -        # pass.primitives.each        { |p| draw_primitive p }
    -        idx = 0
    -        length = pass.primitives.length
    -        while idx < length
    -          draw_primitive (pass.primitives.at idx)
    -          idx += 1
    -        end
    +        log <<-S
    +* BENCHMARK: Started
    +** Caller: #{(caller || []).first}
    +** Iterations: #{iterations}
    +S
    +        procs = opts.find_all { |k, v| v.respond_to? :call }
    +
    +        times = procs.map do |(name, proc)|
    +          benchmark_single iterations, name, proc
    +        end.sort_by { |r| r.time }
    +
    +        first_place = times.first
    +        second_place = times.second || first_place
    +
    +        times = times.map do |candidate|
    +          average_time = first_place.time
    +                           .add(candidate.time)
    +                           .abs
    +                           .fdiv(2)
    +
    +          difference_percentage = 0
    +          if average_time == 0
    +            difference_percentage = 0
    +          else
    +            difference_percentage = first_place.time
    +                                      .subtract(candidate.time)
    +                                      .abs
    +                                      .fdiv(average_time)
    +                                      .imult(100)
    +          end
     
    -        # pass.static_primitives.each { |p| draw_primitive p }
    -        idx = 0
    -        length = pass.static_primitives.length
    -        while idx < length
    -          draw_primitive (pass.static_primitives.at idx)
    -          idx += 1
    +          difference_time = ((first_place.time - candidate.time) * 1000).round
    +          candidate.merge(difference_percentage: difference_percentage,
    +                          difference_time: difference_time)
             end
     
    -        # pass.labels.each            { |l| draw_label l }
    -        idx = 0
    -        length = pass.labels.length
    -        while idx < length
    -          draw_label (pass.labels.at idx)
    -          idx += 1
    +        too_small_to_measure = false
    +        if (first_place.time + second_place.time) == 0
    +          too_small_to_measure = true
    +          difference_percentage = 0
    +          log <<-S
    +* BENCHMARK: Average time for experiments were too small. Increase the number of iterations.
    +S
    +        else
    +          difference_percentage = (((first_place.time - second_place.time).abs.fdiv((first_place.time + second_place.time).abs.fdiv(2))) * 100).round
             end
     
    -        # pass.static_labels.each     { |l| draw_label l }
    -        idx = 0
    -        length = pass.static_labels.length
    -        while idx < length
    -          draw_label (pass.static_labels.at idx)
    -          idx += 1
    -        end
    +        difference_time = first_place.time.-(second_place.time).*(1000).abs.round
     
    -        # pass.lines.each             { |l| draw_line l }
    -        idx = 0
    -        length = pass.lines.length
    -        while idx < length
    -          draw_line (pass.lines.at idx)
    -          idx += 1
    -        end
    +        r = {
    +          iterations: iterations,
    +          first_place: first_place,
    +          second_place: second_place,
    +          difference_time: difference_time,
    +          difference_percentage: difference_percentage,
    +          times: times,
    +          too_small_to_measure: too_small_to_measure
    +        }
     
    -        # pass.static_lines.each      { |l| draw_line l }
    -        idx = 0
    -        length = pass.static_lines.length
    -        while idx < pass.static_lines.length
    -          draw_line (pass.static_lines.at idx)
    -          idx += 1
    -        end
    +        log_message = []
    +        only_one_result = first_place.name == second_place.name
     
    -        # pass.borders.each           { |b| draw_border b }
    -        idx = 0
    -        length = pass.borders.length
    -        while idx < length
    -          draw_border (pass.borders.at idx)
    -          idx += 1
    +        if only_one_result
    +          log <<-S
    +* BENCHMARK: #{r.first_place.name} completed in #{r.first_place.time_ms}ms."
    +S
    +        else
    +          log <<-S
    +* BENCHMARK: #{r.message}
    +** Fastest: #{r.first_place.name.inspect}
    +** Second:  #{r.second_place.name.inspect}
    +** Margin:  #{r.difference_percentage}% (#{r.difference_time.abs}ms) #{r.first_place.time_ms}ms vs #{r.second_place.time_ms}ms.
    +** Times:
    +#{r.times.map { |t| "*** #{t.name}: #{t.time_ms}ms (#{t.difference_percentage}% #{t.difference_time.abs}ms)." }.join("\n")}
    +S
             end
     
    -        # pass.static_borders.each    { |b| draw_border b }
    -        idx = 0
    -        length = pass.static_borders.length
    -        while idx < length
    -          draw_border (pass.static_borders.at idx)
    -          idx += 1
    -        end
    +        r
    +      end
    +    end
    +  end
    +end
     
    -        if !$gtk.production
    -          # pass.debug.each        { |r| draw_primitive r }
    -          idx = 0
    -          length = pass.debug.length
    -          while idx < length
    -            draw_primitive (pass.debug.at idx)
    -            idx += 1
    -          end
    +
    +

    runtime/draw.rb

    +
    # ./dragon/runtime/draw.rb
    +# Copyright 2019 DragonRuby LLC
    +# MIT License
    +# draw.rb has been released under MIT (*only this file*).
     
    -          # pass.static_debug.each { |r| draw_primitive r }
    -          idx = 0
    -          length = pass.static_debug.length
    -          while idx < length
    -            draw_primitive (pass.static_debug.at idx)
    -            idx += 1
    -          end
    +module GTK
    +  class Runtime
    +    module Draw
    +      def primitives pass
    +        if $top_level.respond_to? :primitives_override
    +          return $top_level.tick_render @args, pass
             end
     
    -        # pass.reserved.each          { |r| draw_primitive r }
    -        idx = 0
    -        length = pass.reserved.length
    -        while idx < length
    -          draw_primitive (pass.reserved.at idx)
    -          idx += 1
    -        end
    +        fn.each_send pass.solids,            self, :draw_solid
    +        fn.each_send pass.static_solids,     self, :draw_solid
    +        fn.each_send pass.sprites,           self, :draw_sprite
    +        fn.each_send pass.static_sprites,    self, :draw_sprite
    +        fn.each_send pass.primitives,        self, :draw_primitive
    +        fn.each_send pass.static_primitives, self, :draw_primitive
    +        fn.each_send pass.labels,            self, :draw_label
    +        fn.each_send pass.static_labels,     self, :draw_label
    +        fn.each_send pass.lines,             self, :draw_line
    +        fn.each_send pass.static_lines,      self, :draw_line
    +        fn.each_send pass.borders,           self, :draw_border
    +        fn.each_send pass.static_borders,    self, :draw_border
     
    -        # pass.static_reserved.each   { |r| draw_primitive r }
    -        idx = 0
    -        length = pass.static_reserved.length
    -        while idx < length
    -          draw_primitive (pass.static_reserved.at idx)
    -          idx += 1
    +        if !$gtk.production
    +          fn.each_send pass.debug,           self, :draw_primitive
    +          fn.each_send pass.static_debug,    self, :draw_primitive
             end
    +
    +        fn.each_send pass.reserved,          self, :draw_primitive
    +        fn.each_send pass.static_reserved,   self, :draw_primitive
           rescue Exception => e
             pause!
             pretty_print_exception_and_export! e
    @@ -42438,7 +44627,9 @@ module GTK
             if s.respond_to? :draw_override
               s.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a
    +          @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,
    +                                 s.r, s.g, s.b, s.a,
    +                                 (s.blendmode_enum || 1)
             end
           rescue Exception => e
             raise_conversion_for_rendering_failed s, e, :solid
    @@ -42449,14 +44640,15 @@ module GTK
             if s.respond_to? :draw_override
               s.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h,
    -                                  s.path.s_or_default,
    +          @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,
    +                                  (s.path || '').to_s,
                                       s.angle,
                                       s.a, s.r, s.g, s.b,
                                       s.tile_x, s.tile_y, s.tile_w, s.tile_h,
                                       !!s.flip_horizontally, !!s.flip_vertically,
                                       s.angle_anchor_x, s.angle_anchor_y,
    -                                  s.source_x, s.source_y, s.source_w, s.source_h
    +                                  s.source_x, s.source_y, s.source_w, s.source_h,
    +                                  (s.blendmode_enum || 1)
             end
           rescue Exception => e
             raise_conversion_for_rendering_failed s, e, :sprite
    @@ -42467,7 +44659,7 @@ module GTK
             if s.respond_to? :draw_override
               s.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_screenshot s.path.s_or_default,
    +          @ffi_draw.draw_screenshot (s.path || '').to_s,
                                         s.x, s.y, s.w, s.h,
                                         s.angle,
                                         s.a, s.r, s.g, s.b,
    @@ -42485,10 +44677,13 @@ module GTK
             if l.respond_to? :draw_override
               l.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_label l.x, l.y, l.text.s_or_default,
    -                               l.size_enum, l.alignment_enum,
    -                               l.r, l.g, l.b, l.a,
    -                               l.font.s_or_default(nil)
    +          @ffi_draw.draw_label_3 l.x, l.y,
    +                                 (l.text || '').to_s,
    +                                 l.size_enum, l.alignment_enum,
    +                                 l.r, l.g, l.b, l.a,
    +                                 l.font,
    +                                 (l.vertical_alignment_enum || 2),
    +                                 (l.blendmode_enum || 1)
             end
           rescue Exception => e
             raise_conversion_for_rendering_failed l, e, :label
    @@ -42499,7 +44694,21 @@ module GTK
             if l.respond_to? :draw_override
               l.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a
    +          if l.x2
    +            @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,
    +                                  l.r, l.g, l.b, l.a,
    +                                  (l.blendmode_enum || 1)
    +          else
    +            w = l.w || 0
    +            w = 1 if w == 0
    +            h = l.h || 0
    +            h = 1 if h == 0
    +            @ffi_draw.draw_line_2 l.x, l.y,
    +                                  l.x + w - 1,
    +                                  l.y + h - 1,
    +                                  l.r, l.g, l.b, l.a,
    +                                  (l.blendmode_enum || 1)
    +          end
             end
           rescue Exception => e
             raise_conversion_for_rendering_failed l, e, :line
    @@ -42510,7 +44719,9 @@ module GTK
             if s.respond_to? :draw_override
               s.draw_override @ffi_draw
             else
    -          @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a
    +          @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,
    +                                  s.r, s.g, s.b, s.a,
    +                                  (s.blendmode_enum || 1)
             end
           rescue Exception => e
             raise_conversion_for_rendering_failed s, e, :border
    @@ -42530,13 +44741,12 @@ module GTK
             pause!
             pretty_print_exception_and_export! e
           end
    -
         end
       end
     end
     
     
    -

    runtime/framerate.rb

    +

    runtime/framerate.rb

    # ./dragon/runtime/framerate.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -42623,7 +44833,7 @@ module GTK
     end # end module GTK
     
     
    -

    runtime/framerate_diagnostics.rb

    +

    runtime/framerate_diagnostics.rb

    # ./dragon/runtime/framerate_diagnostics.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
    @@ -42742,7 +44952,7 @@ If this warning is getting annoying put the following in your tick method:
     
           def framerate_diagnostics_primitives
             [
    -          { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid,
    +          { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid!,
               {
                 x: 5,
                 y: 5.from_top,
    @@ -42751,7 +44961,7 @@ If this warning is getting annoying put the following in your tick method:
                 g: 255,
                 b: 255,
                 size_enum: -2
    -          }.label,
    +          }.label!,
               {
                 x: 5,
                 y: 20.from_top,
    @@ -42760,7 +44970,7 @@ If this warning is getting annoying put the following in your tick method:
                 g: 255,
                 b: 255,
                 size_enum: -2
    -          }.label,
    +          }.label!,
               {
                 x: 5,
                 y: 35.from_top,
    @@ -42769,7 +44979,7 @@ If this warning is getting annoying put the following in your tick method:
                 g: 255,
                 b: 255,
                 size_enum: -2
    -          }.label,
    +          }.label!,
               {
                 x: 5,
                 y: 50.from_top,
    @@ -42778,7 +44988,7 @@ If this warning is getting annoying put the following in your tick method:
                 g: 255,
                 b: 255,
                 size_enum: -2
    -          }.label,
    +          }.label!,
               {
                 x: 5,
                 y: 65.from_top,
    @@ -42787,7 +44997,7 @@ If this warning is getting annoying put the following in your tick method:
                 g: 255,
                 b: 255,
                 size_enum: -2
    -          }.label,
    +          }.label!,
             ]
           end
     
    @@ -42796,7 +45006,7 @@ If this warning is getting annoying put the following in your tick method:
     end
     
     
    -

    runtime/hotload.rb

    +

    runtime/hotload.rb

    # ./dragon/runtime/hotload.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -42810,7 +45020,14 @@ module GTK
           def hotload_init
             @hotload_if_needed = 0
             @mailbox_if_needed = 0
    +
    +        # schema for file_mtimes
    +        # { FILE_PATH: { current: (Time as Fixnum),
    +        #                last:    (Time as Fixnum) },
    +        #   FILE_PATH: { current: (Time as Fixnum),
    +        #                last:    (Time as Fixnum) } }
             @file_mtimes = { }
    +
             @suppress_mailbox = true
             files_to_reload.each { |f| init_mtimes f }
             init_mtimes 'app/mailbox.rb'
    @@ -42848,6 +45065,7 @@ module GTK
                 'dragon/symbol.rb',
                 'dragon/numeric_deprecated.rb',
                 'dragon/numeric.rb',
    +            'dragon/hash_deprecated.rb',
                 'dragon/hash.rb',
                 'dragon/outputs_deprecated.rb',
                 'dragon/array_docs.rb',
    @@ -42880,6 +45098,7 @@ module GTK
                 'dragon/trace.rb',
                 'dragon/readme_docs.rb',
                 'dragon/hotload_client.rb',
    +            'dragon/wizards.rb',
                 'dragon/ios_wizard.rb',
                 'dragon/itch_wizard.rb',
               ] + core_files_to_reload + @required_files
    @@ -42898,10 +45117,8 @@ module GTK
           end
     
           def init_mtimes file
    -        current_key = "current_#{file}".to_sym
    -        last_key = "last_#{file}".to_sym
    -        @file_mtimes[current_key] ||= @ffi_file.mtime(file)
    -        @file_mtimes[last_key] ||= @ffi_file.mtime(file)
    +        @file_mtimes[file] ||= { current: @ffi_file.mtime(file),
    +                                 last: @ffi_file.mtime(file) }
           end
     
           def hotload_source_files
    @@ -42933,32 +45150,43 @@ module GTK
           end
     
           def hotload_if_needed
    +        return if Kernel.tick_count < 0
             hotload_source_files
             check_mailbox
           end
     
           def on_load_succeeded file
    -        @rcb_sender.files_reloaded << file
    -        @rcb_sender.reloaded_files << file
    +        self.files_reloaded << file
    +        self.reloaded_files << file
             Trace.untrace_classes!
           end
     
    +      def reset_all_mtimes
    +        @file_mtimes.each do |file, _|
    +          @file_mtimes[file].current = @ffi_file.mtime(file)
    +          @file_mtimes[file].last    = @file_mtimes[file].current
    +        end
    +
    +        files_to_reload.each do |file, _|
    +          @file_mtimes[file] ||= {}
    +          @file_mtimes[file].current = @ffi_file.mtime(file)
    +          @file_mtimes[file].last    = @file_mtimes[file].current
    +        end
    +      end
    +
           def reload_if_needed file, force = false
    -        current_key = "current_#{file}".to_sym
    -        last_key = "last_#{file}".to_sym
    -        @file_mtimes[current_key] ||= nil
    -        @file_mtimes[last_key] ||= nil
    -        @file_mtimes[current_key] = @ffi_file.mtime(file)
    -        return if !force && @file_mtimes[last_key] == @file_mtimes[current_key]
    +        @file_mtimes[file] ||= { current: @ffi_file.mtime(file), last: @ffi_file.mtime(file) }
    +        @file_mtimes[file].current = @ffi_file.mtime(file)
    +        return if !force && @file_mtimes[file].current == @file_mtimes[file].last
             on_load_succeeded file if reload_ruby_file file
    -        @file_mtimes[last_key] = @file_mtimes[current_key]
    +        @file_mtimes[file].last = @file_mtimes[file].current
           end
         end
       end
     end
     
     
    -

    string.rb

    +

    string.rb

    # ./dragon/string.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -42991,6 +45219,30 @@ S
         end
       end
     
    +  def char_byte
    +    return nil if self.length == 0
    +    c = self.each_char.first.bytes
    +    c = c.first if c.is_a? Enumerable
    +    c
    +  end
    +
    +  def insert_character_at index, char
    +    t = each_char.to_a
    +    t = (t.insert index, char)
    +    t.join
    +  end
    +
    +  def excluding_character_at index
    +    t = each_char.to_a
    +    t.delete_at index
    +    t.join
    +  end
    +
    +  def excluding_last_character
    +    return "" if self.length <= 1
    +    return excluding_character_at(self.length - 1)
    +  end
    +
       def end_with_bang?
         self[-1] == "!"
       end
    @@ -43070,7 +45322,7 @@ S
     end
     
     
    -

    tests.rb

    +

    tests.rb

    # ./dragon/tests.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -43206,14 +45458,14 @@ S
           log "#{self.failed.length} test(s) failed."
           self.failed.each do |h|
             log "**** Test name: :#{h[:m]}"
    -        log "#{h[:e].to_s.gsub("* ERROR:", "").strip}"
    +        log "#{h[:e].to_s.gsub("* ERROR:", "").strip}\n#{h[:e].__backtrace_to_org__}"
           end
         end
       end
     end
     
     
    -

    trace.rb

    +

    trace.rb

    # ./dragon/trace.rb
     # coding: utf-8
     # Copyright 2019 DragonRuby LLC
    @@ -43401,12 +45653,46 @@ module GTK
     end
     
     
    -

    wizards.rb

    +

    wizards.rb

    # ./dragon/wizards.rb
     # Copyright 2019 DragonRuby LLC
     # MIT License
     # wizards.rb has been released under MIT (*only this file*).
     
    +class Wizard
    +  def metadata_file_path
    +    "metadata/game_metadata.txt"
    +  end
    +
    +  def get_metadata
    +    metadata = $gtk.read_file metadata_file_path
    +
    +    if !metadata
    +      write_blank_metadata
    +      metadata = $gtk.read_file metadata_file_path
    +    end
    +
    +    dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    +
    +    {
    +      dev_id:     dev_id.strip.gsub("#", "").gsub("devid=", ""),
    +      dev_title:  dev_title.strip.gsub("#", "").gsub("devtitle=", ""),
    +      game_id:    game_id.strip.gsub("#", "").gsub("gameid=", ""),
    +      game_title: game_title.strip.gsub("#", "").gsub("gametitle=", ""),
    +      version:    version.strip.gsub("#", "").gsub("version=", ""),
    +      icon:       icon.strip.gsub("#", "").gsub("icon=", "")
    +    }
    +  end
    +end
    +
    +class WizardException < Exception
    +  attr_accessor :console_primitives
    +
    +  def initialize *console_primitives
    +    @console_primitives = console_primitives
    +  end
    +end
    +
     module GTK
       class Wizards
         attr_accessor :ios, :itch
    diff --git a/docs/docs.txt b/docs/docs.txt
    index 0b543de..c07fbcd 100644
    --- a/docs/docs.txt
    +++ b/docs/docs.txt
    @@ -11,8 +11,6 @@ to get fancy you can provide a ~lambda~ to filter documentation:
       docs_search { |entry| (entry.include? "Array") && (!entry.include? "Enumerable") }
     #+end_src
     
    -[[docs_search.gif]]
    -
     * Hello World
     
     Welcome to DragonRuby Game Toolkit. Take the steps below to get started.
    @@ -37,20 +35,25 @@ Reply with:
     I am a Dragon Rider.
     #+end_quote
     
    -* Watch Some Intro Videos
    +* Intro Videos
    +
    +Here are some videos to help you get the lay of the land.
     
    -Each video is only 20 minutes and all of them will fit into a lunch
    -break. So please watch them:
    +** Quick Api Tour
     
     1. Beginner Introduction to DragonRuby Game Toolkit: [[https://youtu.be/ixw7TJhU08E]]
    -2. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]
    -3. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]
     
    -The second and third videos are not required if you are proficient
    -with Ruby, but *definitely* watch the first one.
    +** If You Are Completely New to Ruby and Programming
    +
    +1. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]
    +2. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]
    +3. You may also want to try this free course provided at [[http://dragonruby.school]].
    +
    +** If You Have Game Dev Experience
     
    -You may also want to try this free course provided at
    -[[http://dragonruby.school]].
    +1. Building Tetris - Part 1: [[https://youtu.be/xZMwRSbC4rY]]
    +2. Building Tetris - Part 2: [[https://youtu.be/C3LLzDUDgz4]]
    +3. Low Res Game Jam Tutorial: [[https://youtu.be/pCI90ukKCME]]
     
     * Getting Started Tutorial
     
    @@ -392,7 +395,7 @@ Console type: ~$wizards.ios.start~ and you will be guided through the
     deployment process.
     
     To deploy to Android, you need to have an Android emulator/device, and
    -a environment that is able to run Android SDK. ~dragonruby-publish~
    +an environment that is able to run Android SDK. ~dragonruby-publish~
     will create an APK for you. From there, you can sign the APK and
     install it to your device. The signing and installation procedure
     varies from OS to OS. Here's an example of what the command might look
    @@ -411,7 +414,7 @@ The following tenants of DragonRuby are what set us apart from other
     game engines. Given that Game Toolkit is a relatively new engine,
     there are definitely features that are missing. So having a big check
     list of "all the cool things" is not this engine's forte. This is
    -compensated with a strong commitment to the following principals.
    +compensated with a strong commitment to the following principles.
     
     ** Challenge The Status Quo
     
    @@ -440,10 +443,10 @@ overwhelms beginners who are new to the engine or programming in general.
     DragonRuby's philosophy is to provide multiple options across the "make it
     fast" vs "make it right" spectrum, with incremental/intuitive
     transitions between the options provided. A concrete example of this philosophy
    -would be render primitives: the spectrum of options allows renderable constructs take
    -the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with),
    +would be render primitives: the spectrum of options allows renderable constructs that
    +take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with),
     hashes (a little more work, but gives you the ability to add additional properties),
    -open and string entities (more work than hashes, but yields cleaner apis),
    +open and strict entities (more work than hashes, but yields cleaner apis),
     and finally - if you really need full power/flexibility in rendering - classes
     (which take the most amount of code and programming knowledge to create).
     
    @@ -570,7 +573,7 @@ The elevator pitch is:
     DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels"
     within the runtime allows us to target platforms no other Ruby can
     target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo
    -Switch, PS4, Xbox, and Scadia.
    +Switch, PS4, Xbox, and Stadia.
     
     **** What does Multilevel Cross-platform mean?
     
    @@ -648,7 +651,7 @@ file called ~repl.rb~ and put it in ~mygame/app/repl.rb~:
     
     - If you use the `repl` method, the code will be executed and the DragonRuby Console will automatically open so you can see the results (on Mac and Linux, the results will also be printed to the terminal).
     
    -- All ~puts~ statements will also be saved to ~logs/log.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.
    +- All ~puts~ statements will also be saved to ~logs/puts.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.
     
     4. To ignore code in ~repl.rb~, instead of commenting it out, prefix ~repl~ with the letter ~x~ and it'll be ignored.
     
    @@ -684,7 +687,7 @@ challenges in creating something that is compatible.
     You can use DragonRuby's replay capabilities to troubleshoot:
     
     1. DragonRuby is hot loaded which gives you a very fast feedback loop (if the game throws an exception, it's because of the code you just added).
    -2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recoding by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.
    +2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recording by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.
     3. DragonRuby also ships with a unit testing facility. You can invoke the following command to run a test: ~./dragonruby . --eval some_ruby_file.rb --no-tick~.
     4. Get into the habit of adding debugging facilities within the game itself. You can add drawing primitives to ~args.outputs.debug~ that will render on top of your game but will be ignored in a production release.
     5. Debugging something that runs at 60fps is (imo) not that helpful. The exception you are seeing could have been because of a change that occurred many frames ago.
    @@ -697,7 +700,7 @@ Let's check the official source for the answer to this question:
     isrubydead.com: [[https://isrubydead.com/]].
     
     On a more serious note, Ruby's _quantity_ levels aren't what they used
    -to be. And that's totally fine. Every one chases the new and shiny.
    +to be. And that's totally fine. Everyone chases the new and shiny.
     
     What really matters is _quality/maturity_. Here is the latest (StackOverflow
     Survey sorted by highest paid developers)[https://insights.stackoverflow.com/survey/2019#top-paying-technologies].
    @@ -771,13 +774,11 @@ questions asked.
     
     *** But still, you should offer a free version. So I can try it out and see if I like it.
     
    -You can try our [web-based sandbox environment](). But it won't do the
    -runtime justice. Or just come to our [Slack]() or [Discord]() channel
    -and ask questions. We'd be happy to have a one on one video chat with
    -you and show off all the cool stuff we're doing.
    +You can try our web-based sandbox environment at [[http://fiddle.dragonruby.org]]. But it won't do the
    +runtime justice. Or just come to our Discord Channel at [[http://discord.dragonruby.org]] and ask questions.
    +We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.
     
    -Seriously just buy it. Get a refund if you don't like it. We make it
    -stupid easy to do so.
    +Seriously just buy it. Get a refund if you don't like it. We make it stupid easy to do so.
     
     *** I still think you should do a free version. Think of all people who would give it a shot.
     
    @@ -897,11 +898,15 @@ You can represent a sprite as a ~Hash~:
           flip_vertically: false,
           flip_horizontally: false,
           angle_anchor_x: 0.5,
    -      angle_anchor_y: 1.0
    +      angle_anchor_y: 1.0,
    +      blendmode_enum: 1
         }
       end
     #+end_src
     
    +The ~blendmode_enum~ value can be set to ~0~ (no blending), ~1~ (alpha blending),
    +~2~ (additive blending), ~3~ (modulo blending), ~4~ (multiply blending).
    +
     You can represent a sprite as an ~object~:
     
     #+begin_src ruby
    @@ -911,7 +916,7 @@ You can represent a sprite as an ~object~:
                       :source_x, :source_y, :source_w, :source_h,
                       :tile_x, :tile_y, :tile_w, :tile_h,
                       :flip_horizontally, :flip_vertically,
    -                  :angle_anchor_x, :angle_anchor_y
    +                  :angle_anchor_x, :angle_anchor_y, :blendmode_enum
     
         def primitive_marker
           :sprite
    @@ -997,16 +1002,17 @@ You can add additional metadata about your game within a label, which requires y
     #+begin_src
       def tick args
         args.outputs.labels << {
    -      x:              200,
    -      y:              550,
    -      text:           "dragonruby",
    -      size_enum:      2,
    -      alignment_enum: 1,
    -      r:              155,
    -      g:              50,
    -      b:              50,
    -      a:              255,
    -      font:           "fonts/manaspc.ttf",
    +      x:                       200,
    +      y:                       550,
    +      text:                    "dragonruby",
    +      size_enum:               2,
    +      alignment_enum:          1,
    +      r:                       155,
    +      g:                       50,
    +      b:                       50,
    +      a:                       255,
    +      font:                    "fonts/manaspc.ttf",
    +      vertical_alignment_enum: 0, # 0 is bottom, 1 is middle, 2 is top
           # You can add any properties you like (this will be ignored/won't cause errors)
           game_data_one:  "Something",
           game_data_two: {
    @@ -1039,6 +1045,21 @@ You can get the render size of any string using ~args.gtk.calcstringbox~.
       end
     #+end_src
     
    +** Rendering Labels With New Line Characters And Wrapping
    +
    +You can use a strategy like the following to create multiple labels from a String.
    +
    +#+begin_src ruby
    +  def tick args
    +    long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elitteger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim."
    +    max_character_length = 30
    +    long_strings_split = args.string.wrapped_lines long_string, max_character_length
    +    args.outputs.labels << long_strings_split.map_with_index do |s, i|
    +      { x: 10, y: 600 - (i * 20), text: s }
    +    end
    +  end
    +#+end_src
    +
     ** How To Play A Sound
     
     Sounds that end ~.wav~ will play once:
    @@ -1195,7 +1216,7 @@ Returns ~true~ if: the ~right~ arrow or ~d~ key is pressed or held on the ~keybo
     *** ~.left_right~
     Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.left~ and ~args.inputs.right~.
     *** ~.up_down~
    -Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.up~ and ~args.inputs.down~.
    +Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.down~ and ~args.inputs.up~.
     *** ~.text~ OR ~.history~
     Returns a string that represents the last key that was pressed on the keyboard.
     *** ~.mouse~
    @@ -1229,17 +1250,17 @@ The properties ~args.inputs.mouse.(click|down|previous_click|up)~ each return ~n
     that has an ~x~, ~y~ properties along with helper functions to determine collision: ~inside_rect?~, ~inside_circle~.
     *** ~.controller_one~, ~.controller_two~
     Represents controllers connected to the usb ports.
    -**** ~.up
    +**** ~.up~
     Returns ~true~ if ~up~ is pressed or held on the directional or left analog.
    -**** ~.down
    +**** ~.down~
     Returns ~true~ if ~down~ is pressed or held on the directional or left analog.
    -**** ~.left
    +**** ~.left~
     Returns ~true~ if ~left~ is pressed or held on the directional or left analog.
    -**** ~.right
    +**** ~.right~
     Returns ~true~ if ~right~ is pressed or held on the directional or left analog.
    -**** ~.left_right
    +**** ~.left_right~
     Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.controller_(one|two).left~ and ~args.inputs.controller_(one|two).right~.
    -**** ~.up_down
    +**** ~.up_down~
     Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.controller_(one|two).up~ and ~args.inputs.controller_(one|two).down~.
     **** ~.(left_analog_x_raw|right_analog_x_raw)~
     Returns the raw integer value for the analog's horizontal movement (~-32,000 to +32,000~).
    @@ -1249,13 +1270,13 @@ Returns the raw integer value for the analog's vertical movement (~-32,000 to +3
     Returns a number between ~-1~ and ~1~ which represents the percentage the analog is moved horizontally as a ratio of the maximum horizontal movement.
     **** ~.left_analog_y_perc|right_analog_y_perc)~
     Returns a number between ~-1~ and ~1~ which represents the percentage the analog is moved vertically as a ratio of the maximum vertical movement.
    -**** ~.directional_up)~
    +**** ~.directional_up~
     Returns ~true~ if ~up~ is pressed or held on the directional.
    -**** ~.directional_down)~
    +**** ~.directional_down~
     Returns ~true~ if ~down~ is pressed or held on the directional.
    -**** ~.directional_left)~
    +**** ~.directional_left~
     Returns ~true~ if ~left~ is pressed or held on the directional.
    -**** ~.directional_right)~
    +**** ~.directional_right~
     Returns ~true~ if ~right~ is pressed or held on the directional.
     **** ~.(a|b|x|y|l1|r1|l2|r2|l3|r3|start|select)~
     Returns ~true~ if the specific button is pressed or held.
    @@ -1411,6 +1432,14 @@ Send a Primitive to this collection to render an unfilled rectangle to the scree
     Send any Primitive to this collection which represents things you render to the screen for debugging purposes. Primitives in this collection will not be rendered in a production release of your game.
     ** ~args.geometry~
     This property contains geometric functions. Functions can be invoked via ~args.geometry.FUNCTION~.
    +
    +Here are some general notes with regards to the arguments these geometric functions accept.
    +
    +1. ~Rectangles~ can be represented as an ~Array~ with four (or more) values ~[x, y, w, h]~, as a ~Hash~ ~{ x:, y:, w:, h: }~ or an object that responds to ~x~, ~y~, ~w~, and ~h~.
    +2. ~Points~ can be represent as an ~Array~ with two (or more) values ~[x, y]~, as a ~Hash~ ~{ x:, y:}~ or an object that responds to ~x~, and ~y~.
    +3. ~Lines~ can be represented as an ~Array~ with four (or more) values ~[x, y, x2, y2]~, as a ~Hash~ ~{ x:, y:, x2:, y2: }~ or an object that responds to ~x~, ~y~, ~x2~, and ~y2~.
    +4. ~Angles~ are represented as degrees (not radians).
    +
     *** ~.inside_rect? rect_1, rect_2~
     Returns ~true~ if ~rect_1~ is inside ~rect_2~.
     *** ~.intersect_rect? rect_2, rect_2~
    @@ -1975,7 +2004,7 @@ wide and 90 pixels tall.
     
     ** Rendering a solid using an Array with colors and alpha
     
    -The value for the color and alpha is an number between ~0~ and ~255~. The
    +The value for the color and alpha is a number between ~0~ and ~255~. The
     alpha property is optional and will be set to ~255~ if not specified.
     
     Creates a green solid rectangle with an opacity of 50%.
    @@ -2011,7 +2040,7 @@ be provided in any order.
     ** Rendering a solid using a Class
     
     You can also create a class with solid/border properties and render it as a primitive.
    -ALL properties must on the class. *Additionally*, a method called ~primitive_marker~
    +ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~
     must be defined on the class.
     
     Here is an example:
    @@ -2070,6 +2099,106 @@ You have to use ~args.outputs.borders~:
     #+end_src
     
     
    +* DOCS: ~GTK::Outputs#sprites~
    +
    +Add primitives to this collection to render a sprite to the screen.
    +
    +** Rendering a sprite using an Array
    +
    +Creates a sprite of a white circle located at 100, 100. 160 pixels
    +wide and 90 pixels tall.
    +
    +#+begin_src
    +  def tick args
    +    #                         X    Y   WIDTH   HEIGHT                      PATH
    +    args.outputs.sprites << [100, 100,   160,     90, "sprites/circle/white.png]
    +  end
    +#+end_src
    +
    +** Rendering a sprite using an Array with colors and alpha
    +
    +The value for the color and alpha is a number between ~0~ and ~255~. The
    +alpha property is optional and will be set to ~255~ if not specified.
    +
    +Creates a green circle sprite with an opacity of 50%.
    +
    +#+begin_src
    +  def tick args
    +    #                         X    Y  WIDTH  HEIGHT           PATH                ANGLE  ALPHA  RED  GREEN  BLUE
    +    args.outputs.sprites << [100, 100,  160,     90, "sprites/circle/white.png",     0,    128,   0,   255,    0]
    +  end
    +#+end_src
    +
    +** Rendering a sprite using a Hash
    +
    +If you want a more readable invocation. You can use the following hash to create a sprite.
    +Any parameters that are not specified will be given a default value. The keys of the hash can
    +be provided in any order.
    +
    +#+begin_src
    +  def tick args
    +    args.outputs.sprites << {
    +      x:                             0,
    +      y:                             0,
    +      w:                           100,
    +      h:                           100,
    +      path: "sprites/circle/white.png",
    +      angle:                         0,
    +      a:                           255,
    +      r:                             0,
    +      g:                           255,
    +      b:                             0
    +    }
    +  end
    +#+end_src
    +
    +** Rendering a solid using a Class
    +
    +You can also create a class with solid/border properties and render it as a primitive.
    +ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~
    +must be defined on the class.
    +
    +Here is an example:
    +
    +#+begin_src
    +  # Create type with ALL sprite properties AND primitive_marker
    +  class Sprite
    +    attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y,  :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b
    +
    +    def primitive_marker
    +      :sprite
    +    end
    +  end
    +
    +  # Inherit from type
    +  class Circle < Sprite
    +  # constructor
    +    def initialize x, y, size, path
    +      self.x = x
    +      self.y = y
    +      self.w = size
    +      self.h = size
    +      self.path = path
    +    end
    +    def serlialize
    +      {x:self.x, y:self.y, w:self.w, h:self.h, path:self.path}
    +    end
    +
    +    def inspect
    +      serlialize.to_s
    +    end
    +
    +    def to_s
    +      serlialize.to_s
    +    end
    +  end
    +  def tick args
    +    # render circle sprite
    +    args.outputs.sprites  << Circle.new(10, 10, 32,"sprites/circle/white.png")
    +  end
    +#+end_src
    +
    +
     * DOCS: ~GTK::Outputs#screenshots~
     
     Add a hash to this collection to take a screenshot and save as png file.
    @@ -2133,12 +2262,12 @@ The ~GTK::MousePoint~ has the following properties.
     - ~x~: Integer representing the mouse's x.
     - ~y~: Integer representing the mouse's y.
     - ~point~: Array with the ~x~ and ~y~ values.
    -- ~w~: Width of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -- ~h~: Height of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -- ~left~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -- ~right~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -- ~top~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -- ~bottom~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    +- ~w~: Width of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +- ~h~: Height of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +- ~left~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +- ~right~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +- ~top~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +- ~bottom~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
     - ~created_at~: The tick (~args.state.tick_count~) that this structure was created.
     - ~global_created_at~: The global tick (~Kernel.global_tick_count~) that this structure was created.
     
    @@ -3580,7 +3709,7 @@ Follows is a source code listing for all files that have been open sourced. This
                                      g: 0,
                                      b: 200,
                                      a: 255,
    -                                 font: "manaspc.ttf" }.label
    +                                 font: "manaspc.ttf" }.label!
       
         # Primitives can hold anything, and can be given a label in the following forms
         args.outputs.primitives << [690 + 150, 330 - 80, "Custom font (.primitives Array)", 0, 1, 125, 0, 200, 255, "manaspc.ttf" ].label
    @@ -3594,7 +3723,7 @@ Follows is a source code listing for all files that have been open sourced. This
                                      g: 0,
                                      b: 200,
                                      a: 255,
    -                                 font: "manaspc.ttf" }.label
    +                                 font: "manaspc.ttf" }.label!
       end
       
       def tick_instructions args, text, y = 715
    @@ -3831,930 +3960,791 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Rendering Basics - Audio Mixer - main.rb
    +*** Input Basics - Keyboard - main.rb
     #+begin_src ruby
    -  # ./samples/01_rendering_basics/06_audio_mixer/app/main.rb
    -  $gtk.reset
    +  # ./samples/02_input_basics/01_keyboard/app/main.rb
    +  =begin
       
    -  $boxsize = 30
    +  APIs listing that haven't been encountered in a previous sample apps:
       
    -  def render_sources args
    -    mouse_in_panel = (args.state.selected != 0) && args.inputs.mouse.position.inside_rect?([900, 450, 340, 250])
    -    mouse_new_down = (args.state.mouse_held == 1)
    +  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    +    to the frame  that the key_up event occurred (the frame correlates
    +    to args.state.tick_count). Otherwise the value will be nil. For a
    +    full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    +  - args.state.PROPERTY: The state property on args is a dynamic
    +    structure. You can define ANY property here with ANY type of
    +    arbitrary nesting. Properties defined on args.state will be retained
    +    across frames. If you attempt access a property that doesn't exist
    +    on args.state, it will simply return nil (no exception will be thrown).
       
    -    if (mouse_new_down && !mouse_in_panel)
    -      args.state.selected = 0  # will reset below if we hit something.
    -    end
    +  =end
       
    -    args.audio.keys.each { |k|
    -      s = args.audio[k]
    +  # Along with outputs, inputs are also an essential part of video game development
    +  # DragonRuby can take input from keyboards, mouse, and controllers.
    +  # This sample app will cover keyboard input.
       
    -      if (mouse_new_down) && !mouse_in_panel && args.inputs.mouse.position.inside_rect?([s[:screenx], s[:screeny], $boxsize, $boxsize])
    -        args.state.selected = k
    -        args.state.dragging_source = true
    -      end
    +  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    +  # This will work with the other keys as well
       
    -      isselected = (k == args.state.selected)
       
    -      if isselected && args.state.dragging_source
    -        # you can hang anything on the audio hashes you want, so we store the
    -        #  actual screen position so it doesn't scale weirdly vs your mouse.
    -        s[:screenx] = args.inputs.mouse.x - ($boxsize / 2)
    -        s[:screeny] = args.inputs.mouse.y - ($boxsize / 2)
    +  def tick args
    +    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    +    # Notice how small_font accounts for all the remaining parameters
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 0), text: "Current game time: #{args.state.tick_count}", size_enum: -1 }
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 2), text: "Keyboard input: args.inputs.keyboard.key_up.h", size_enum: -1 }
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 3), text: "Press \"h\" on the keyboard.", size_enum: -1 }
    +  
    +    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    +    if args.inputs.keyboard.key_up.h
    +      args.state.h_pressed_at = args.state.tick_count
    +    end
       
    -        s[:screeny] = 50 if s[:screeny] < 50
    -        s[:screeny] = (719 - $boxsize) if s[:screeny] > (719 - $boxsize)
    -        s[:screenx] = 0 if s[:screenx] < 0
    -        s[:screenx] = (1279 - $boxsize) if s[:screenx] > (1279 - $boxsize)
    +    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    +    args.state.h_pressed_at ||= false
       
    -        s[:x] = ((s[:screenx] / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    -        s[:y] = ((s[:screeny] / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    -      end
    +    if args.state.h_pressed_at
    +      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" was pressed at time: #{args.state.h_pressed_at}", size_enum: -1 }
    +    else
    +      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" has never been pressed.", size_enum: -1 }
    +    end
       
    -      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    -      args.outputs.primitives << [s[:screenx], s[:screeny], $boxsize, $boxsize, *color].solid
    -    }
    +    tick_help_text args
       end
       
    -  def render_panel args
    -    s = args.audio[args.state.selected]
    -    return if s.nil?
    -    mouse_down = (args.state.mouse_held > 0)
    +  def row_to_px args, row_number, y_offset = 20
    +    # This takes a row_number and converts it to pixels DragonRuby understands.
    +    # Row 0 starts 5 units below the top of the grid
    +    # Each row afterward is 20 units lower
    +    args.grid.top - 5 - (y_offset * row_number)
    +  end
    +  
    +  # Don't worry about understanding the code within this method just yet.
    +  # This method shows you the help text within the game.
    +  def tick_help_text args
    +    return unless args.state.h_pressed_at
       
    -    args.outputs.primitives << [900, 450, 340, 250, 127, 127, 200, 255].solid
    -    args.outputs.primitives << [1075, 690, "Source ##{args.state.selected}", 3, 1, 255, 255, 255].label
    -    args.outputs.primitives << [910, 660, 1230, 660, 255, 255, 255].line
    -    args.outputs.primitives << [910, 650, "screen:    (#{s[:screenx].to_i}, #{s[:screeny].to_i})", 0, 0, 255, 255, 255].label
    -    args.outputs.primitives << [910, 625, "position:  (#{s[:x].round(5).to_s[0..6]}, #{s[:y].round(5).to_s[0..6]})", 0, 0, 255, 255, 255].label
    +    args.state.key_value_history      ||= {}
    +    args.state.key_down_value_history ||= {}
    +    args.state.key_held_value_history ||= {}
    +    args.state.key_up_value_history   ||= {}
       
    -    slider = [1022, 586, 200, 7]
    -    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -      s[:pitch] = ((args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)) * 2.0
    +    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    +        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    +        args.inputs.keyboard.key_up.truthy_keys.length > 0)
    +      args.state.help_available = true
    +      args.state.no_activity_debounce = nil
    +    else
    +      args.state.no_activity_debounce ||= 5.seconds
    +      args.state.no_activity_debounce -= 1
    +      if args.state.no_activity_debounce <= 0
    +        args.state.help_available = false
    +        args.state.key_value_history        = {}
    +        args.state.key_down_value_history   = {}
    +        args.state.key_held_value_history   = {}
    +        args.state.key_up_value_history     = {}
    +      end
         end
    -    slidercolor = (s[:pitch] / 2.0) * 255
    -    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -    args.outputs.primitives << [910, 600, "pitch: #{s[:pitch].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
       
    -    slider = [1022, 561, 200, 7]
    -    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -      s[:gain] = (args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)
    +    args.outputs.labels << { x: 10, y: row_to_px(args, 6), text: "This is the api for the keys you've pressed:", size_enum: -1, r: 180 }
    +  
    +    if !args.state.help_available
    +      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    +      return
         end
    -    slidercolor = s[:gain] * 255
    -    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -    args.outputs.primitives << [910, 575, "gain: #{s[:gain].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
       
    -    checkbox = [1022, 533, 10, 12]
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -      s[:looping] = !s[:looping]
    +    args.outputs.labels << { x: 10 , y: row_to_px(args, 7), text: "args.inputs.keyboard",          size_enum: -2 }
    +    args.outputs.labels << { x: 330, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_down", size_enum: -2 }
    +    args.outputs.labels << { x: 650, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_held", size_enum: -2 }
    +    args.outputs.labels << { x: 990, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_up",   size_enum: -2 }
    +  
    +    fill_history args, :key_value_history,      :down_or_held, nil
    +    fill_history args, :key_down_value_history, :down,        :key_down
    +    fill_history args, :key_held_value_history, :held,        :key_held
    +    fill_history args, :key_up_value_history,   :up,          :key_up
    +  
    +    render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    +    render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    +    render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    +    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    +  end
    +  
    +  def fill_history args, history_key, state_key, keyboard_method
    +    fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    +    fill_single_history args, history_key, state_key, keyboard_method, :char
    +    args.inputs.keyboard.keys[state_key].each do |key_name|
    +      fill_single_history args, history_key, state_key, keyboard_method, key_name
         end
    -    checkboxcolor = s[:looping] ? 255 : 0
    -    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -    args.outputs.primitives << [910, 550, "looping:", 0, 0, 255, 255, 255].label
    +  end
       
    -    checkbox = [1022, 508, 10, 12]
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -      s[:paused] = !s[:paused]
    +  def fill_single_history args, history_key, state_key, keyboard_method, key_name
    +    current_value = args.inputs.keyboard.send(key_name)
    +    if keyboard_method
    +      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
         end
    -    checkboxcolor = s[:paused] ? 255 : 0
    -    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -    args.outputs.primitives << [910, 525, "paused:", 0, 0, 255, 255, 255].label
    +    args.state.as_hash[history_key][key_name] ||= []
    +    args.state.as_hash[history_key][key_name] << current_value
    +    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
    +  end
       
    -    button = [910, 460, 320, 20]
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(button)
    -      args.audio.delete(args.state.selected)
    -      args.state.selected = 0
    +  def render_help_labels args, history_key, state_key, keyboard_method, x
    +    idx = 8
    +    args.outputs.labels << args.state
    +                             .as_hash[history_key]
    +                             .keys
    +                             .reverse
    +                             .map
    +                             .with_index do |k, i|
    +      v = args.state.as_hash[history_key][k]
    +      current_value = args.inputs.keyboard.send(k)
    +      if keyboard_method
    +        current_value = args.inputs.keyboard.send(keyboard_method).send(k)
    +      end
    +      idx += 2
    +      [
    +        { x: x, y: row_to_px(args, idx + 0, 16), text: "    .#{k} is #{current_value || "nil"}", size_enum: -2 },
    +        { x: x, y: row_to_px(args, idx + 1, 16), text: "       was #{v}", size_enum: -2 }
    +      ]
         end
    -    args.outputs.primitives << [*button, 255, 0, 0, 255].solid
    -    args.outputs.primitives << [button[0] + (button[2] / 2), button[1]+20, "DELETE SOURCE", 0, 1, 255, 255, 0].label
       end
       
    -  def spawn_new_sound args, num
    -    input = nil
    -    input = "sounds/#{num}.#{(num == 6) ? 'ogg' : 'wav'}"
       
    -    # Spawn randomly in an area that won't be covered by UI.
    -    screenx = (rand * 600.0) + 200.0
    -    screeny = (rand * 400.0) + 100.0
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
       
    -    args.state.next_sound_index += 1
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +    args.outputs.debug << { x: 640, y: y,      text: text,
    +                            size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)",
    +                            size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +  end
    +
    +#+end_src
    +
    +*** Input Basics - Moving A Sprite - main.rb
    +#+begin_src ruby
    +  # ./samples/02_input_basics/01_moving_a_sprite/app/main.rb
    +  def tick args
    +    # create a player and set default values
    +    # for the player's x, y, w (width), and h (height)
    +    args.state.player.x ||= 100
    +    args.state.player.y ||= 100
    +    args.state.player.w ||=  50
    +    args.state.player.h ||=  50
       
    -    # you can hang anything on the audio hashes you want, so we store the
    -    #  actual screen position in here for convenience.
    -    args.audio[args.state.next_sound_index] = {
    -      input: input,
    -      screenx: screenx,
    -      screeny: screeny,
    -      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    -      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    -      z: 0.0,
    -      gain: 1.0,
    -      pitch: 1.0,
    -      looping: true,
    -      paused: false
    -    }
    +    # render the player to the screen
    +    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.state.selected = args.state.next_sound_index
    -  end
    +    # move the player around using the keyboard
    +    if args.inputs.up
    +      args.state.player.y += 10
    +    elsif args.inputs.down
    +      args.state.player.y -= 10
    +    end
       
    -  def render_launcher args
    -    total = 6
    -    x = (1280 - (total * $boxsize * 3)) / 2
    -    y = 10
    -    args.outputs.primitives << [0, 0, 1280, ((y*2) + $boxsize), 127, 127, 127, 255].solid
    -    for i in 1..total
    -      args.outputs.primitives << [x, y, $boxsize, $boxsize, 255, 255, 255, 255].solid
    -      args.outputs.primitives << [x+8, y+28, i.to_s, 3, 0, 0, 0, 255, 255].label
    -      if args.inputs.mouse.click && args.inputs.mouse.click.point.inside_rect?([x, y, $boxsize, $boxsize])
    -        spawn_new_sound args, i
    -      end
    -      x = x + ($boxsize * 3)
    +    if args.inputs.left
    +      args.state.player.x -= 10
    +    elsif args.inputs.right
    +      args.state.player.x += 10
         end
       end
       
    -  def render_ui args
    -    render_launcher args
    -    render_panel args
    -  end
    +  $gtk.reset
    +
    +#+end_src
    +
    +*** Input Basics - Mouse - main.rb
    +#+begin_src ruby
    +  # ./samples/02_input_basics/02_mouse/app/main.rb
    +  =begin
    +  
    +  APIs that haven't been encountered in a previous sample apps:
    +  
    +  - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +    since the click event.
    +  
    +  Reminder:
    +  
    +  - args.state.PROPERTY: The state property on args is a dynamic
    +    structure. You can define ANY property here with ANY type of
    +    arbitrary nesting. Properties defined on args.state will be retained
    +    across frames. If you attempt access a property that doesn't exist
    +    on args.state, it will simply return nil (no exception will be thrown).
    +  
    +  =end
    +  
    +  # This code demonstrates DragonRuby mouse input
    +  
    +  # To see if the a mouse click occurred
    +  # Use args.inputs.mouse.click
    +  # Which returns a boolean
    +  
    +  # To see where a mouse click occurred
    +  # Use args.inputs.mouse.click.point.x AND
    +  # args.inputs.mouse.click.point.y
    +  
    +  # To see which frame the click occurred
    +  # Use args.inputs.mouse.click.created_at
    +  
    +  # To see how many frames its been since the click occurred
    +  # Use args.inputs.mouse.click.creat_at_elapsed
    +  
    +  # Saving the click in args.state can be quite useful
       
       def tick args
    -    args.state.mouse_held ||= 0
    -    args.state.dragging_source ||= false
    -    args.state.selected ||= 0
    -    args.state.next_sound_index ||= 0
    +    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    +    x = 460
       
    -    if args.inputs.mouse.up
    -      args.state.mouse_held = 0
    -      args.state.dragging_source = false
    -    elsif args.inputs.mouse.down || (args.state.mouse_held > 0)
    -      args.state.mouse_held += 1
    +    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
    +  
    +    if args.inputs.mouse.click
    +      args.state.last_mouse_click = args.inputs.mouse.click
    +    end
    +  
    +    if args.state.last_mouse_click
    +      click = args.state.last_mouse_click
    +      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    +      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    +      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
         else
    +      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    +      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
         end
    +  end
       
    -    args.outputs.background_color = [ 0, 0, 0, 255 ]
    -    render_sources args
    -    render_ui args
    +  def small_label args, x, row, message
    +    # This method effectively combines the row_to_px and small_font methods
    +    # It changes the given row value to a DragonRuby pixel value
    +    # and adds the customization parameters
    +    { x: x, y: row_to_px(args, row), text: message, alignment_enum: -2 }
    +  end
    +  
    +  def row_to_px args, row_number
    +    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +  end
    +  
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
    +  
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
       end
     
     #+end_src
     
    -*** Rendering Basics - Sound Synthesis - main.rb
    +*** Input Basics - Mouse Point To Rect - main.rb
     #+begin_src ruby
    -  # ./samples/01_rendering_basics/07_sound_synthesis/app/main.rb
    -  begin # region: top level tick methods
    -    def tick args
    -      defaults args
    -      render args
    -      input args
    -      process_audio_queue args
    -    end
    +  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    +  =begin
       
    -    def defaults args
    -      args.state.sine_waves      ||= {}
    -      args.state.square_waves    ||= {}
    -      args.state.saw_tooth_waves ||= {}
    -      args.state.triangle_waves  ||= {}
    -      args.state.audio_queue     ||= []
    -      args.state.buttons         ||= [
    -        (frequency_buttons args),
    -        (sine_wave_note_buttons args),
    -        (bell_buttons args),
    -        (square_wave_note_buttons args),
    -        (saw_tooth_wave_note_buttons args),
    -        (triangle_wave_note_buttons args),
    -      ].flatten
    -    end
    +  APIs that haven't been encountered in a previous sample apps:
       
    -    def render args
    -      args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    -      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    -      args.outputs.labels  << args.layout
    -                                .rect(row: 0, col: 11.5)
    -                                .yield_self { |r| r.merge y: r.y + r.h }
    -                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    -                                       alignment_enum: 1)
    -    end
    +  - args.outputus.borders: An array. Values in this array will be rendered as
    +    unfilled rectangles on the screen.
    +  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +    with at least four values is considered a rect. The inside_rect? function returns true
    +    or false depending on if the point is inside the rect.
       
    +    ```
    +    # Point:  x: 100, y: 100
    +    # Rect:   x: 0, y: 0, w: 500, h: 500
    +    # Result: true
       
    -    def input args
    -      args.state.buttons.each do |b|
    -        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    -          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    -          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    -          send b[:method_to_call], args, b
    -        end
    -      end
    +    [100, 100].inside_rect? [0, 0, 500, 500]
    +    ```
       
    -      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    -        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    -      end
    -    end
    +    ```
    +    # Point:  x: 100, y: 100
    +    # Rect:   x: 300, y: 300, w: 100, h: 100
    +    # Result: false
       
    -    def process_audio_queue args
    -      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    -      args.state.audio_queue -= to_queue
    -      to_queue.each { |a| args.audio[a[:id]] = a }
    +    [100, 100].inside_rect? [300, 300, 100, 100]
    +    ```
       
    -      args.audio.find_all { |k, v| v[:decay_rate] }
    -        .each     { |k, v| v[:gain] -= v[:decay_rate] }
    +  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +    since the click event.
       
    -      sounds_to_stop = args.audio
    -                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    -                         .map { |k, v| k }
    +  =end
       
    -      sounds_to_stop.each { |k| args.audio.delete k }
    -    end
    -  end
    +  # To determine whether a point is in a rect
    +  # Use point.inside_rect? rect
       
    -  begin # region: button definitions, ui layout, callback functions
    -    def button args, opts
    -      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
    +  # This is useful to determine if a click occurred in a rect
       
    -      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
    +  def tick args
    +    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
       
    -      label_offset_x = 5
    -      label_offset_y = 30
    +    x = 460
       
    -      button_def[:label]  = button_def[:rect].merge text: opts[:text],
    -                                                    size_enum: -2.5,
    -                                                    x: button_def[:rect].x + label_offset_x,
    -                                                    y: button_def[:rect].y + label_offset_y
    +    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
       
    -      button_def
    +    box = { x: 785, y: 370, w: 50, h: 50, r: 0, g: 0, b: 170 }
    +    args.outputs.borders << box
    +  
    +    # Saves the most recent click into args.state
    +    # Unlike the other components of args,
    +    # args.state does not reset every tick.
    +    if args.inputs.mouse.click
    +      args.state.last_mouse_click = args.inputs.mouse.click
         end
       
    -    def play_sine_wave args, sender
    -      queue_sine_wave args,
    -                      frequency: sender[:frequency],
    -                      duration: 1.seconds,
    -                      fade_out: true
    +    if args.state.last_mouse_click
    +      if args.state.last_mouse_click.point.inside_rect? box
    +        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    +      else
    +        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    +      end
    +    else
    +      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
         end
    +  end
       
    -    def play_note args, sender
    -      method_to_call = :queue_sine_wave
    -      method_to_call = :queue_square_wave    if sender[:type] == :square
    -      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    -      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    -      method_to_call = :queue_bell           if sender[:type] == :bell
    +  def small_label args, x, row, message
    +    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
    +  end
       
    -      send method_to_call, args,
    -           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    -           duration: 1.seconds,
    -           fade_out: true
    -    end
    +  def row_to_px args, row_number
    +    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +  end
       
    -    def frequency_buttons args
    -      [
    -        (button args,
    -                row: 4.0, col: 0, text: "300hz",
    -                frequency: 300,
    -                method_to_call: :play_sine_wave),
    -        (button args,
    -                row: 5.0, col: 0, text: "400hz",
    -                frequency: 400,
    -                method_to_call: :play_sine_wave),
    -        (button args,
    -                row: 6.0, col: 0, text: "500hz",
    -                frequency: 500,
    -                method_to_call: :play_sine_wave),
    -      ]
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
         end
       
    -    def sine_wave_note_buttons args
    -      [
    -        (button args,
    -                row: 1.5, col: 2, text: "Sine C4",
    -                note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 2.5, col: 2, text: "Sine D4",
    -                note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 3.5, col: 2, text: "Sine E4",
    -                note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 4.5, col: 2, text: "Sine F4",
    -                note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 5.5, col: 2, text: "Sine G4",
    -                note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 6.5, col: 2, text: "Sine A5",
    -                note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 7.5, col: 2, text: "Sine B5",
    -                note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    -        (button args,
    -                row: 8.5, col: 2, text: "Sine C5",
    -                note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    -      ]
    -    end
    -  
    -    def square_wave_note_buttons args
    -      [
    -        (button args,
    -                row: 1.5, col: 6, text: "Square C4",
    -                note: :c, octave: 4, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 2.5, col: 6, text: "Square D4",
    -                note: :d, octave: 4, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 3.5, col: 6, text: "Square E4",
    -                note: :e, octave: 4, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 4.5, col: 6, text: "Square F4",
    -                note: :f, octave: 4, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 5.5, col: 6, text: "Square G4",
    -                note: :g, octave: 4, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 6.5, col: 6, text: "Square A5",
    -                note: :a, octave: 5, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 7.5, col: 6, text: "Square B5",
    -                note: :b, octave: 5, type: :square, method_to_call: :play_note),
    -        (button args,
    -                row: 8.5, col: 6, text: "Square C5",
    -                note: :c, octave: 5, type: :square, method_to_call: :play_note),
    -      ]
    -    end
    -    def saw_tooth_wave_note_buttons args
    -      [
    -        (button args,
    -                row: 1.5, col: 8, text: "Saw C4",
    -                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 2.5, col: 8, text: "Saw D4",
    -                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 3.5, col: 8, text: "Saw E4",
    -                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 4.5, col: 8, text: "Saw F4",
    -                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 5.5, col: 8, text: "Saw G4",
    -                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 6.5, col: 8, text: "Saw A5",
    -                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 7.5, col: 8, text: "Saw B5",
    -                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -        (button args,
    -                row: 8.5, col: 8, text: "Saw C5",
    -                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -      ]
    -    end
    -  
    -    def triangle_wave_note_buttons args
    -      [
    -        (button args,
    -                row: 1.5, col: 10, text: "Triangle C4",
    -                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 2.5, col: 10, text: "Triangle D4",
    -                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 3.5, col: 10, text: "Triangle E4",
    -                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 4.5, col: 10, text: "Triangle F4",
    -                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 5.5, col: 10, text: "Triangle G4",
    -                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 6.5, col: 10, text: "Triangle A5",
    -                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 7.5, col: 10, text: "Triangle B5",
    -                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    -        (button args,
    -                row: 8.5, col: 10, text: "Triangle C5",
    -                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    -      ]
    -    end
    -  
    -    def bell_buttons args
    -      [
    -        (button args,
    -                row: 1.5, col: 4, text: "Bell C4",
    -                note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 2.5, col: 4, text: "Bell D4",
    -                note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 3.5, col: 4, text: "Bell E4",
    -                note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 4.5, col: 4, text: "Bell F4",
    -                note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 5.5, col: 4, text: "Bell G4",
    -                note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 6.5, col: 4, text: "Bell A5",
    -                note: :a, octave: 5, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 7.5, col: 4, text: "Bell B5",
    -                note: :b, octave: 5, type: :bell, method_to_call: :play_note),
    -        (button args,
    -                row: 8.5, col: 4, text: "Bell C5",
    -                note: :c, octave: 5, type: :bell, method_to_call: :play_note),
    -      ]
    -    end
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
       end
    +
    +#+end_src
    +
    +*** Input Basics - Mouse Rect To Rect - main.rb
    +#+begin_src ruby
    +  # ./samples/02_input_basics/04_mouse_rect_to_rect/app/main.rb
    +  =begin
       
    -  begin # region: wave generation
    -    begin # sine wave
    -      def defaults_sine_wave_for
    -        { frequency: 440, sample_rate: 48000 }
    -      end
    +  APIs that haven't been encountered in a previous sample apps:
       
    -      def sine_wave_for opts = {}
    -        opts = defaults_sine_wave_for.merge opts
    -        frequency   = opts[:frequency]
    -        sample_rate = opts[:sample_rate]
    -        period_size = (sample_rate.fdiv frequency).ceil
    -        period_size.map_with_index do |i|
    -          Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)
    -        end.to_a
    -      end
    +  - args.outputs.borders: An array. Values in this array will be rendered as
    +    unfilled rectangles on the screen.
    +  - ARRAY#intersect_rect?: An array with at least four values is
    +    considered a rect. The intersect_rect? function returns true
    +    or false depending on if the two rectangles intersect.
       
    -      def defaults_queue_sine_wave
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -      end
    +    ```
    +    # Rect One: x: 100, y: 100, w: 100, h: 100
    +    # Rect Two: x: 0, y: 0, w: 500, h: 500
    +    # Result:   true
       
    -      def queue_sine_wave args, opts = {}
    -        opts        = defaults_queue_sine_wave.merge opts
    -        frequency   = opts[:frequency]
    -        sample_rate = 48000
    +    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]
    +    ```
       
    -        sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate
    -        args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate
    +    ```
    +    # Rect One: x: 100, y: 100, w: 10, h: 10
    +    # Rect Two: x: 500, y: 500, w: 10, h: 10
    +    # Result:   false
       
    -        proc = lambda do
    -          generate_audio_data args.state.sine_waves[frequency], sample_rate
    -        end
    +    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]
    +    ```
       
    -        audio_state = new_audio_state args, opts
    -        audio_state[:input] = [1, sample_rate, proc]
    -        queue_audio args, audio_state: audio_state, wave: sine_wave
    -      end
    -    end
    +  =end
       
    -    begin # region: square wave
    -      def defaults_square_wave_for
    -        { frequency: 440, sample_rate: 48000 }
    -      end
    +  # Similarly, whether rects intersect can be found through
    +  # rect1.intersect_rect? rect2
       
    -      def square_wave_for opts = {}
    -        opts = defaults_square_wave_for.merge opts
    -        sine_wave = sine_wave_for opts
    -        sine_wave.map do |v|
    -          if v >= 0
    -            1.0
    -          else
    -            -1.0
    -          end
    -        end.to_a
    -      end
    +  def tick args
    +    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."
    +    x = 460
       
    -      def defaults_queue_square_wave
    -        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -      end
    +    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")
    +    # red_box = [460, 250, 355, 90, 170, 0, 0]
    +    # args.outputs.borders << red_box
       
    -      def queue_square_wave args, opts = {}
    -        opts        = defaults_queue_square_wave.merge opts
    -        frequency   = opts[:frequency]
    -        sample_rate = 48000
    +    # args.state.box_collision_one and args.state.box_collision_two
    +    # Are given values of a solid when they should be rendered
    +    # They are stored in game so that they do not get reset every tick
    +    if args.inputs.mouse.click
    +      if !args.state.box_collision_one
    +        args.state.box_collision_one = { x: args.inputs.mouse.click.point.x - 25,
    +                                         y: args.inputs.mouse.click.point.y - 25,
    +                                         w: 125, h: 125,
    +                                         r: 180, g: 0, b: 0, a: 180 }
    +      elsif !args.state.box_collision_two
    +        args.state.box_collision_two = { x: args.inputs.mouse.click.point.x - 25,
    +                                         y: args.inputs.mouse.click.point.y - 25,
    +                                         w: 125, h: 125,
    +                                         r: 0, g: 0, b: 180, a: 180 }
    +      else
    +        args.state.box_collision_one = nil
    +        args.state.box_collision_two = nil
    +      end
    +    end
       
    -        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    -        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
    +    if args.state.box_collision_one
    +      args.outputs.solids << args.state.box_collision_one
    +    end
       
    -        proc = lambda do
    -          generate_audio_data args.state.square_waves[frequency], sample_rate
    -        end
    +    if args.state.box_collision_two
    +      args.outputs.solids << args.state.box_collision_two
    +    end
       
    -        audio_state = new_audio_state args, opts
    -        audio_state[:input] = [1, sample_rate, proc]
    -        queue_audio args, audio_state: audio_state, wave: square_wave
    +    if args.state.box_collision_one && args.state.box_collision_two
    +      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two
    +        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')
    +      else
    +        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')
           end
    +    else
    +      args.outputs.labels << small_label(args, x, 4, '--')
         end
    +  end
       
    -    begin # region: saw tooth wave
    -      def defaults_saw_tooth_wave_for
    -        { frequency: 440, sample_rate: 48000 }
    -      end
    +  def small_label args, x, row, message
    +    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
    +  end
       
    -      def saw_tooth_wave_for opts = {}
    -        opts = defaults_saw_tooth_wave_for.merge opts
    -        sine_wave = sine_wave_for opts
    -        period_size = sine_wave.length
    -        sine_wave.map_with_index do |v, i|
    -          (((i % period_size).fdiv period_size) * 2) - 1
    -        end
    -      end
    +  def row_to_px args, row_number
    +    args.grid.top - 5 - (20 * row_number)
    +  end
       
    -      def defaults_queue_saw_tooth_wave
    -        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -      end
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
       
    -      def queue_saw_tooth_wave args, opts = {}
    -        opts        = defaults_queue_saw_tooth_wave.merge opts
    -        frequency   = opts[:frequency]
    -        sample_rate = 48000
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +  end
    +
    +#+end_src
    +
    +*** Input Basics - Controller - main.rb
    +#+begin_src ruby
    +  # ./samples/02_input_basics/05_controller/app/main.rb
    +  =begin
       
    -        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    -        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +   APIs listing that haven't been encountered in previous sample apps:
       
    -        proc = lambda do
    -          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    -        end
    +   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key
    +     is being held down on the controller.
    +     If there is more than one controller being used, they can be differentiated by
    +     using names like controller_one and controller_two.
       
    -        audio_state = new_audio_state args, opts
    -        audio_state[:input] = [1, sample_rate, proc]
    -        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
    -      end
    -    end
    +     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.
       
    -    begin # region: triangle wave
    -      def defaults_triangle_wave_for
    -        { frequency: 440, sample_rate: 48000 }
    -      end
    +   Reminder:
       
    -      def triangle_wave_for opts = {}
    -        opts = defaults_saw_tooth_wave_for.merge opts
    -        sine_wave = sine_wave_for opts
    -        period_size = sine_wave.length
    -        sine_wave.map_with_index do |v, i|
    -          ratio = (i.fdiv period_size)
    -          if ratio <= 0.5
    -            (ratio * 4) - 1
    -          else
    -            ratio -= 0.5
    -            1 - (ratio * 4)
    -          end
    -        end
    -      end
    +   - args.state.PROPERTY: The state property on args is a dynamic
    +     structure. You can define ANY property here with ANY type of
    +     arbitrary nesting. Properties defined on args.state will be retained
    +     across frames. If you attempt to access a property that doesn't exist
    +     on args.state, it will simply return nil (no exception will be thrown).
       
    -      def defaults_queue_triangle_wave
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -      end
    +     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.
    +     The parameters of a button are:
    +     1. the position (x, y)
    +     2. the input key held on the controller
    +     3. the text or name of the button
       
    -      def queue_triangle_wave args, opts = {}
    -        opts        = defaults_queue_triangle_wave.merge opts
    -        frequency   = opts[:frequency]
    -        sample_rate = 48000
    +  =end
       
    -        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    -        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
    +  # This sample app provides a visual demonstration of a standard controller, including
    +  # the placement and function of all buttons.
       
    -        proc = lambda do
    -          generate_audio_data args.state.triangle_waves[frequency], sample_rate
    -        end
    +  class ControllerDemo
    +    attr_accessor :inputs, :state, :outputs
       
    -        audio_state = new_audio_state args, opts
    -        audio_state[:input] = [1, sample_rate, proc]
    -        queue_audio args, audio_state: audio_state, wave: triangle_wave
    -      end
    +    # Calls the methods necessary for the app to run successfully.
    +    def tick
    +      process_inputs
    +      render
         end
       
    -    begin # region: bell
    -      def defaults_queue_bell
    -        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    -      end
    -  
    -      def queue_bell args, opts = {}
    -        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
    -      end
    +    # Starts with an empty collection of buttons.
    +    # Adds buttons that are on the controller to the collection.
    +    def process_inputs
    +      state.buttons = []
       
    -      def bell_harmonics
    -        [
    -          { frequency_ratio: 0.5, duration_ratio: 1.00 },
    -          { frequency_ratio: 1.0, duration_ratio: 0.80 },
    -          { frequency_ratio: 2.0, duration_ratio: 0.60 },
    -          { frequency_ratio: 3.0, duration_ratio: 0.40 },
    -          { frequency_ratio: 4.2, duration_ratio: 0.25 },
    -          { frequency_ratio: 5.4, duration_ratio: 0.20 },
    -          { frequency_ratio: 6.8, duration_ratio: 0.15 }
    -        ]
    -      end
    +      state.buttons << { x: 100,  y: 500, active: inputs.controller_one.key_held.l1, text: "L1"}
    +      state.buttons << { x: 100,  y: 600, active: inputs.controller_one.key_held.l2, text: "L2"}
    +      state.buttons << { x: 1100, y: 500, active: inputs.controller_one.key_held.r1, text: "R1"}
    +      state.buttons << { x: 1100, y: 600, active: inputs.controller_one.key_held.r2, text: "R2"}
    +      state.buttons << { x: 540,  y: 450, active: inputs.controller_one.key_held.select, text: "Select"}
    +      state.buttons << { x: 660,  y: 450, active: inputs.controller_one.key_held.start, text: "Start"}
    +      state.buttons << { x: 200,  y: 300, active: inputs.controller_one.key_held.left, text: "Left"}
    +      state.buttons << { x: 300,  y: 400, active: inputs.controller_one.key_held.up, text: "Up"}
    +      state.buttons << { x: 400,  y: 300, active: inputs.controller_one.key_held.right, text: "Right"}
    +      state.buttons << { x: 300,  y: 200, active: inputs.controller_one.key_held.down, text: "Down"}
    +      state.buttons << { x: 800,  y: 300, active: inputs.controller_one.key_held.x, text: "X"}
    +      state.buttons << { x: 900,  y: 400, active: inputs.controller_one.key_held.y, text: "Y"}
    +      state.buttons << { x: 1000, y: 300, active: inputs.controller_one.key_held.a, text: "A"}
    +      state.buttons << { x: 900,  y: 200, active: inputs.controller_one.key_held.b, text: "B"}
    +      state.buttons << { x: 450 + inputs.controller_one.left_analog_x_perc * 100,
    +                         y: 100 + inputs.controller_one.left_analog_y_perc * 100,
    +                         active: inputs.controller_one.key_held.l3,
    +                         text: "L3" }
    +      state.buttons << { x: 750 + inputs.controller_one.right_analog_x_perc * 100,
    +                         y: 100 + inputs.controller_one.right_analog_y_perc * 100,
    +                         active: inputs.controller_one.key_held.r3,
    +                         text: "R3" }
    +    end
       
    -      def defaults_bell_to_sine_waves
    -        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    -      end
    +    # Gives each button a square shape.
    +    # If the button is being pressed or held (which means it is considered active),
    +    # the square is filled in. Otherwise, the button simply has a border.
    +    def render
    +      state.buttons.each do |b|
    +        rect = { x: b.x, y: b.y, w: 75, h: 75 }
       
    -      def bell_to_sine_waves opts = {}
    -        opts = defaults_bell_to_sine_waves.merge opts
    -        bell_harmonics.map do |b|
    -          {
    -            frequency: opts[:frequency] * b[:frequency_ratio],
    -            duration:  opts[:duration] * b[:duration_ratio],
    -            queue_in:  opts[:queue_in],
    -            gain:      (1.fdiv bell_harmonics.length),
    -            fade_out:  true
    -          }
    +        if b.active # if button is pressed
    +          outputs.solids << rect # rect is output as solid (filled in)
    +        else
    +          outputs.borders << rect # otherwise, output as border
             end
    -      end
    -    end
       
    -    begin # audio entity construction
    -      def generate_audio_data sine_wave, sample_rate
    -        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    -        copy_count  = (sample_size.fdiv sine_wave.length).ceil
    -        sine_wave * copy_count
    +        # Outputs the text of each button using labels.
    +        outputs.labels << { x: b.x, y: b.y + 95, text: b.text } # add 95 to place label above button
           end
       
    -      def defaults_new_audio_state
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -      end
    +      outputs.labels << { x:  10, y: 60, text: "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)" }
    +      outputs.labels << { x:  10, y: 30, text: "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)" }
    +      outputs.labels << { x: 900, y: 60, text: "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)" }
    +      outputs.labels << { x: 900, y: 30, text: "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)" }
    +    end
    +  end
       
    -      def new_audio_state args, opts = {}
    -        opts        = defaults_new_audio_state.merge opts
    -        decay_rate  = 0
    -        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    -        frequency   = opts[:frequency]
    -        sample_rate = 48000
    +  $controller_demo = ControllerDemo.new
       
    -        {
    -          id:               (new_id! args),
    -          frequency:        frequency,
    -          sample_rate:      48000,
    -          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    -          gain:             opts[:gain].to_f,
    -          queue_at:         args.state.tick_count + opts[:queue_in],
    -          decay_rate:       decay_rate,
    -          pitch:            1.0,
    -          looping:          true,
    -          paused:           false
    -        }
    -      end
    +  def tick args
    +    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."
    +    $controller_demo.inputs = args.inputs
    +    $controller_demo.state = args.state
    +    $controller_demo.outputs = args.outputs
    +    $controller_demo.tick
    +  end
       
    -      def queue_audio args, opts = {}
    -        graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    -        args.state.audio_queue << opts[:audio_state]
    -      end
    +  # Resets the app.
    +  def r
    +    $gtk.reset
    +  end
       
    -      def new_id! args
    -        args.state.audio_id ||= 0
    -        args.state.audio_id  += 1
    -      end
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
       
    -      def graph_wave args, wave, frequency
    -        if args.state.tick_count != args.state.graphed_at
    -          args.outputs.static_lines.clear
    -          args.outputs.static_sprites.clear
    -        end
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +  end
    +
    +#+end_src
    +
    +*** Input Basics - Touch - main.rb
    +#+begin_src ruby
    +  # ./samples/02_input_basics/06_touch/app/main.rb
    +  def tick args
    +    args.outputs.background_color = [ 0, 0, 0 ]
    +    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label
       
    -        wave = wave
    +    # If you don't want to get fancy, you can just look for finger_one
    +    #  (and _two, if you like), which are assigned in the order new touches hit
    +    #  the screen. If not nil, they are touching right now, and are just
    +    #  references to specific items in the args.input.touch hash.
    +    # If finger_one lifts off, it will become nil, but finger_two, if it was
    +    #  touching, remains until it also lifts off. When all fingers lift off, the
    +    #  the next new touch will be finger_one again, but until then, new touches
    +    #  don't fill in earlier slots.
    +    if !args.inputs.finger_one.nil?
    +      args.outputs.primitives << { x: 640, y: 650, text: "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).",
    +                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +    end
    +    if !args.inputs.finger_two.nil?
    +      args.outputs.primitives << { x: 640, y: 600, text: "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).",
    +                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +    end
       
    -        r, g, b = frequency.to_i % 85,
    -                  frequency.to_i % 170,
    -                  frequency.to_i % 255
    +    # Here's the more flexible interface: this will report as many simultaneous
    +    #  touches as the system can handle, but it's a little more effort to track
    +    #  them. Each item in the args.input.touch hash has a unique key (an
    +    #  incrementing integer) that exists until the finger lifts off. You can
    +    #  tell which order the touches happened globally by the key value, or
    +    #  by the touch[id].touch_order field, which resets to zero each time all
    +    #  touches have lifted.
       
    -        starting_rect = args.layout.rect(row: 5, col: 13)
    -        x_scale    = 10
    -        y_scale    = 100
    -        max_points = 25
    +    args.state.colors ||= [
    +      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF
    +    ]
       
    -        points = wave
    -        if wave.length > max_points
    -          resolution = wave.length.idiv max_points
    -          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    -        end
    -  
    -        args.outputs.static_lines << points.map_with_index do |y, x|
    -          next_y = points[x + 1]
    -  
    -          if next_y
    -            {
    -              x:  starting_rect.x + (x * x_scale),
    -              y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    -              x2: starting_rect.x + ((x + 1) * x_scale),
    -              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    -              r:  r,
    -              g:  g,
    -              b:  b
    -            }
    -          end
    -        end
    -  
    -        args.outputs.static_sprites << points.map_with_index do |y, x|
    -          {
    -            x:  (starting_rect.x + (x * x_scale)) - 2,
    -            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    -            w:  4,
    -            h:  4,
    -            path: 'sprites/square-white.png',
    -            r: r,
    -            g: g,
    -            b: b
    -          }
    -        end
    -  
    -        args.state.graphed_at = args.state.tick_count
    -      end
    -    end
    -  
    -    begin # region: musical note mapping
    -      def defaults_frequency_for
    -        { note: :a, octave: 5, sharp:  false, flat:   false }
    -      end
    -  
    -      def frequency_for opts = {}
    -        opts = defaults_frequency_for.merge opts
    -        octave_offset_multiplier  = opts[:octave] - 5
    -        note = note_frequencies_octave_5[opts[:note]]
    -        if octave_offset_multiplier < 0
    -          note = note * 1 / (octave_offset_multiplier.abs + 1)
    -        elsif octave_offset_multiplier > 0
    -          note = note * (octave_offset_multiplier.abs + 1) / 1
    -        end
    -        note
    -      end
    -  
    -      def note_frequencies_octave_5
    -        {
    -          a: 440.0,
    -          a_sharp: 466.16, b_flat: 466.16,
    -          b: 493.88,
    -          c: 523.25,
    -          c_sharp: 554.37, d_flat: 587.33,
    -          d: 587.33,
    -          d_sharp: 622.25, e_flat: 659.25,
    -          e: 659.25,
    -          f: 698.25,
    -          f_sharp: 739.99, g_flat: 739.99,
    -          g: 783.99,
    -          g_sharp: 830.61, a_flat: 830.61
    -        }
    -      end
    -    end
    +    size = 100
    +    args.inputs.touch.each { |k,v|
    +      color = args.state.colors[v.touch_order % 7]
    +      r = (color & 0xFF0000) >> 16
    +      g = (color & 0x00FF00) >> 8
    +      b = (color & 0x0000FF)
    +      args.outputs.primitives << { x: v.x - (size / 2), y: v.y + (size / 2), w: size, h: size, r: r, g: g, b: b, a: 255 }.solid!
    +      args.outputs.primitives << { x: v.x, y: v.y + size, text: k.to_s, alignment_enum: 1 }.label!
    +    }
       end
    -  
    -  $gtk.reset
     
     #+end_src
     
    -*** Input Basics - Keyboard - main.rb
    +*** Rendering Sprites - Animation Using Separate Pngs - main.rb
     #+begin_src ruby
    -  # ./samples/02_input_basics/01_keyboard/app/main.rb
    +  # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb
       =begin
       
    -  APIs listing that haven't been encountered in a previous sample apps:
    +   Reminders:
       
    -  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    -    to the frame  that the key_up event occurred (the frame correlates
    -    to args.state.tick_count). Otherwise the value will be nil. For a
    -    full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    -  - args.state.PROPERTY: The state property on args is a dynamic
    -    structure. You can define ANY property here with ANY type of
    -    arbitrary nesting. Properties defined on args.state will be retained
    -    across frames. If you attempt access a property that doesn't exist
    -    on args.state, it will simply return nil (no exception will be thrown).
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
       
    -  =end
    +     In this sample app, we're using string interpolation to iterate through images in the
    +     sprites folder using their image path names.
       
    -  # Along with outputs, inputs are also an essential part of video game development
    -  # DragonRuby can take input from keyboards, mouse, and controllers.
    -  # This sample app will cover keyboard input.
    +   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.
    +     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
       
    -  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    -  # This will work with the other keys as well
    +   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    +     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +     For more information about labels, go to mygame/documentation/02-labels.md.
       
    +   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.
    +     Stores the frame that key was pressed on.
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +  
    +  =end
    +  
    +  # This sample app demonstrates how sprite animations work.
    +  # There are two sprites that animate forever and one sprite
    +  # that *only* animates when you press the "f" key on the keyboard.
       
    +  # This is the entry point to your game. The `tick` method
    +  # executes at 60 frames per second. There are two methods
    +  # in this tick "entry point": `looping_animation`, and the
    +  # second method is `one_time_animation`.
       def tick args
    -    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    -    # Notice how small_font accounts for all the remaining parameters
    -    args.outputs.labels << [460, row_to_px(args, 0), "Current game time: #{args.state.tick_count}", small_font]
    -    args.outputs.labels << [460, row_to_px(args, 2), "Keyboard input: args.inputs.keyboard.key_up.h", small_font]
    -    args.outputs.labels << [460, row_to_px(args, 3), "Press \"h\" on the keyboard.", small_font]
    +    # uncomment the line below to see animation play out in slow motion
    +    # args.gtk.slowmo! 6
    +    looping_animation args
    +    one_time_animation args
    +  end
       
    -    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    -    if args.inputs.keyboard.key_up.h
    -      args.state.h_pressed_at = args.state.tick_count
    -    end
    +  # This function shows how to animate a sprite that loops forever.
    +  def looping_animation args
    +    # Here we define a few local variables that will be sent
    +    # into the magic function that gives us the correct sprite image
    +    # over time. There are four things we need in order to figure
    +    # out which sprite to show.
       
    -    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    -    args.state.h_pressed_at ||= false
    +    # 1. When to start the animation.
    +    start_looping_at = 0
       
    -    if args.state.h_pressed_at
    -      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" was pressed at time: #{args.state.h_pressed_at}", small_font]
    -    else
    -      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" has never been pressed.", small_font]
    -    end
    +    # 2. The number of pngs that represent the full animation.
    +    number_of_sprites = 6
       
    -    tick_help_text args
    -  end
    +    # 3. How long to show each png.
    +    number_of_frames_to_show_each_sprite = 4
       
    -  def small_font
    -    # This method provides some values for the construction of labels
    -    # Specifically, Size, Alignment, & RGBA
    -    # This makes it so that custom parameters don't have to be repeatedly typed.
    -    # Additionally "small_font" provides programmers with more information than some numbers
    -    [-2, 0, 0, 0, 0, 255]
    -  end
    +    # 4. Whether the animation should loop once, or forever.
    +    does_sprite_loop = true
       
    -  def row_to_px args, row_number
    -    # This takes a row_number and converts it to pixels DragonRuby understands.
    -    # Row 0 starts 5 units below the top of the grid
    -    # Each row afterward is 20 units lower
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    -  end
    +    # With the variables defined above, we can get a number
    +    # which represents the sprite to show by calling the `frame_index` function.
    +    # In this case the number will be between 0, and 5 (you can see the sprites
    +    # in the ./sprites directory).
    +    sprite_index = start_looping_at.frame_index number_of_sprites,
    +                                                number_of_frames_to_show_each_sprite,
    +                                                does_sprite_loop
       
    -  # Don't worry about understanding the code within this method just yet.
    -  # This method shows you the help text within the game.
    -  def tick_help_text args
    -    return unless args.state.h_pressed_at
    +    # Now that we have `sprite_index, we can present the correct file.
    +    args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
       
    -    args.state.key_value_history      ||= {}
    -    args.state.key_down_value_history ||= {}
    -    args.state.key_held_value_history ||= {}
    -    args.state.key_up_value_history   ||= {}
    +    # Try changing the numbers below to see how the animation changes:
    +    args.outputs.sprites << { x: 100, y: 200, w: 100, h: 100, path: "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png" }
    +  end
       
    -    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    -        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    -        args.inputs.keyboard.key_up.truthy_keys.length > 0)
    -      args.state.help_available = true
    -      args.state.no_activity_debounce = nil
    -    else
    -      args.state.no_activity_debounce ||= 5.seconds
    -      args.state.no_activity_debounce -= 1
    -      if args.state.no_activity_debounce <= 0
    -        args.state.help_available = false
    -        args.state.key_value_history        = {}
    -        args.state.key_down_value_history   = {}
    -        args.state.key_held_value_history   = {}
    -        args.state.key_up_value_history     = {}
    -      end
    -    end
    +  # This function shows how to animate a sprite that executes
    +  # only once when the "f" key is pressed.
    +  def one_time_animation args
    +    # This is just a label the shows instructions within the game.
    +    args.outputs.labels <<  { x: 220, y: 350, text: "(press f to animate)" }
       
    -    args.outputs.labels << [10, row_to_px(args, 6), "Advanced Help:", small_font]
    +    # If "f" is pressed on the keyboard...
    +    if args.inputs.keyboard.key_down.f
    +      # Print the frame that "f" was pressed on.
    +      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.state.tick_count}"
       
    -    if !args.state.help_available
    -      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    -      return
    +      # And MOST IMPORTANTLY set the point it time to start the animation,
    +      # equal to "now" which is represented as args.state.tick_count.
    +  
    +      # Also IMPORTANT, you'll notice that the value of when to start looping
    +      # is stored in `args.state`. This construct's values are retained across
    +      # executions of the `tick` method.
    +      args.state.start_looping_at = args.state.tick_count
         end
       
    -    args.outputs.labels << [10 , row_to_px(args, 7), "args.inputs.keyboard", small_font]
    -    args.outputs.labels << [330, row_to_px(args, 7), "args.inputs.keyboard.key_down", small_font]
    -    args.outputs.labels << [650, row_to_px(args, 7), "args.inputs.keyboard.key_held", small_font]
    -    args.outputs.labels << [990, row_to_px(args, 7), "args.inputs.keyboard.key_up", small_font]
    +    # These are the same local variables that were defined
    +    # for the `looping_animation` function.
    +    number_of_sprites = 6
    +    number_of_frames_to_show_each_sprite = 4
       
    -    fill_history args, :key_value_history,      :down_or_held, nil
    -    fill_history args, :key_down_value_history, :down,        :key_down
    -    fill_history args, :key_held_value_history, :held,        :key_held
    -    fill_history args, :key_up_value_history,   :up,          :key_up
    +    # Except this sprite does not loop again. If the animation time has passed,
    +    # then the frame_index function returns nil.
    +    does_sprite_loop = false
       
    -    render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    -    render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    -    render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    -    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    -  end
    +    sprite_index = args.state
    +                       .start_looping_at
    +                       .frame_index number_of_sprites,
    +                                    number_of_frames_to_show_each_sprite,
    +                                    does_sprite_loop
       
    -  def fill_history args, history_key, state_key, keyboard_method
    -    fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    -    fill_single_history args, history_key, state_key, keyboard_method, :char
    -    args.inputs.keyboard.keys[state_key].each do |key_name|
    -      fill_single_history args, history_key, state_key, keyboard_method, key_name
    -    end
    -  end
    +    # This line sets the frame index to zero, if
    +    # the animation duration has passed (frame_index returned nil).
       
    -  def fill_single_history args, history_key, state_key, keyboard_method, key_name
    -    current_value = args.inputs.keyboard.send(key_name)
    -    if keyboard_method
    -      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
    -    end
    -    args.state.as_hash[history_key][key_name] ||= []
    -    args.state.as_hash[history_key][key_name] << current_value
    -    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
    -  end
    +    # Remeber: we are not looping forever here.
    +    sprite_index ||= 0
       
    -  def render_help_labels args, history_key, state_key, keyboard_method, x
    -    idx = 8
    -    args.outputs.labels << args.state
    -                             .as_hash[history_key]
    -                             .keys
    -                             .reverse
    -                             .map
    -                             .with_index do |k, i|
    -      v = args.state.as_hash[history_key][k]
    -      current_value = args.inputs.keyboard.send(k)
    -      if keyboard_method
    -        current_value = args.inputs.keyboard.send(keyboard_method).send(k)
    -      end
    -      idx += 2
    -      [
    -        [x, row_to_px(args, idx - 2),
    -         "    .#{k} is #{current_value || "nil"}",
    -         small_font],
    -        [x, row_to_px(args, idx - 1),
    -         "       was #{v}",
    -         small_font]
    -      ]
    -    end
    -  end
    +    # Present the sprite.
    +    args.outputs.sprites << { x: 100, y: 300, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
       
    +    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."
    +  end
       
       def tick_instructions args, text, y = 715
         return if args.state.key_event_occurred
    @@ -4772,597 +4762,627 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Input Basics - Mouse - main.rb
    +*** Rendering Sprites - Animation Using Sprite Sheet - main.rb
     #+begin_src ruby
    -  # ./samples/02_input_basics/02_mouse/app/main.rb
    -  =begin
    -  
    -  APIs that haven't been encountered in a previous sample apps:
    -  
    -  - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -    since the click event.
    -  
    -  Reminder:
    -  
    -  - args.state.PROPERTY: The state property on args is a dynamic
    -    structure. You can define ANY property here with ANY type of
    -    arbitrary nesting. Properties defined on args.state will be retained
    -    across frames. If you attempt access a property that doesn't exist
    -    on args.state, it will simply return nil (no exception will be thrown).
    -  
    -  =end
    -  
    -  # This code demonstrates DragonRuby mouse input
    -  
    -  # To see if the a mouse click occurred
    -  # Use args.inputs.mouse.click
    -  # Which returns a boolean
    -  
    -  # To see where a mouse click occurred
    -  # Use args.inputs.mouse.click.point.x AND
    -  # args.inputs.mouse.click.point.y
    +  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb
    +  def tick args
    +    args.state.player.x ||= 100
    +    args.state.player.y ||= 100
    +    args.state.player.w ||= 64
    +    args.state.player.h ||= 64
    +    args.state.player.direction ||= 1
       
    -  # To see which frame the click occurred
    -  # Use args.inputs.mouse.click.created_at
    +    args.state.player.is_moving = false
       
    -  # To see how many frames its been since the click occurred
    -  # Use args.inputs.mouse.click.creat_at_elapsed
    +    # get the keyboard input and set player properties
    +    if args.inputs.keyboard.right
    +      args.state.player.x += 3
    +      args.state.player.direction = 1
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    elsif args.inputs.keyboard.left
    +      args.state.player.x -= 3
    +      args.state.player.direction = -1
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    end
       
    -  # Saving the click in args.state can be quite useful
    +    if args.inputs.keyboard.up
    +      args.state.player.y += 1
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    elsif args.inputs.keyboard.down
    +      args.state.player.y -= 1
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    end
       
    -  def tick args
    -    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    -    x = 460
    +    # if no arrow keys are being pressed, set the player as not moving
    +    if !args.inputs.keyboard.directional_vector
    +      args.state.player.started_running_at = nil
    +    end
       
    -    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
    +    # wrap player around the stage
    +    if args.state.player.x > 1280
    +      args.state.player.x = -64
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    elsif args.state.player.x < -64
    +      args.state.player.x = 1280
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    end
       
    -    if args.inputs.mouse.click
    -      args.state.last_mouse_click = args.inputs.mouse.click
    +    if args.state.player.y > 720
    +      args.state.player.y = -64
    +      args.state.player.started_running_at ||= args.state.tick_count
    +    elsif args.state.player.y < -64
    +      args.state.player.y = 720
    +      args.state.player.started_running_at ||= args.state.tick_count
         end
       
    -    if args.state.last_mouse_click
    -      click = args.state.last_mouse_click
    -      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    -      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    -      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
    +    # render player as standing or running
    +    if args.state.player.started_running_at
    +      args.outputs.sprites << running_sprite(args)
         else
    -      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    -      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
    +      args.outputs.sprites << standing_sprite(args)
         end
    +    args.outputs.labels << [30, 700, "Use arrow keys to move around."]
       end
       
    -  def small_label args, x, row, message
    -    # This method effectively combines the row_to_px and small_font methods
    -    # It changes the given row value to a DragonRuby pixel value
    -    # and adds the customization parameters
    -    [x, row_to_px(args, row), message, small_font]
    -  end
    -  
    -  def small_font
    -    [-2, 0, 0, 0, 0, 255]
    -  end
    -  
    -  def row_to_px args, row_number
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +  def standing_sprite args
    +    {
    +      x: args.state.player.x,
    +      y: args.state.player.y,
    +      w: args.state.player.w,
    +      h: args.state.player.h,
    +      path: "sprites/horizontal-stand.png",
    +      flip_horizontally: args.state.player.direction > 0
    +    }
       end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    +  def running_sprite args
    +    if !args.state.player.started_running_at
    +      tile_index = 0
    +    else
    +      how_many_frames_in_sprite_sheet = 6
    +      how_many_ticks_to_hold_each_frame = 3
    +      should_the_index_repeat = true
    +      tile_index = args.state
    +                       .player
    +                       .started_running_at
    +                       .frame_index(how_many_frames_in_sprite_sheet,
    +                                    how_many_ticks_to_hold_each_frame,
    +                                    should_the_index_repeat)
         end
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    {
    +      x: args.state.player.x,
    +      y: args.state.player.y,
    +      w: args.state.player.w,
    +      h: args.state.player.h,
    +      path: 'sprites/horizontal-run.png',
    +      tile_x: 0 + (tile_index * args.state.player.w),
    +      tile_y: 0,
    +      tile_w: args.state.player.w,
    +      tile_h: args.state.player.h,
    +      flip_horizontally: args.state.player.direction > 0,
    +    }
       end
     
     #+end_src
     
    -*** Input Basics - Mouse Point To Rect - main.rb
    +*** Rendering Sprites - Animation States - main.rb
     #+begin_src ruby
    -  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    -  =begin
    -  
    -  APIs that haven't been encountered in a previous sample apps:
    -  
    -  - args.outputus.borders: An array. Values in this array will be rendered as
    -    unfilled rectangles on the screen.
    -  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -    with at least four values is considered a rect. The inside_rect? function returns true
    -    or false depending on if the point is inside the rect.
    -  
    -    ```
    -    # Point:  x: 100, y: 100
    -    # Rect:   x: 0, y: 0, w: 500, h: 500
    -    # Result: true
    -  
    -    [100, 100].inside_rect? [0, 0, 500, 500]
    -    ```
    -  
    -    ```
    -    # Point:  x: 100, y: 100
    -    # Rect:   x: 300, y: 300, w: 100, h: 100
    -    # Result: false
    +  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb
    +  class Game
    +    attr_gtk
       
    -    [100, 100].inside_rect? [300, 300, 100, 100]
    -    ```
    +    def defaults
    +      state.show_debug_layer  = true if state.tick_count == 0
    +      player.tile_size        = 64
    +      player.speed            = 3
    +      player.slash_frames     = 15
    +      player.x              ||= 50
    +      player.y              ||= 400
    +      player.dir_x          ||=  1
    +      player.dir_y          ||= -1
    +      player.is_moving      ||= false
    +      state.watch_list      ||= {}
    +      state.enemies         ||= []
    +    end
       
    -  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -    since the click event.
    +    def add_enemy
    +      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }
    +    end
       
    -  =end
    +    def sprite_horizontal_run
    +      tile_index = 0.frame_index(6, 3, true)
    +      tile_index = 0 if !player.is_moving
       
    -  # To determine whether a point is in a rect
    -  # Use point.inside_rect? rect
    +      {
    +        x: player.x,
    +        y: player.y,
    +        w: player.tile_size,
    +        h: player.tile_size,
    +        path: 'sprites/horizontal-run.png',
    +        tile_x: 0 + (tile_index * player.tile_size),
    +        tile_y: 0,
    +        tile_w: player.tile_size,
    +        tile_h: player.tile_size,
    +        flip_horizontally: player.dir_x > 0,
    +        # a: 40
    +      }
    +    end
       
    -  # This is useful to determine if a click occurred in a rect
    +    def sprite_horizontal_stand
    +      {
    +        x: player.x,
    +        y: player.y,
    +        w: player.tile_size,
    +        h: player.tile_size,
    +        path: 'sprites/horizontal-stand.png',
    +        flip_horizontally: player.dir_x > 0,
    +        # a: 40
    +      }
    +    end
       
    -  def tick args
    -    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
    +    def sprite_horizontal_slash
    +      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0
       
    -    x = 460
    -  
    -    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
    -  
    -    box = [785, 370, 50, 50, 0, 0, 170]
    -    args.outputs.borders << box
    -  
    -    # Saves the most recent click into args.state
    -    # Unlike the other components of args,
    -    # args.state does not reset every tick.
    -    if args.inputs.mouse.click
    -      args.state.last_mouse_click = args.inputs.mouse.click
    +      {
    +        x: player.x - 41.25,
    +        y: player.y - 41.25,
    +        w: 165,
    +        h: 165,
    +        path: 'sprites/horizontal-slash.png',
    +        tile_x: 0 + (tile_index * 128),
    +        tile_y: 0,
    +        tile_w: 128,
    +        tile_h: 128,
    +        flip_horizontally: player.dir_x > 0
    +      }
         end
       
    -    if args.state.last_mouse_click
    -      if args.state.last_mouse_click.point.inside_rect? box
    -        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    +    def render_player
    +      if player.slash_at
    +        outputs.sprites << sprite_horizontal_slash
    +      elsif player.is_moving
    +        outputs.sprites << sprite_horizontal_run
           else
    -        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    +        outputs.sprites << sprite_horizontal_stand
           end
    -    else
    -      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
         end
    -  end
    -  
    -  def small_label args, x, row, message
    -    [x, row_to_px(args, row), message, small_font]
    -  end
    -  
    -  def small_font
    -    [-2, 0, 0, 0, 0, 255]
    -  end
    -  
    -  def row_to_px args, row_number
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    -  end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    +    def render_enemies
    +      outputs.borders << state.enemies
         end
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    -
    -#+end_src
    -
    -*** Input Basics - Mouse Rect To Rect - main.rb
    -#+begin_src ruby
    -  # ./samples/02_input_basics/04_mouse_rect_to_rect/app/main.rb
    -  =begin
    -  
    -  APIs that haven't been encountered in a previous sample apps:
    -  
    -  - args.outputs.borders: An array. Values in this array will be rendered as
    -    unfilled rectangles on the screen.
    -  - ARRAY#intersect_rect?: An array with at least four values is
    -    considered a rect. The intersect_rect? function returns true
    -    or false depending on if the two rectangles intersect.
    +    def render_debug_layer
    +      return if !state.show_debug_layer
    +      outputs.labels << state.watch_list.map.with_index do |(k, v), i|
    +         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]
    +      end
       
    -    ```
    -    # Rect One: x: 100, y: 100, w: 100, h: 100
    -    # Rect Two: x: 0, y: 0, w: 500, h: 500
    -    # Result:   true
    +      outputs.borders << player.slash_collision_rect
    +    end
       
    -    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]
    -    ```
    +    def slash_initiate?
    +      # buffalo usb controller has a button and b button swapped lol
    +      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j
    +    end
       
    -    ```
    -    # Rect One: x: 100, y: 100, w: 10, h: 10
    -    # Rect Two: x: 500, y: 500, w: 10, h: 10
    -    # Result:   false
    +    def input
    +      # player movement
    +      if slash_complete? && (vector = inputs.directional_vector)
    +        player.x += vector.x * player.speed
    +        player.y += vector.y * player.speed
    +      end
    +      player.slash_at = slash_initiate? if slash_initiate?
    +    end
       
    -    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]
    -    ```
    +    def calc_movement
    +      # movement
    +      if vector = inputs.directional_vector
    +        state.debug_label = vector
    +        player.dir_x = vector.x
    +        player.dir_y = vector.y
    +        player.is_moving = true
    +      else
    +        state.debug_label = vector
    +        player.is_moving = false
    +      end
    +    end
       
    -  =end
    +    def calc_slash
    +      # re-calc the location of the swords collision box
    +      if player.dir_x.positive?
    +        player.slash_collision_rect = [player.x + player.tile_size,
    +                                       player.y + player.tile_size.half - 10,
    +                                       40, 20]
    +      else
    +        player.slash_collision_rect = [player.x - 32 - 8,
    +                                       player.y + player.tile_size.half - 10,
    +                                       40, 20]
    +      end
       
    -  # Similarly, whether rects intersect can be found through
    -  # rect1.intersect_rect? rect2
    +      # recalc sword's slash state
    +      player.slash_at = nil if slash_complete?
       
    -  def tick args
    -    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."
    -    x = 460
    +      # determine collision if the sword is at it's point of damaging
    +      return unless slash_can_damage?
       
    -    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")
    -    # red_box = [460, 250, 355, 90, 170, 0, 0]
    -    # args.outputs.borders << red_box
    +      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }
    +    end
       
    -    # args.state.box_collision_one and args.state.box_collision_two
    -    # Are given values of a solid when they should be rendered
    -    # They are stored in game so that they do not get reset every tick
    -    if args.inputs.mouse.click
    -      if !args.state.box_collision_one
    -        args.state.box_collision_one = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 180, 0,   0, 180]
    -      elsif !args.state.box_collision_two
    -        args.state.box_collision_two = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125,   0, 0, 180, 180]
    -      else
    -        args.state.box_collision_one = nil
    -        args.state.box_collision_two = nil
    -      end
    +    def slash_complete?
    +      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)
         end
       
    -    if args.state.box_collision_one
    -      args.outputs.solids << args.state.box_collision_one
    +    def slash_can_damage?
    +      # damage occurs half way into the slash animation
    +      return false if slash_complete?
    +      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count
    +      return true
         end
       
    -    if args.state.box_collision_two
    -      args.outputs.solids << args.state.box_collision_two
    +    def calc
    +      # generate an enemy if there aren't any on the screen
    +      add_enemy if state.enemies.length == 0
    +      calc_movement
    +      calc_slash
         end
       
    -    if args.state.box_collision_one && args.state.box_collision_two
    -      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two
    -        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')
    -      else
    -        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')
    -      end
    -    else
    -      args.outputs.labels << small_label(args, x, 4, '--')
    +    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past
    +    def tick
    +      defaults
    +      render_enemies
    +      render_player
    +      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]
    +      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]
    +      render_debug_layer
    +      input
    +      calc
         end
    -  end
       
    -  def small_label args, x, row, message
    -    [x, row_to_px(args, row), message, small_font]
    +    def player
    +      state.player
    +    end
       end
       
    -  def small_font
    -    [-2, 0, 0, 0, 0, 255]
    -  end
    +  $game = Game.new
       
    -  def row_to_px args, row_number
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +  def tick args
    +    $game.args = args
    +    $game.tick
       end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    -    end
    -  
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    +  $gtk.reset
     
     #+end_src
     
    -*** Input Basics - Controller - main.rb
    +*** Rendering Sprites - Color And Rotation - main.rb
     #+begin_src ruby
    -  # ./samples/02_input_basics/05_controller/app/main.rb
    +  # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb
       =begin
    -  
        APIs listing that haven't been encountered in previous sample apps:
       
    -   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key
    -     is being held down on the controller.
    -     If there is more than one controller being used, they can be differentiated by
    -     using names like controller_one and controller_two.
    +   - merge: Returns a hash containing the contents of two original hashes.
    +     Merge does not allow duplicate keys, so the value of a repeated key
    +     will be overwritten.
       
    -     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.
    +     For example, if we had two hashes
    +     h1 = { "a" => 1, "b" => 2}
    +     h2 = { "b" => 3, "c" => 3}
    +     and we called the command
    +     h1.merge(h2)
    +     the result would the following hash
    +     { "a" => 1, "b" => 3, "c" => 3}.
       
    -   Reminder:
    +   Reminders:
       
    -   - args.state.PROPERTY: The state property on args is a dynamic
    -     structure. You can define ANY property here with ANY type of
    -     arbitrary nesting. Properties defined on args.state will be retained
    -     across frames. If you attempt to access a property that doesn't exist
    -     on args.state, it will simply return nil (no exception will be thrown).
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +     using their keys.
    +     In this sample app, we're using a hash to create a sprite.
       
    -     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.
    -     The parameters of a button are:
    -     1. the position (x, y)
    -     2. the input key held on the controller
    -     3. the text or name of the button
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +     Before continuing with this sample app, it is HIGHLY recommended that you look
    +     at mygame/documentation/05-sprites.md.
       
    -  =end
    +   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
       
    -  # This sample app provides a visual demonstration of a standard controller, including
    -  # the placement and function of all buttons.
    +   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.
    +     For more information about the controller, go to mygame/documentation/08-controllers.md.
       
    -  class ControllerDemo
    -    attr_accessor :inputs, :state, :outputs
    +   - num1.lesser(num2): Finds the lower value of the given options.
       
    -    # Calls the methods necessary for the app to run successfully.
    -    def tick
    -      process_inputs
    -      render
    -    end
    +  =end
       
    -    # Starts with an empty collection of buttons.
    -    # Adds buttons that are on the controller to the collection.
    -    def process_inputs
    -      state.buttons = []
    +  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,
    +  # and also can be moved in different directions through keyboard input from the user.
    +  
    +  # Calls the methods necessary for the game to run successfully.
    +  def tick args
    +    default args
    +    render args.grid, args.outputs, args.state
    +    calc args.state
    +    process_inputs args
    +  end
       
    -      state.buttons << [100, 500, inputs.controller_one.key_held.l1, "L1"]
    -      state.buttons << [100, 600, inputs.controller_one.key_held.l2, "L2"]
    +  # Sets default values for the car sprite
    +  # Initialization ||= only happens in the first frame
    +  def default args
    +    args.state.sprite.width    = 19
    +    args.state.sprite.height   = 10
    +    args.state.sprite.scale    = 4
    +    args.state.max_speed       = 5
    +    args.state.x             ||= 100
    +    args.state.y             ||= 100
    +    args.state.speed         ||= 1
    +    args.state.angle         ||= 0
    +  end
       
    -      state.buttons << [1100, 500, inputs.controller_one.key_held.r1, "R1"]
    -      state.buttons << [1100, 600, inputs.controller_one.key_held.r2, "R2"]
    +  # Outputs sprite onto screen
    +  def render grid, outputs, state
    +    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background
    +    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite
    +    'sprites/86.png', # image path of car
    +    state.angle,
    +    opacity, # transparency
    +    saturation,
    +    source_rect(state), # sprite sub division/tile (tile x, y, w, h)
    +    false, false,  # don't flip sprites
    +    rotation_anchor]
       
    -      state.buttons << [540, 450, inputs.controller_one.key_held.select, "Select"]
    -      state.buttons << [660, 450, inputs.controller_one.key_held.start, "Start"]
    +    # also look at the create_sprite helper method
    +    #
    +    # For example:
    +    #
    +    # dest   = destination_rect(state)
    +    # source = source_rect(state),
    +    # outputs.sprites << create_sprite(
    +    #   'sprites/86.png',
    +    #   x: dest.x,
    +    #   y: dest.y,
    +    #   w: dest.w,
    +    #   h: dest.h,
    +    #   angle: state.angle,
    +    #   source_x: source.x,
    +    #   source_y: source.y,
    +    #   source_w: source.w,
    +    #   source_h: source.h,
    +    #   flip_h: false,
    +    #   flip_v: false,
    +    #   rotation_anchor_x: 0.7,
    +    #   rotation_anchor_y: 0.5
    +    # )
    +  end
       
    -      state.buttons << [200, 300, inputs.controller_one.key_held.left, "Left"]
    -      state.buttons << [300, 400, inputs.controller_one.key_held.up, "Up"]
    -      state.buttons << [400, 300, inputs.controller_one.key_held.right, "Right"]
    -      state.buttons << [300, 200, inputs.controller_one.key_held.down, "Down"]
    +  # Creates sprite by setting values inside of a hash
    +  def create_sprite path, options = {}
    +    options = {
       
    -      state.buttons << [800, 300, inputs.controller_one.key_held.x, "X"]
    -      state.buttons << [900, 400, inputs.controller_one.key_held.y, "Y"]
    -      state.buttons << [1000, 300, inputs.controller_one.key_held.a, "A"]
    -      state.buttons << [900, 200, inputs.controller_one.key_held.b, "B"]
    +      # dest x, y, w, h
    +      x: 0,
    +      y: 0,
    +      w: 100,
    +      h: 100,
       
    -      state.buttons << [450 + inputs.controller_one.left_analog_x_perc * 100,
    -                        100 + inputs.controller_one.left_analog_y_perc * 100,
    -                        inputs.controller_one.key_held.l3,
    -                        "L3"]
    +      # angle, rotation
    +      angle: 0,
    +      rotation_anchor_x: 0.5,
    +      rotation_anchor_y: 0.5,
       
    -      state.buttons << [750 + inputs.controller_one.right_analog_x_perc * 100,
    -                        100 + inputs.controller_one.right_analog_y_perc * 100,
    -                        inputs.controller_one.key_held.r3,
    -                        "R3"]
    -    end
    +      # color saturation (red, green, blue), transparency
    +      r: 255,
    +      g: 255,
    +      b: 255,
    +      a: 255,
       
    -    # Gives each button a square shape.
    -    # If the button is being pressed or held (which means it is considered active),
    -    # the square is filled in. Otherwise, the button simply has a border.
    -    def render
    -      state.buttons.each do |x, y, active, text|
    -        rect = [x, y, 75, 75]
    +      # source x, y, width, height
    +      source_x: 0,
    +      source_y: 0,
    +      source_w: -1,
    +      source_h: -1,
       
    -        if active # if button is pressed
    -          outputs.solids << rect # rect is output as solid (filled in)
    -        else
    -          outputs.borders << rect # otherwise, output as border
    -        end
    +      # flip horiztonally, flip vertically
    +      flip_h: false,
    +      flip_v: false,
       
    -        # Outputs the text of each button using labels.
    -        outputs.labels << [x, y + 95, text] # add 95 to place label above button
    -      end
    +    }.merge options
       
    -      outputs.labels << [10, 60, "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)"]
    -      outputs.labels << [10, 30, "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)"]
    -      outputs.labels << [900, 60, "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)"]
    -      outputs.labels << [900, 30, "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)"]
    -    end
    +    [
    +      options[:x], options[:y], options[:w], options[:h], # dest rect keys
    +      path,
    +      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha
    +      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys
    +      options[:flip_h], options[:flip_v], # flip
    +      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor
    +    ] # hash keys contain corresponding values
       end
       
    -  $controller_demo = ControllerDemo.new
    -  
    -  def tick args
    -    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."
    -    $controller_demo.inputs = args.inputs
    -    $controller_demo.state = args.state
    -    $controller_demo.outputs = args.outputs
    -    $controller_demo.tick
    +  # Calls the calc_pos and calc_wrap methods.
    +  def calc state
    +    calc_pos state
    +    calc_wrap state
       end
       
    -  # Resets the app.
    -  def r
    -    $gtk.reset
    +  # Changes sprite's position on screen
    +  # Vectors have magnitude and direction, so the incremented x and y values give the car direction
    +  def calc_pos state
    +    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed
    +    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed
    +    state.speed *= 1.1 # scales speed up
    +    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)
       end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    -    end
    +  # The screen's dimensions are 1280x720. If the car goes out of scope,
    +  # it loops back around on the screen.
    +  def calc_wrap state
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    # car returns to left side of screen if it disappears on right side of screen
    +    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger
    +    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280
    +  
    +    # car wraps around to right side of screen if it disappears on the left side
    +    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0
    +  
    +    # car wraps around to bottom of screen if it disappears at the top of the screen
    +    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)
    +    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope
    +  
    +    # car wraps around to top of screen if it disappears at the bottom of the screen
    +    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0
       end
    -
    -#+end_src
    -
    -*** Input Basics - Touch - main.rb
    -#+begin_src ruby
    -  # ./samples/02_input_basics/06_touch/app/main.rb
    -  def tick args
    -    args.outputs.background_color = [ 0, 0, 0 ]
    -    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label
       
    -    # If you don't want to get fancy, you can just look for finger_one
    -    #  (and _two, if you like), which are assigned in the order new touches hit
    -    #  the screen. If not nil, they are touching right now, and are just
    -    #  references to specific items in the args.input.touch hash.
    -    # If finger_one lifts off, it will become nil, but finger_two, if it was
    -    #  touching, remains until it also lifts off. When all fingers lift off, the
    -    #  the next new touch will be finger_one again, but until then, new touches
    -    #  don't fill in earlier slots.
    -    if !args.inputs.finger_one.nil?
    -      args.outputs.primitives << [640, 650, "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).", 5, 1, 255, 255, 255].label
    -    end
    -    if !args.inputs.finger_two.nil?
    -      args.outputs.primitives << [640, 600, "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).", 5, 1, 255, 255, 255].label
    +  # Changes angle of sprite based on user input from keyboard or controller
    +  def process_inputs args
    +  
    +    # NOTE: increasing the angle doesn't mean that the car will continue to go
    +    # in a specific direction. The angle is increasing, which means that if the
    +    # left key was kept in the "down" state, the change in the angle would cause
    +    # the car to go in a counter-clockwise direction and form a circle (360 degrees)
    +    if args.inputs.keyboard.key_held.left # if left key is pressed
    +      args.state.angle += 2 # car's angle is incremented by 2
    +  
    +    # The same applies to decreasing the angle. If the right key was kept in the
    +    # "down" state, the decreasing angle would cause the car to go in a clockwise
    +    # direction and form a circle (360 degrees)
    +    elsif args.inputs.keyboard.key_held.right # if right key is pressed
    +      args.state.angle -= 2 # car's angle is decremented by 2
    +  
    +    # Input from a controller can also change the angle of the car
    +    elsif args.inputs.controller_one.left_analog_x_perc != 0
    +      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1
         end
    +  end
       
    -    # Here's the more flexible interface: this will report as many simultaneous
    -    #  touches as the system can handle, but it's a little more effort to track
    -    #  them. Each item in the args.input.touch hash has a unique key (an
    -    #  incrementing integer) that exists until the finger lifts off. You can
    -    #  tell which order the touches happened globally by the key value, or
    -    #  by the touch[id].touch_order field, which resets to zero each time all
    -    #  touches have lifted.
    +  # A sprite's center of rotation can be altered
    +  # Increasing either of these numbers would dramatically increase the
    +  # car's drift when it turns!
    +  def rotation_anchor
    +    [0.7, 0.5]
    +  end
       
    -    args.state.colors ||= [
    -      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF
    -    ]
    +  # Sets opacity value of sprite to 255 so that it is not transparent at all
    +  # Change it to 0 and you won't be able to see the car sprite on the screen
    +  def opacity
    +    255
    +  end
       
    -    size = 100
    -    args.inputs.touch.each { |k,v|
    -      color = args.state.colors[v.touch_order % 7]
    -      r = (color & 0xFF0000) >> 16
    -      g = (color & 0x00FF00) >> 8
    -      b = (color & 0x0000FF)
    -      args.outputs.primitives << [v.x - (size / 2), v.y + (size / 2), size, size, r, g, b, 255].solid
    -      args.outputs.primitives << [v.x, v.y + size, k.to_s, 0, 1, 0, 0, 0].label
    -    }
    +  # Sets the color of the sprite to white.
    +  def saturation
    +    [255, 255, 255]
    +  end
    +  
    +  # Sets definition of destination_rect (used to define the car sprite)
    +  def destination_rect state
    +    [state.x, state.y,
    +    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size
    +    state.sprite.height * state.sprite.scale]
       end
       
    +  # Portion of a sprite (a tile)
    +  # Sub division of sprite is denoted as a rectangle directly related to original size of .png
    +  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)
    +  def source_rect state
    +    [0, 0, state.sprite.width, state.sprite.height]
    +  end
     
     #+end_src
     
    -*** Rendering Sprites - Animation Using Separate Pngs - main.rb
    +*** Physics And Collisions - Simple - main.rb
     #+begin_src ruby
    -  # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb
    +  # ./samples/04_physics_and_collisions/01_simple/app/main.rb
       =begin
       
        Reminders:
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
       
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    -  
    -     In this sample app, we're using string interpolation to iterate through images in the
    -     sprites folder using their image path names.
    -  
    -   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.
    -     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    -  
    -   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    -     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    -  
    -   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.
    -     Stores the frame that key was pressed on.
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +   - args.outputs.solids: An array. The values generate a solid.
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
       
       =end
       
    -  # This sample app demonstrates how sprite animations work.
    -  # There are two sprites that animate forever and one sprite
    -  # that *only* animates when you press the "f" key on the keyboard.
    +  # This sample app shows collisions between two boxes.
       
    -  # This is the entry point to your game. The `tick` method
    -  # executes at 60 frames per second. There are two methods
    -  # in this tick "entry point": `looping_animation`, and the
    -  # second method is `one_time_animation`.
    +  # Runs methods needed for game to run properly.
       def tick args
    -    looping_animation args
    -    one_time_animation args
    +    tick_instructions args, "Sample app shows how to move a square over time and determine collision."
    +    defaults args
    +    render args
    +    calc args
       end
       
    -  # This function shows how to animate a sprite that loops forever.
    -  def looping_animation args
    -    # Here we define a few local variables that will be sent
    -    # into the magic function that gives us the correct sprite image
    -    # over time. There are four things we need in order to figure
    -    # out which sprite to show.
    -  
    -    # 1. When to start the animation.
    -    start_looping_at = 0
    -  
    -    # 2. The number of pngs that represent the full animation.
    -    number_of_sprites = 6
    -  
    -    # 3. How long to show each png.
    -    number_of_frames_to_show_each_sprite = 4
    -  
    -    # 4. Whether the animation should loop once, or forever.
    -    does_sprite_loop = true
    -  
    -    # With the variables defined above, we can get a number
    -    # which represents the sprite to show by calling the `frame_index` function.
    -    # In this case the number will be between 0, and 5 (you can see the sprites
    -    # in the ./sprites directory).
    -    sprite_index = start_looping_at.frame_index number_of_sprites,
    -                                                number_of_frames_to_show_each_sprite,
    -                                                does_sprite_loop
    -  
    -    # Now that we have `sprite_index, we can present the correct file.
    -    args.outputs.sprites << [100, 100, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    +  # Sets default values.
    +  def defaults args
    +    # These values represent the moving box.
    +    args.state.moving_box_speed   = 10
    +    args.state.moving_box_size    = 100
    +    args.state.moving_box_dx    ||=  1
    +    args.state.moving_box_dy    ||=  1
    +    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height
       
    -    # Try changing the numbers below to see how the animation changes:
    -    args.outputs.sprites << [100, 200, 100, 100, "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png"]
    +    # These values represent the center box.
    +    args.state.center_box ||= [540, 260, 200, 200, 180]
    +    args.state.center_box_collision ||= false # initially no collision
       end
       
    -  # This function shows how to animate a sprite that executes
    -  # only once when the "f" key is pressed.
    -  def one_time_animation args
    -    # This is just a label the shows instructions within the game.
    -    args.outputs.labels << [220, 350, "(press f to animate)"]
    -  
    -    # If "f" is pressed on the keyboard...
    -    if args.inputs.keyboard.key_down.f
    -      # Print the frame that "f" was pressed on.
    -      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.inputs.keyboard.key_down.f}"
    -  
    -      # And MOST IMPORTANTLY set the point it time to start the animation,
    -      # equal to "now" which is represented as args.state.tick_count.
    -  
    -      # Also IMPORTANT, you'll notice that the value of when to start looping
    -      # is stored in `args.state`. This construct's values are retained across
    -      # executions of the `tick` method.
    -      args.state.start_looping_at = args.state.tick_count
    +  def render args
    +    # If the game state denotes that a collision has occured,
    +    # render a solid square, otherwise render a border instead.
    +    if args.state.center_box_collision
    +      args.outputs.solids << args.state.center_box
    +    else
    +      args.outputs.borders << args.state.center_box
         end
       
    -    # These are the same local variables that were defined
    -    # for the `looping_animation` function.
    -    number_of_sprites = 6
    -    number_of_frames_to_show_each_sprite = 4
    +    # Then render the moving box.
    +    args.outputs.solids << args.state.moving_box
    +  end
       
    -    # Except this sprite does not loop again. If the animation time has passed,
    -    # then the frame_index function returns nil.
    -    does_sprite_loop = false
    +  # Generally in a pipeline for a game engine, you have rendering,
    +  # game simulation (calculation), and input processing.
    +  # This fuction represents the game simulation.
    +  def calc args
    +    position_moving_box args
    +    determine_collision_center_box args
    +  end
       
    -    sprite_index = args.state
    -                       .start_looping_at
    -                       .frame_index number_of_sprites,
    -                                    number_of_frames_to_show_each_sprite,
    -                                    does_sprite_loop
    +  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,
    +  # and adding it to the current position.
    +  # dx and dy are positive if the box is moving right and up, respectively
    +  # dx and dy are negative if the box is moving left and down, respectively
    +  def position_moving_box args
    +    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed
    +    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed
       
    -    # This line sets the frame index to zero, if
    -    # the animation duration has passed (frame_index returned nil).
    +    # 1280x720 are the virtual pixels you work with (essentially 720p).
    +    screen_width  = 1280
    +    screen_height = 720
       
    -    # Remeber: we are not looping forever here.
    -    sprite_index ||= 0
    +    # Position of the box is denoted by the bottom left hand corner, in
    +    # that case, we have to subtract the width of the box so that it stays
    +    # in the scene (you can try deleting the subtraction to see how it
    +    # impacts the box's movement).
    +    if args.state.moving_box.x > screen_width - args.state.moving_box_size
    +      args.state.moving_box_dx = -1 # moves left
    +    elsif args.state.moving_box.x < 0
    +      args.state.moving_box_dx =  1 # moves right
    +    end
       
    -    # Present the sprite.
    -    args.outputs.sprites << [100, 300, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    +    # Here, we're making sure the moving box remains within the vertical scope of the screen
    +    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high
    +      args.state.moving_box_dy = -1 # moves down
    +    elsif args.state.moving_box.y < 0 # if the box moves too low
    +      args.state.moving_box_dy =  1 # moves up
    +    end
    +  end
       
    -    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."
    +  def determine_collision_center_box args
    +    # Collision is handled by the engine. You simply have to call the
    +    # `intersect_rect?` function.
    +    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect
    +      args.state.center_box_collision = true # then a collision happened
    +    else
    +      args.state.center_box_collision = false # otherwise, no collision happened
    +    end
       end
       
       def tick_instructions args, text, y = 715
    @@ -5381,932 +5401,794 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Rendering Sprites - Animation Using Sprite Sheet - main.rb
    +*** Physics And Collisions - Moving Objects - main.rb
     #+begin_src ruby
    -  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb
    -  def tick args
    -    args.state.player.x ||= 100
    -    args.state.player.y ||= 100
    -    args.state.player.w ||= 64
    -    args.state.player.h ||= 64
    -    args.state.player.direction ||= 1
    +  # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb
    +  =begin
       
    -    args.state.player.is_moving = false
    +   APIs listing that haven't been encountered in previous sample apps:
       
    -    # get the keyboard input and set player properties
    -    if args.inputs.keyboard.right
    -      args.state.player.x += 3
    -      args.state.player.direction = 1
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    elsif args.inputs.keyboard.left
    -      args.state.player.x -= 3
    -      args.state.player.direction = -1
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    end
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +     using their keys.
       
    -    if args.inputs.keyboard.up
    -      args.state.player.y += 1
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    elsif args.inputs.keyboard.down
    -      args.state.player.y -= 1
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    end
    +     For example, if we have a "numbers" hash that stores numbers in English as the
    +     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +     and on it goes.
       
    -    # if no arrow keys are being pressed, set the player as not moving
    -    if !args.inputs.keyboard.directional_vector
    -      args.state.player.started_running_at = nil
    -    end
    +     Now if we wanted to find the corresponding value of the "one" key, we could say
    +     puts numbers["one"]
    +     which would print "uno" to the console.
       
    -    # wrap player around the stage
    -    if args.state.player.x > 1280
    -      args.state.player.x = -64
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    elsif args.state.player.x < -64
    -      args.state.player.x = 1280
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    end
    +   - num1.greater(num2): Returns the greater value.
    +     For example, if we have the command
    +     puts 4.greater(3)
    +     the number 4 would be printed to the console since it has a greater value than 3.
    +     Similar to lesser, which returns the lesser value.
       
    -    if args.state.player.y > 720
    -      args.state.player.y = -64
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    elsif args.state.player.y < -64
    -      args.state.player.y = 720
    -      args.state.player.started_running_at ||= args.state.tick_count
    -    end
    +   - num1.lesser(num2): Finds the lower value of the given options.
    +     For example, in the statement
    +     a = 4.lesser(3)
    +     3 has a lower value than 4, which means that the value of a would be set to 3,
    +     but if the statement had been
    +     a = 4.lesser(5)
    +     4 has a lower value than 5, which means that the value of a would be set to 4.
       
    -    # render player as standing or running
    -    if args.state.player.started_running_at
    -      args.outputs.sprites << running_sprite(args)
    -    else
    -      args.outputs.sprites << standing_sprite(args)
    -    end
    -    args.outputs.labels << [30, 700, "Use arrow keys to move around."]
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +     For example, you can derive an array of odd numbers from an original array of
    +     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
    +  
    +   - find_all: Finds all values that satisfy specific requirements.
    +     For example, you can find all elements of a collection that are divisible by 2
    +     or find all objects that have intersected with another object.
    +  
    +   - abs: Returns the absolute value.
    +     For example, the command
    +     (-30).abs
    +     would return 30 as a result.
    +  
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +     each element by 2 or declaring every element as a new entity.
    +  
    +   Reminders:
    +  
    +   - args.inputs.keyboard.KEY: Determines if a key has been pressed.
    +     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.
    +  
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +  
    +   - args.outputs.solids: An array. The values generate a solid.
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +  
    +  =end
    +  
    +  # Calls methods needed for game to run properly
    +  def tick args
    +    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    +    defaults args
    +    render args
    +    calc args
    +    input args
       end
       
    -  def standing_sprite args
    -    {
    -      x: args.state.player.x,
    -      y: args.state.player.y,
    -      w: args.state.player.w,
    -      h: args.state.player.h,
    -      path: "sprites/horizontal-stand.png",
    -      flip_horizontally: args.state.player.direction > 0
    -    }
    +  # sets default values and creates empty collections
    +  # initialization only happens in the first frame
    +  def defaults args
    +    fiddle args
    +    args.state.enemy.hammers ||= []
    +    args.state.enemy.hammer_queue ||= []
    +    args.state.tick_count = args.state.tick_count
    +    args.state.bridge_top = 128
    +    args.state.player.x  ||= 0                        # initializes player's properties
    +    args.state.player.y  ||= args.state.bridge_top
    +    args.state.player.w  ||= 64
    +    args.state.player.h  ||= 64
    +    args.state.player.dy ||= 0
    +    args.state.player.dx ||= 0
    +    args.state.enemy.x   ||= 800                      # initializes enemy's properties
    +    args.state.enemy.y   ||= 0
    +    args.state.enemy.w   ||= 128
    +    args.state.enemy.h   ||= 128
    +    args.state.enemy.dy  ||= 0
    +    args.state.enemy.dx  ||= 0
    +    args.state.game_over_at ||= 0
       end
       
    -  def running_sprite args
    -    if !args.state.player.started_running_at
    -      tile_index = 0
    -    else
    -      how_many_frames_in_sprite_sheet = 6
    -      how_many_ticks_to_hold_each_frame = 3
    -      should_the_index_repeat = true
    -      tile_index = args.state
    -                       .player
    -                       .started_running_at
    -                       .frame_index(how_many_frames_in_sprite_sheet,
    -                                    how_many_ticks_to_hold_each_frame,
    -                                    should_the_index_repeat)
    +  # sets enemy, player, hammer values
    +  def fiddle args
    +    args.state.gravity                     = -0.3
    +    args.state.enemy_jump_power            = 10       # sets enemy values
    +    args.state.enemy_jump_interval         = 60
    +    args.state.hammer_throw_interval       = 40       # sets hammer values
    +    args.state.hammer_launch_power_default = 5
    +    args.state.hammer_launch_power_near    = 2
    +    args.state.hammer_launch_power_far     = 7
    +    args.state.hammer_upward_launch_power  = 15
    +    args.state.max_hammers_per_volley      = 10
    +    args.state.gap_between_hammers         = 10
    +    args.state.player_jump_power           = 10       # sets player values
    +    args.state.player_jump_power_duration  = 10
    +    args.state.player_max_run_speed        = 10
    +    args.state.player_speed_slowdown_rate  = 0.9
    +    args.state.player_acceleration         = 1
    +    args.state.hammer_size                 = 32
    +  end
    +  
    +  # outputs objects onto the screen
    +  def render args
    +    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    +      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)
    +      # subtracts 64 from bridge_top because position is denoted by bottom left corner
    +      [i * 64, args.state.bridge_top - 64, 64, 64]
         end
       
    -    {
    -      x: args.state.player.x,
    -      y: args.state.player.y,
    -      w: args.state.player.w,
    -      h: args.state.player.h,
    -      path: 'sprites/horizontal-run.png',
    -      tile_x: 0 + (tile_index * args.state.player.w),
    -      tile_y: 0,
    -      tile_w: args.state.player.w,
    -      tile_h: args.state.player.h,
    -      flip_horizontally: args.state.player.direction > 0,
    -    }
    +    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]
    +    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)
    +    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)
    +    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen
       end
    -
    -#+end_src
    -
    -*** Rendering Sprites - Animation States - main.rb
    -#+begin_src ruby
    -  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb
    -  class Game
    -    attr_gtk
       
    -    def defaults
    -      state.show_debug_layer  = true if state.tick_count == 0
    -      player.tile_size        = 64
    -      player.speed            = 3
    -      player.slash_frames     = 15
    -      player.x              ||= 50
    -      player.y              ||= 400
    -      player.dir_x          ||=  1
    -      player.dir_y          ||= -1
    -      player.is_moving      ||= false
    -      state.watch_list      ||= {}
    -      state.enemies         ||= []
    -    end
    +  # Performs calculations to move objects on the screen
    +  def calc args
       
    -    def add_enemy
    -      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }
    -    end
    +    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    +    args.state.player.x  += args.state.player.dx
    +    args.state.player.y  += args.state.player.dy
       
    -    def sprite_horizontal_run
    -      tile_index = 0.frame_index(6, 3, true)
    -      tile_index = 0 if !player.is_moving
    +    # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    +    args.state.player.dy += args.state.gravity
       
    -      {
    -        x: player.x,
    -        y: player.y,
    -        w: player.tile_size,
    -        h: player.tile_size,
    -        path: 'sprites/horizontal-run.png',
    -        tile_x: 0 + (tile_index * player.tile_size),
    -        tile_y: 0,
    -        tile_w: player.tile_size,
    -        tile_h: player.tile_size,
    -        flip_horizontally: player.dir_x > 0,
    -        # a: 40
    -      }
    -    end
    +    # player's y position is either current y position or y position of top of
    +    # bridge, whichever has a greater value
    +    # ensures that the player never goes below the bridge
    +    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
       
    -    def sprite_horizontal_stand
    -      {
    -        x: player.x,
    -        y: player.y,
    -        w: player.tile_size,
    -        h: player.tile_size,
    -        path: 'sprites/horizontal-stand.png',
    -        flip_horizontally: player.dir_x > 0,
    -        # a: 40
    -      }
    -    end
    +    # player's x position is either the current x position or 0, whichever has a greater value
    +    # ensures that the player doesn't go too far left (out of the screen's scope)
    +    args.state.player.x  = args.state.player.x.greater(0)
       
    -    def sprite_horizontal_slash
    -      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0
    +    # player is not falling if it is located on the top of the bridge
    +    args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    +    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
       
    -      {
    -        x: player.x - 41.25,
    -        y: player.y - 41.25,
    -        w: 165,
    -        h: 165,
    -        path: 'sprites/horizontal-slash.png',
    -        tile_x: 0 + (tile_index * 128),
    -        tile_y: 0,
    -        tile_w: 128,
    -        tile_h: 128,
    -        flip_horizontally: player.dir_x > 0
    -      }
    -    end
    +    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx
    +    args.state.enemy.y += args.state.enemy.dy # same with y and dy
       
    -    def render_player
    -      if player.slash_at
    -        outputs.sprites << sprite_horizontal_slash
    -      elsif player.is_moving
    -        outputs.sprites << sprite_horizontal_run
    -      else
    -        outputs.sprites << sprite_horizontal_stand
    -      end
    -    end
    +    # ensures that the enemy never goes below the bridge
    +    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
       
    -    def render_enemies
    -      outputs.borders << state.enemies
    -    end
    +    # ensures that the enemy never goes too far left (outside the screen's scope)
    +    args.state.enemy.x  = args.state.enemy.x.greater(0)
       
    -    def render_debug_layer
    -      return if !state.show_debug_layer
    -      outputs.labels << state.watch_list.map.with_index do |(k, v), i|
    -         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]
    -      end
    +    # objects that go up must come down because of gravity
    +    args.state.enemy.dy += args.state.gravity
       
    -      outputs.borders << player.slash_collision_rect
    +    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +  
    +    #sets definition of enemy
    +    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]
    +  
    +    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge
    +      args.state.enemy.dy = 0 # there is no change in y
         end
       
    -    def slash_initiate?
    -      # buffalo usb controller has a button and b button swapped lol
    -      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j
    +    # if 60 frames have passed and the enemy is not moving vertically
    +    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0
    +      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up
         end
       
    -    def input
    -      # player movement
    -      if slash_complete? && (vector = inputs.directional_vector)
    -        player.x += vector.x * player.speed
    -        player.y += vector.y * player.speed
    +    # if 40 frames have passed or 5 frames have passed since the game ended
    +    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5
    +      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)
    +      # that is why we're adding 1, to include the max possibility
    +      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)
    +  
    +      # if the horizontal distance between the player and enemy is less than 128 pixels
    +      if (args.state.player.x - args.state.enemy.x).abs < 128
    +        # the change in x won't be that great since the enemy and player are closer to each other
    +        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1
           end
    -      player.slash_at = slash_initiate? if slash_initiate?
    -    end
       
    -    def calc_movement
    -      # movement
    -      if vector = inputs.directional_vector
    -        state.debug_label = vector
    -        player.dir_x = vector.x
    -        player.dir_y = vector.y
    -        player.is_moving = true
    -      else
    -        state.debug_label = vector
    -        player.is_moving = false
    +      # if the horizontal distance between the player and enemy is greater than 300 pixels
    +      if (args.state.player.x - args.state.enemy.x).abs > 300
    +        # change in x will be more drastic since player and enemy are so far apart
    +        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change
           end
    -    end
       
    -    def calc_slash
    -      # re-calc the location of the swords collision box
    -      if player.dir_x.positive?
    -        player.slash_collision_rect = [player.x + player.tile_size,
    -                                       player.y + player.tile_size.half - 10,
    -                                       40, 20]
    -      else
    -        player.slash_collision_rect = [player.x - 32 - 8,
    -                                       player.y + player.tile_size.half - 10,
    -                                       40, 20]
    +      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|
    +        args.state.enemy.hammer_queue << { # stores hammer values in a hash
    +          x: args.state.enemy.x,
    +          w: args.state.hammer_size,
    +          h: args.state.hammer_size,
    +          dx: volley_dx, # change in horizontal position
    +          # multiplication operator takes precedence over addition operator
    +          throw_at: args.state.tick_count + i * args.state.gap_between_hammers
    +        }
           end
    +    end
       
    -      # recalc sword's slash state
    -      player.slash_at = nil if slash_complete?
    +    # add elements from hammer_queue collection to the hammers collection by
    +    # finding all hammers that were thrown before the current frame (have already been thrown)
    +    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|
    +      h[:throw_at] < args.state.tick_count
    +    end
       
    -      # determine collision if the sword is at it's point of damaging
    -      return unless slash_can_damage?
    +    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection
    +      h[:y]  ||= args.state.enemy.y + 130
    +      h[:dy] ||= args.state.hammer_upward_launch_power
    +      h[:dy]  += args.state.gravity # acceleration is change in gravity
    +      h[:x]   += h[:dx] # incremented by change in position
    +      h[:y]   += h[:dy]
    +      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect
    +    end
       
    -      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }
    +    # reject hammers that have been thrown before current frame (have already been thrown)
    +    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|
    +      h[:throw_at] < args.state.tick_count
         end
       
    -    def slash_complete?
    -      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)
    +    # any hammers with a y position less than 0 are rejected from the hammers collection
    +    # since they have gone too far down (outside the scope's screen)
    +    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }
    +  
    +    # if there are any hammers that intersect with (or hit) the player,
    +    # the reset_player method is called (so the game can start over)
    +    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }
    +      reset_player args
         end
       
    -    def slash_can_damage?
    -      # damage occurs half way into the slash animation
    -      return false if slash_complete?
    -      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count
    -      return true
    +    # if the enemy's rect intersects with (or hits) the player,
    +    # the reset_player method is called (so the game can start over)
    +    if args.state.enemy.rect.intersect_rect? args.state.player.rect
    +      reset_player args
         end
    +  end
       
    -    def calc
    -      # generate an enemy if there aren't any on the screen
    -      add_enemy if state.enemies.length == 0
    -      calc_movement
    -      calc_slash
    +  # Resets the player by changing its properties back to the values they had at initialization
    +  def reset_player args
    +    args.state.player.x = 0
    +    args.state.player.y = args.state.bridge_top
    +    args.state.player.dy = 0
    +    args.state.player.dx = 0
    +    args.state.enemy.hammers.clear # empties hammer collection
    +    args.state.enemy.hammer_queue.clear # empties hammer_queue
    +    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    +  end
    +  
    +  # Processes input from the user to move the player
    +  def input args
    +    if args.inputs.keyboard.space # if the user presses the space bar
    +      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
    +  
    +      # if the time that has passed since the jump is less than the player's jump duration and
    +      # the player is not falling
    +      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    +        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
    +      end
         end
       
    -    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past
    -    def tick
    -      defaults
    -      render_enemies
    -      render_player
    -      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]
    -      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]
    -      render_debug_layer
    -      input
    -      calc
    +    # if the space bar is in the "up" state (or not being pressed down)
    +    if args.inputs.keyboard.key_up.space
    +      args.state.player.jumped_at = nil # jumped_at is empty
    +      args.state.player.falling = true # the player is falling
         end
       
    -    def player
    -      state.player
    +    if args.inputs.keyboard.left # if left key is pressed
    +      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)
    +      # dx is either set to current dx or the negative max run speed (which would be -10),
    +      # whichever has a greater value
    +      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)
    +    elsif args.inputs.keyboard.right # if right key is pressed
    +      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)
    +      # dx is either set to current dx or max run speed (which would be 10),
    +      # whichever has a lesser value
    +      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)
    +    else
    +      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
         end
       end
       
    -  $game = Game.new
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.space ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
       
    -  def tick args
    -    $game.args = args
    -    $game.tick
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
       end
    -  
    -  $gtk.reset
     
     #+end_src
     
    -*** Rendering Sprites - Color And Rotation - main.rb
    +*** Physics And Collisions - Entities - main.rb
     #+begin_src ruby
    -  # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb
    +  # ./samples/04_physics_and_collisions/03_entities/app/main.rb
       =begin
    -   APIs listing that haven't been encountered in previous sample apps:
    -  
    -   - merge: Returns a hash containing the contents of two original hashes.
    -     Merge does not allow duplicate keys, so the value of a repeated key
    -     will be overwritten.
    -  
    -     For example, if we had two hashes
    -     h1 = { "a" => 1, "b" => 2}
    -     h2 = { "b" => 3, "c" => 3}
    -     and we called the command
    -     h1.merge(h2)
    -     the result would the following hash
    -     { "a" => 1, "b" => 3, "c" => 3}.
       
        Reminders:
       
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -     using their keys.
    -     In this sample app, we're using a hash to create a sprite.
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +     each element by 2 or declaring every element as a new entity.
       
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -     Before continuing with this sample app, it is HIGHLY recommended that you look
    -     at mygame/documentation/05-sprites.md.
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +     For example, you can derive an array of odd numbers from an original array of
    +     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
       
    -   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +     In this sample app, new_entity is used to define the properties of enemies and bullets.
    +     (Remember, you can use state to define ANY property and it will be retained across frames.)
       
    -   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.
    -     For more information about the controller, go to mygame/documentation/08-controllers.md.
    +   - args.outputs.labels: An array. The values generate a label on the screen.
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
       
    -   - num1.lesser(num2): Finds the lower value of the given options.
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +  
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
       
       =end
       
    -  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,
    -  # and also can be moved in different directions through keyboard input from the user.
    +  # This sample app shows enemies that contain an id value and the time they were created.
    +  # These enemies can be removed by shooting at them with bullets.
       
    -  # Calls the methods necessary for the game to run successfully.
    +  # Calls all methods necessary for the game to function properly.
       def tick args
    -    default args
    -    render args.grid, args.outputs, args.state
    -    calc args.state
    +    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."
    +    defaults args
    +    render args
    +    calc args
         process_inputs args
       end
       
    -  # Sets default values for the car sprite
    -  # Initialization ||= only happens in the first frame
    -  def default args
    -    args.state.sprite.width    = 19
    -    args.state.sprite.height   = 10
    -    args.state.sprite.scale    = 4
    -    args.state.max_speed       = 5
    -    args.state.x             ||= 100
    -    args.state.y             ||= 100
    -    args.state.speed         ||= 1
    -    args.state.angle         ||= 0
    +  # Sets default values
    +  # Enemies and bullets start off as empty collections
    +  def defaults args
    +    args.state.enemies ||= []
    +    args.state.bullets ||= []
       end
       
    -  # Outputs sprite onto screen
    -  def render grid, outputs, state
    -    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background
    -    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite
    -    'sprites/86.png', # image path of car
    -    state.angle,
    -    opacity, # transparency
    -    saturation,
    -    source_rect(state), # sprite sub division/tile (tile x, y, w, h)
    -    false, false,  # don't flip sprites
    -    rotation_anchor]
    +  # Provides each enemy in enemies collection with rectangular border,
    +  # as well as a label showing id and when they were created
    +  def render args
    +    # When you're calling a method that takes no arguments, you can use this & syntax on map.
    +    # Numbers are being added to x and y in order to keep the text within the enemy's borders.
    +    args.outputs.borders << args.state.enemies.map(&:rect)
    +    args.outputs.labels  << args.state.enemies.flat_map do |enemy|
    +      [
    +        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],
    +        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created
    +      ]
    +    end
       
    -    # also look at the create_sprite helper method
    -    #
    -    # For example:
    -    #
    -    # dest   = destination_rect(state)
    -    # source = source_rect(state),
    -    # outputs.sprites << create_sprite(
    -    #   'sprites/86.png',
    -    #   x: dest.x,
    -    #   y: dest.y,
    -    #   w: dest.w,
    -    #   h: dest.h,
    -    #   angle: state.angle,
    -    #   source_x: source.x,
    -    #   source_y: source.y,
    -    #   source_w: source.w,
    -    #   source_h: source.h,
    -    #   flip_h: false,
    -    #   flip_v: false,
    -    #   rotation_anchor_x: 0.7,
    -    #   rotation_anchor_y: 0.5
    -    # )
    +    # Outputs bullets in bullets collection as rectangular solids
    +    args.outputs.solids << args.state.bullets.map(&:rect)
       end
       
    -  # Creates sprite by setting values inside of a hash
    -  def create_sprite path, options = {}
    -    options = {
    -  
    -      # dest x, y, w, h
    -      x: 0,
    -      y: 0,
    -      w: 100,
    -      h: 100,
    -  
    -      # angle, rotation
    -      angle: 0,
    -      rotation_anchor_x: 0.5,
    -      rotation_anchor_y: 0.5,
    -  
    -      # color saturation (red, green, blue), transparency
    -      r: 255,
    -      g: 255,
    -      b: 255,
    -      a: 255,
    -  
    -      # source x, y, width, height
    -      source_x: 0,
    -      source_y: 0,
    -      source_w: -1,
    -      source_h: -1,
    -  
    -      # flip horiztonally, flip vertically
    -      flip_h: false,
    -      flip_v: false,
    -  
    -    }.merge options
    -  
    -    [
    -      options[:x], options[:y], options[:w], options[:h], # dest rect keys
    -      path,
    -      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha
    -      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys
    -      options[:flip_h], options[:flip_v], # flip
    -      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor
    -    ] # hash keys contain corresponding values
    +  # Calls all methods necessary for performing calculations
    +  def calc args
    +    add_new_enemies_if_needed args
    +    move_bullets args
    +    calculate_collisions args
    +    remove_bullets_of_screen args
       end
       
    -  # Calls the calc_pos and calc_wrap methods.
    -  def calc state
    -    calc_pos state
    -    calc_wrap state
    -  end
    +  # Adds enemies to the enemies collection and sets their values
    +  def add_new_enemies_if_needed args
    +    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added
    +    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added
       
    -  # Changes sprite's position on screen
    -  # Vectors have magnitude and direction, so the incremented x and y values give the car direction
    -  def calc_pos state
    -    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed
    -    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed
    -    state.speed *= 1.1 # scales speed up
    -    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)
    +    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total
    +      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity
    +        e.x = 640 + 500 * rand # each enemy is given random position on screen
    +        e.y = 600 * rand + 50
    +        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect
    +      end
    +    end
       end
       
    -  # The screen's dimensions are 1280x720. If the car goes out of scope,
    -  # it loops back around on the screen.
    -  def calc_wrap state
    -  
    -    # car returns to left side of screen if it disappears on right side of screen
    -    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger
    -    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280
    -  
    -    # car wraps around to right side of screen if it disappears on the left side
    -    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0
    -  
    -    # car wraps around to bottom of screen if it disappears at the top of the screen
    -    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)
    -    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope
    +  # Moves bullets across screen
    +  # Sets definition of the bullets
    +  def move_bullets args
    +    args.state.bullets.each do |bullet| # perform action on each bullet in collection
    +      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)
       
    -    # car wraps around to top of screen if it disappears at the bottom of the screen
    -    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0
    +      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out
    +      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to
    +      # see what happens to the bullet's movement.
    +      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)
    +      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect
    +    end
       end
       
    -  # Changes angle of sprite based on user input from keyboard or controller
    -  def process_inputs args
    -  
    -    # NOTE: increasing the angle doesn't mean that the car will continue to go
    -    # in a specific direction. The angle is increasing, which means that if the
    -    # left key was kept in the "down" state, the change in the angle would cause
    -    # the car to go in a counter-clockwise direction and form a circle (360 degrees)
    -    if args.inputs.keyboard.key_held.left # if left key is pressed
    -      args.state.angle += 2 # car's angle is incremented by 2
    -  
    -    # The same applies to decreasing the angle. If the right key was kept in the
    -    # "down" state, the decreasing angle would cause the car to go in a clockwise
    -    # direction and form a circle (360 degrees)
    -    elsif args.inputs.keyboard.key_held.right # if right key is pressed
    -      args.state.angle -= 2 # car's angle is decremented by 2
    -  
    -    # Input from a controller can also change the angle of the car
    -    elsif args.inputs.controller_one.left_analog_x_perc != 0
    -      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1
    +  # Determines if a bullet hits an enemy
    +  def calculate_collisions args
    +    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections
    +      args.state.enemies.each do |enemy|
    +        # if bullet has not exploded yet and the bullet hits an enemy
    +        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)
    +          bullet.exploded = true # bullet explodes
    +          enemy.dead = true # enemy is killed
    +        end
    +      end
         end
    -  end
       
    -  # A sprite's center of rotation can be altered
    -  # Increasing either of these numbers would dramatically increase the
    -  # car's drift when it turns!
    -  def rotation_anchor
    -    [0.7, 0.5]
    +    # All exploded bullets are rejected or removed from the bullets collection
    +    # and any dead enemy is rejected from the enemies collection.
    +    args.state.bullets = args.state.bullets.reject(&:exploded)
    +    args.state.enemies = args.state.enemies.reject(&:dead)
       end
       
    -  # Sets opacity value of sprite to 255 so that it is not transparent at all
    -  # Change it to 0 and you won't be able to see the car sprite on the screen
    -  def opacity
    -    255
    +  # Bullets are rejected from bullets collection once their position exceeds the width of screen
    +  def remove_bullets_of_screen args
    +    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280
       end
       
    -  # Sets the color of the sprite to white.
    -  def saturation
    -    [255, 255, 255]
    +  # Calls fire_bullet method
    +  def process_inputs args
    +    fire_bullet args
       end
       
    -  # Sets definition of destination_rect (used to define the car sprite)
    -  def destination_rect state
    -    [state.x, state.y,
    -    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size
    -    state.sprite.height * state.sprite.scale]
    +  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection
    +  def fire_bullet args
    +    return unless args.inputs.mouse.click # return unless mouse is clicked
    +    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity
    +      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked
    +      bullet.x = 0 # starts on the left side of the screen
    +      bullet.size = 10
    +      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized
    +      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set
    +    end
       end
       
    -  # Portion of a sprite (a tile)
    -  # Sub division of sprite is denoted as a rectangle directly related to original size of .png
    -  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)
    -  def source_rect state
    -    [0, 0, state.sprite.width, state.sprite.height]
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.space ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
    +  
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
       end
     
     #+end_src
     
    -*** Physics And Collisions - Simple - main.rb
    +*** Physics And Collisions - Box Collision - main.rb
     #+begin_src ruby
    -  # ./samples/04_physics_and_collisions/01_simple/app/main.rb
    +  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb
       =begin
       
    -   Reminders:
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    -  
    -   - args.outputs.solids: An array. The values generate a solid.
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +   APIs listing that haven't been encountered in previous sample apps:
       
    -  =end
    +   - first: Returns the first element of the array.
    +     For example, if we have an array
    +     numbers = [1, 2, 3, 4, 5]
    +     and we call first by saying
    +     numbers.first
    +     the number 1 will be returned because it is the first element of the numbers array.
       
    -  # This sample app shows collisions between two boxes.
    +   - num1.idiv(num2): Divides two numbers and returns an integer.
    +     For example,
    +     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.
    +     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.
       
    -  # Runs methods needed for game to run properly.
    -  def tick args
    -    tick_instructions args, "Sample app shows how to move a square over time and determine collision."
    -    defaults args
    -    render args
    -    calc args
    -  end
    +   Reminders:
       
    -  # Sets default values.
    -  def defaults args
    -    # These values represent the moving box.
    -    args.state.moving_box_speed   = 10
    -    args.state.moving_box_size    = 100
    -    args.state.moving_box_dx    ||=  1
    -    args.state.moving_box_dy    ||=  1
    -    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height
    +   - find_all: Finds all values that satisfy specific requirements.
       
    -    # These values represent the center box.
    -    args.state.center_box ||= [540, 260, 200, 200, 180]
    -    args.state.center_box_collision ||= false # initially no collision
    -  end
    +   - ARRAY#intersect_rect?: An array with at least four values is
    +     considered a rect. The intersect_rect? function returns true
    +     or false depending on if the two rectangles intersect.
       
    -  def render args
    -    # If the game state denotes that a collision has occured,
    -    # render a solid square, otherwise render a border instead.
    -    if args.state.center_box_collision
    -      args.outputs.solids << args.state.center_box
    -    else
    -      args.outputs.borders << args.state.center_box
    -    end
    +   - reject: Removes elements from a collection if they meet certain requirements.
       
    -    # Then render the moving box.
    -    args.outputs.solids << args.state.moving_box
    -  end
    +  =end
       
    -  # Generally in a pipeline for a game engine, you have rendering,
    -  # game simulation (calculation), and input processing.
    -  # This fuction represents the game simulation.
    -  def calc args
    -    position_moving_box args
    -    determine_collision_center_box args
    -  end
    +  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.
    +  # The player can then move and maneuver around them.
       
    -  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,
    -  # and adding it to the current position.
    -  # dx and dy are positive if the box is moving right and up, respectively
    -  # dx and dy are negative if the box is moving left and down, respectively
    -  def position_moving_box args
    -    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed
    -    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed
    +  class PoorManPlatformerPhysics
    +    attr_accessor :grid, :inputs, :state, :outputs
       
    -    # 1280x720 are the virtual pixels you work with (essentially 720p).
    -    screen_width  = 1280
    -    screen_height = 720
    -  
    -    # Position of the box is denoted by the bottom left hand corner, in
    -    # that case, we have to subtract the width of the box so that it stays
    -    # in the scene (you can try deleting the subtraction to see how it
    -    # impacts the box's movement).
    -    if args.state.moving_box.x > screen_width - args.state.moving_box_size
    -      args.state.moving_box_dx = -1 # moves left
    -    elsif args.state.moving_box.x < 0
    -      args.state.moving_box_dx =  1 # moves right
    -    end
    -  
    -    # Here, we're making sure the moving box remains within the vertical scope of the screen
    -    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high
    -      args.state.moving_box_dy = -1 # moves down
    -    elsif args.state.moving_box.y < 0 # if the box moves too low
    -      args.state.moving_box_dy =  1 # moves up
    -    end
    -  end
    -  
    -  def determine_collision_center_box args
    -    # Collision is handled by the engine. You simply have to call the
    -    # `intersect_rect?` function.
    -    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect
    -      args.state.center_box_collision = true # then a collision happened
    -    else
    -      args.state.center_box_collision = false # otherwise, no collision happened
    +    # Calls all methods necessary for the app to run successfully.
    +    def tick
    +      defaults
    +      render
    +      calc
    +      process_inputs
         end
    -  end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    +    # Sets default values for variables.
    +    # The ||= sign means that the variable will only be set to the value following the = sign if the value has
    +    # not already been set before. Intialization happens only in the first frame.
    +    def defaults
    +      state.tile_size               = 64
    +      state.gravity                 = -0.2
    +      state.previous_tile_size    ||= state.tile_size
    +      state.x                     ||= 0
    +      state.y                     ||= 800
    +      state.dy                    ||= 0
    +      state.dx                    ||= 0
    +      state.world                 ||= []
    +      state.world_lookup          ||= {}
    +      state.world_collision_rects ||= []
         end
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Moving Objects - main.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb
    -  =begin
    +    # Outputs solids and borders of different colors for the world and collision_rects collections.
    +    def render
       
    -   APIs listing that haven't been encountered in previous sample apps:
    +      # Sets a black background on the screen (Comment this line out and the background will become white.)
    +      # Also note that black is the default color for when no color is assigned.
    +      outputs.solids << grid.rect
       
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -     using their keys.
    +      # The position, size, and color (white) are set for borders given to the world collection.
    +      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.
    +      outputs.borders << state.world.map do |x, y|
    +        [x * state.tile_size,
    +         y * state.tile_size,
    +         state.tile_size,
    +         state.tile_size, 255, 255, 255]
    +      end
       
    -     For example, if we have a "numbers" hash that stores numbers in English as the
    -     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -     and on it goes.
    +      # The top, bottom, and sides of the borders for collision_rects are different colors.
    +      outputs.borders << state.world_collision_rects.map do |e|
    +        [
    +          [e[:top],                             0, 170,   0], # top is a shade of green
    +          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue
    +          [e[:left_right],                    170,   0,   0], # left and right are a shade of red
    +        ]
    +      end
       
    -     Now if we wanted to find the corresponding value of the "one" key, we could say
    -     puts numbers["one"]
    -     which would print "uno" to the console.
    +      # Sets the position, size, and color (a shade of green) of the borders of only the player's
    +      # box and outputs it. If you change the 180 to 0, the player's box will be black and you
    +      # won't be able to see it (because it will match the black background).
    +      outputs.borders << [state.x,
    +                          state.y,
    +                          state.tile_size,
    +                          state.tile_size,  0, 180, 0]
    +    end
       
    -   - num1.greater(num2): Returns the greater value.
    -     For example, if we have the command
    -     puts 4.greater(3)
    -     the number 4 would be printed to the console since it has a greater value than 3.
    -     Similar to lesser, which returns the lesser value.
    +    # Calls methods needed to perform calculations.
    +    def calc
    +      calc_world_lookup
    +      calc_player
    +    end
       
    -   - num1.lesser(num2): Finds the lower value of the given options.
    -     For example, in the statement
    -     a = 4.lesser(3)
    -     3 has a lower value than 4, which means that the value of a would be set to 3,
    -     but if the statement had been
    -     a = 4.lesser(5)
    -     4 has a lower value than 5, which means that the value of a would be set to 4.
    +    # Performs calculations on world_lookup and sets values.
    +    def calc_world_lookup
       
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -     For example, you can derive an array of odd numbers from an original array of
    -     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
    +      # If the tile size isn't equal to the previous tile size,
    +      # the previous tile size is set to the tile size,
    +      # and world_lookup hash is set to empty.
    +      if state.tile_size != state.previous_tile_size
    +        state.previous_tile_size = state.tile_size
    +        state.world_lookup = {} # empty hash
    +      end
       
    -   - find_all: Finds all values that satisfy specific requirements.
    -     For example, you can find all elements of a collection that are divisible by 2
    -     or find all objects that have intersected with another object.
    +      # return if the world_lookup hash has keys (or, in other words, is not empty)
    +      # return unless the world collection has values inside of it (or is not empty)
    +      return if state.world_lookup.keys.length > 0
    +      return unless state.world.length > 0
       
    -   - abs: Returns the absolute value.
    -     For example, the command
    -     (-30).abs
    -     would return 30 as a result.
    +      # Starts with an empty hash for world_lookup.
    +      # Searches through the world and finds the coordinates that exist.
    +      state.world_lookup = {}
    +      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
       
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -     each element by 2 or declaring every element as a new entity.
    +      # Assigns world_collision_rects for every sprite drawn.
    +      state.world_collision_rects =
    +        state.world_lookup
    +            .keys
    +            .map do |coord_x, coord_y|
    +              s = state.tile_size
    +              # multiply by tile size so the grid coordinates; sets pixel value
    +              # don't forget that position is denoted by bottom left corner
    +              # set x = coord_x or y = coord_y and see what happens!
    +              x = s * coord_x
    +              y = s * coord_y
    +              {
    +                # The values added to x, y, and s position the world_collision_rects so they all appear
    +                # stacked (on top of world rects) but don't directly overlap.
    +                # Remove these added values and mess around with the rect placement!
    +                args:       [coord_x, coord_y],
    +                left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    +                top:        [x + 4, y + 6, s - 8, s - 6],
    +                bottom:     [x + 1, y - 1, s - 2, s - 8],
    +              }
    +            end
    +    end
       
    -   Reminders:
    +    # Performs calculations to change the x and y values of the player's box.
    +    def calc_player
       
    -   - args.inputs.keyboard.KEY: Determines if a key has been pressed.
    -     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.
    +      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.
    +      # What goes up must come down because of gravity.
    +      state.dy += state.gravity
       
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +      # Calls the calc_box_collision and calc_edge_collision methods.
    +      calc_box_collision
    +      calc_edge_collision
       
    -   - args.outputs.solids: An array. The values generate a solid.
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.
    +      state.y += state.dy
    +      state.x += state.dx
       
    -  =end
    +      # Scales dx down.
    +      state.dx *= 0.8
    +    end
       
    -  # Calls methods needed for game to run properly
    -  def tick args
    -    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    -    defaults args
    -    render args
    -    calc args
    -    input args
    -  end
    +    # Calls methods needed to determine collisions between player and world_collision rects.
    +    def calc_box_collision
    +      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    +      collision_floor!
    +      collision_left!
    +      collision_right!
    +      collision_ceiling!
    +    end
       
    -  # sets default values and creates empty collections
    -  # initialization only happens in the first frame
    -  def defaults args
    -    fiddle args
    -    args.state.enemy.hammers ||= []
    -    args.state.enemy.hammer_queue ||= []
    -    args.state.tick_count = args.state.tick_count
    -    args.state.bridge_top = 128
    -    args.state.player.x  ||= 0                        # initializes player's properties
    -    args.state.player.y  ||= args.state.bridge_top
    -    args.state.player.w  ||= 64
    -    args.state.player.h  ||= 64
    -    args.state.player.dy ||= 0
    -    args.state.player.dx ||= 0
    -    args.state.enemy.x   ||= 800                      # initializes enemy's properties
    -    args.state.enemy.y   ||= 0
    -    args.state.enemy.w   ||= 128
    -    args.state.enemy.h   ||= 128
    -    args.state.enemy.dy  ||= 0
    -    args.state.enemy.dx  ||= 0
    -    args.state.game_over_at ||= 0
    -  end
    +    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    +    def collision_floor!
    +      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    +      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player
       
    -  # sets enemy, player, hammer values
    -  def fiddle args
    -    args.state.gravity                     = -0.3
    -    args.state.enemy_jump_power            = 10       # sets enemy values
    -    args.state.enemy_jump_interval         = 60
    -    args.state.hammer_throw_interval       = 40       # sets hammer values
    -    args.state.hammer_launch_power_default = 5
    -    args.state.hammer_launch_power_near    = 2
    -    args.state.hammer_launch_power_far     = 7
    -    args.state.hammer_upward_launch_power  = 15
    -    args.state.max_hammers_per_volley      = 10
    -    args.state.gap_between_hammers         = 10
    -    args.state.player_jump_power           = 10       # sets player values
    -    args.state.player_jump_power_duration  = 10
    -    args.state.player_max_run_speed        = 10
    -    args.state.player_speed_slowdown_rate  = 0.9
    -    args.state.player_acceleration         = 1
    -    args.state.hammer_size                 = 32
    -  end
    +      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and
    +      # the top of a world_collision_rect (hence the "-0.1" above)
    +      floor_collisions = state.world_collision_rects
    +                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }
    +                             .first
       
    -  # outputs objects onto the screen
    -  def render args
    -    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    -      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)
    -      # subtracts 64 from bridge_top because position is denoted by bottom left corner
    -      [i * 64, args.state.bridge_top - 64, 64, 64]
    +      return unless floor_collisions # return unless collision occurred
    +      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect
    +      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked
         end
       
    -    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]
    -    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)
    -    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)
    -    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen
    -  end
    -  
    -  # Performs calculations to move objects on the screen
    -  def calc args
    -  
    -    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    -    args.state.player.x  += args.state.player.dx
    -    args.state.player.y  += args.state.player.dy
    +    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    +    def collision_left!
    +      return unless state.dx < 0 # return unless player is moving left
    +      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]
       
    -    # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    -    args.state.player.dy += args.state.gravity
    +      # Goes through world_collision_rects to find all intersections beween the player's left side and the
    +      # right side of a world_collision_rect.
    +      left_side_collisions = state.world_collision_rects
    +                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    +                                 .first
       
    -    # player's y position is either current y position or y position of top of
    -    # bridge, whichever has a greater value
    -    # ensures that the player never goes below the bridge
    -    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
    +      return unless left_side_collisions # return unless collision occurred
       
    -    # player's x position is either the current x position or 0, whichever has a greater value
    -    # ensures that the player doesn't go too far left (out of the screen's scope)
    -    args.state.player.x  = args.state.player.x.greater(0)
    +      # player's x is set to the value of the x of the collided rect's right side
    +      state.x = left_side_collisions[:left_right].right
    +      state.dx = 0 # player isn't moving left because its path is blocked
    +    end
       
    -    # player is not falling if it is located on the top of the bridge
    -    args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    -    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
    +    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    +    def collision_right!
    +      return unless state.dx > 0 # return unless player is moving right
    +      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]
       
    -    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx
    -    args.state.enemy.y += args.state.enemy.dy # same with y and dy
    +      # Goes through world_collision_rects to find all intersections between the player's right side
    +      # and the left side of a world_collision_rect (hence the "+0.1" above)
    +      right_side_collisions = state.world_collision_rects
    +                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    +                                  .first
       
    -    # ensures that the enemy never goes below the bridge
    -    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +      return unless right_side_collisions # return unless collision occurred
       
    -    # ensures that the enemy never goes too far left (outside the screen's scope)
    -    args.state.enemy.x  = args.state.enemy.x.greater(0)
    +      # player's x is set to the value of the collided rect's left, minus the size of a rect
    +      # tile size is subtracted because player's position is denoted by bottom left corner
    +      state.x = right_side_collisions[:left_right].left - state.tile_size
    +      state.dx = 0 # player isn't moving right because its path is blocked
    +    end
       
    -    # objects that go up must come down because of gravity
    -    args.state.enemy.dy += args.state.gravity
    +    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    +    def collision_ceiling!
    +      return unless state.dy > 0 # return unless player is moving up
    +      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]
       
    -    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +      # Goes through world_collision_rects to find intersections between the bottom of a
    +      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)
    +      ceil_collisions = state.world_collision_rects
    +                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }
    +                            .first
       
    -    #sets definition of enemy
    -    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]
    +      return unless ceil_collisions # return unless collision occurred
       
    -    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge
    -      args.state.enemy.dy = 0 # there is no change in y
    +      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect
    +      state.y = ceil_collisions[:bottom].y - state.tile_size
    +      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked
         end
       
    -    # if 60 frames have passed and the enemy is not moving vertically
    -    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0
    -      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up
    -    end
    +    # Makes sure the player remains within the screen's dimensions.
    +    def calc_edge_collision
       
    -    # if 40 frames have passed or 5 frames have passed since the game ended
    -    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5
    -      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)
    -      # that is why we're adding 1, to include the max possibility
    -      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)
    +      #Ensures that the player doesn't fall below the map.
    +      if state.y < 0
    +        state.y = 0
    +        state.dy = 0
       
    -      # if the horizontal distance between the player and enemy is less than 128 pixels
    -      if (args.state.player.x - args.state.enemy.x).abs < 128
    -        # the change in x won't be that great since the enemy and player are closer to each other
    -        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1
    +      #Ensures that the player doesn't go too high.
    +      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the
    +      # size of the player's box (so it remains visible on the screen)
    +      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen
    +        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen
    +        state.dy = 0
           end
       
    -      # if the horizontal distance between the player and enemy is greater than 300 pixels
    -      if (args.state.player.x - args.state.enemy.x).abs > 300
    -        # change in x will be more drastic since player and enemy are so far apart
    -        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change
    +      # Ensures that the player remains in the horizontal range that it is supposed to.
    +      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right
    +        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen
    +        state.dx = 0
    +      elsif state.x <= 0 && state.dx < 0 # if player moves too far left
    +        state.x = 0 # player will remain as left as possible while remaining on screen
    +        state.dx = 0
           end
    +    end
       
    -      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|
    -        args.state.enemy.hammer_queue << { # stores hammer values in a hash
    -          x: args.state.enemy.x,
    -          w: args.state.hammer_size,
    -          h: args.state.hammer_size,
    -          dx: volley_dx, # change in horizontal position
    -          # multiplication operator takes precedence over addition operator
    -          throw_at: args.state.tick_count + i * args.state.gap_between_hammers
    -        }
    +    # Processes input from the user on the keyboard.
    +    def process_inputs
    +      if inputs.mouse.down
    +        state.world_lookup = {}
    +        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid
    +  
    +        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate
    +          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space
    +        else
    +          state.world << [x, y] # If no duplicates, adds to world collection
    +        end
           end
    -    end
       
    -    # add elements from hammer_queue collection to the hammers collection by
    -    # finding all hammers that were thrown before the current frame (have already been thrown)
    -    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|
    -      h[:throw_at] < args.state.tick_count
    -    end
    +      # Sets dx to 0 if the player lets go of arrow keys.
    +      if inputs.keyboard.key_up.right
    +        state.dx = 0
    +      elsif inputs.keyboard.key_up.left
    +        state.dx = 0
    +      end
       
    -    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection
    -      h[:y]  ||= args.state.enemy.y + 130
    -      h[:dy] ||= args.state.hammer_upward_launch_power
    -      h[:dy]  += args.state.gravity # acceleration is change in gravity
    -      h[:x]   += h[:dx] # incremented by change in position
    -      h[:y]   += h[:dy]
    -      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect
    -    end
    +      # Sets dx to 3 in whatever direction the player chooses.
    +      if inputs.keyboard.key_held.right # if right key is pressed
    +        state.dx =  3
    +      elsif inputs.keyboard.key_held.left # if left key is pressed
    +        state.dx = -3
    +      end
       
    -    # reject hammers that have been thrown before current frame (have already been thrown)
    -    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|
    -      h[:throw_at] < args.state.tick_count
    +      #Sets dy to 5 to make the player ~fly~ when they press the space bar
    +      if inputs.keyboard.key_held.space
    +        state.dy = 5
    +      end
         end
       
    -    # any hammers with a y position less than 0 are rejected from the hammers collection
    -    # since they have gone too far down (outside the scope's screen)
    -    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }
    +    def to_coord point
       
    -    # if there are any hammers that intersect with (or hit) the player,
    -    # the reset_player method is called (so the game can start over)
    -    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }
    -      reset_player args
    +      # Integer divides (idiv) point.x to turn into grid
    +      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.
    +      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
         end
       
    -    # if the enemy's rect intersects with (or hits) the player,
    -    # the reset_player method is called (so the game can start over)
    -    if args.state.enemy.rect.intersect_rect? args.state.player.rect
    -      reset_player args
    +    # Represents the tolerance for a collision between the player's rect and another rect.
    +    def collision_tollerance
    +      0.0
         end
       end
       
    -  # Resets the player by changing its properties back to the values they had at initialization
    -  def reset_player args
    -    args.state.player.x = 0
    -    args.state.player.y = args.state.bridge_top
    -    args.state.player.dy = 0
    -    args.state.player.dx = 0
    -    args.state.enemy.hammers.clear # empties hammer collection
    -    args.state.enemy.hammer_queue.clear # empties hammer_queue
    -    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    -  end
    -  
    -  # Processes input from the user to move the player
    -  def input args
    -    if args.inputs.keyboard.space # if the user presses the space bar
    -      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
    -  
    -      # if the time that has passed since the jump is less than the player's jump duration and
    -      # the player is not falling
    -      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    -        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
    -      end
    -    end
    -  
    -    # if the space bar is in the "up" state (or not being pressed down)
    -    if args.inputs.keyboard.key_up.space
    -      args.state.player.jumped_at = nil # jumped_at is empty
    -      args.state.player.falling = true # the player is falling
    -    end
    +  $platformer_physics = PoorManPlatformerPhysics.new
       
    -    if args.inputs.keyboard.left # if left key is pressed
    -      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)
    -      # dx is either set to current dx or the negative max run speed (which would be -10),
    -      # whichever has a greater value
    -      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)
    -    elsif args.inputs.keyboard.right # if right key is pressed
    -      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)
    -      # dx is either set to current dx or max run speed (which would be 10),
    -      # whichever has a lesser value
    -      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)
    -    else
    -      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
    -    end
    +  def tick args
    +    $platformer_physics.grid    = args.grid
    +    $platformer_physics.inputs  = args.inputs
    +    $platformer_physics.state    = args.state
    +    $platformer_physics.outputs = args.outputs
    +    $platformer_physics.tick
    +    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."
       end
       
       def tick_instructions args, text, y = 715
    @@ -6314,7 +6196,6 @@ Follows is a source code listing for all files that have been open sourced. This
         if args.inputs.mouse.click ||
            args.inputs.keyboard.directional_vector ||
            args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.space ||
            args.inputs.keyboard.key_down.escape
           args.state.key_event_occurred = true
         end
    @@ -6326,507 +6207,7 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Physics And Collisions - Entities - main.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/03_entities/app/main.rb
    -  =begin
    -  
    -   Reminders:
    -  
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -     each element by 2 or declaring every element as a new entity.
    -  
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -     For example, you can derive an array of odd numbers from an original array of
    -     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
    -  
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -     In this sample app, new_entity is used to define the properties of enemies and bullets.
    -     (Remember, you can use state to define ANY property and it will be retained across frames.)
    -  
    -   - args.outputs.labels: An array. The values generate a label on the screen.
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -  
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    -  
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -  
    -  =end
    -  
    -  # This sample app shows enemies that contain an id value and the time they were created.
    -  # These enemies can be removed by shooting at them with bullets.
    -  
    -  # Calls all methods necessary for the game to function properly.
    -  def tick args
    -    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."
    -    defaults args
    -    render args
    -    calc args
    -    process_inputs args
    -  end
    -  
    -  # Sets default values
    -  # Enemies and bullets start off as empty collections
    -  def defaults args
    -    args.state.enemies ||= []
    -    args.state.bullets ||= []
    -  end
    -  
    -  # Provides each enemy in enemies collection with rectangular border,
    -  # as well as a label showing id and when they were created
    -  def render args
    -    # When you're calling a method that takes no arguments, you can use this & syntax on map.
    -    # Numbers are being added to x and y in order to keep the text within the enemy's borders.
    -    args.outputs.borders << args.state.enemies.map(&:rect)
    -    args.outputs.labels  << args.state.enemies.flat_map do |enemy|
    -      [
    -        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],
    -        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created
    -      ]
    -    end
    -  
    -    # Outputs bullets in bullets collection as rectangular solids
    -    args.outputs.solids << args.state.bullets.map(&:rect)
    -  end
    -  
    -  # Calls all methods necessary for performing calculations
    -  def calc args
    -    add_new_enemies_if_needed args
    -    move_bullets args
    -    calculate_collisions args
    -    remove_bullets_of_screen args
    -  end
    -  
    -  # Adds enemies to the enemies collection and sets their values
    -  def add_new_enemies_if_needed args
    -    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added
    -    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added
    -  
    -    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total
    -      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity
    -        e.x = 640 + 500 * rand # each enemy is given random position on screen
    -        e.y = 600 * rand + 50
    -        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect
    -      end
    -    end
    -  end
    -  
    -  # Moves bullets across screen
    -  # Sets definition of the bullets
    -  def move_bullets args
    -    args.state.bullets.each do |bullet| # perform action on each bullet in collection
    -      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)
    -  
    -      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out
    -      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to
    -      # see what happens to the bullet's movement.
    -      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)
    -      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect
    -    end
    -  end
    -  
    -  # Determines if a bullet hits an enemy
    -  def calculate_collisions args
    -    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections
    -      args.state.enemies.each do |enemy|
    -        # if bullet has not exploded yet and the bullet hits an enemy
    -        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)
    -          bullet.exploded = true # bullet explodes
    -          enemy.dead = true # enemy is killed
    -        end
    -      end
    -    end
    -  
    -    # All exploded bullets are rejected or removed from the bullets collection
    -    # and any dead enemy is rejected from the enemies collection.
    -    args.state.bullets = args.state.bullets.reject(&:exploded)
    -    args.state.enemies = args.state.enemies.reject(&:dead)
    -  end
    -  
    -  # Bullets are rejected from bullets collection once their position exceeds the width of screen
    -  def remove_bullets_of_screen args
    -    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280
    -  end
    -  
    -  # Calls fire_bullet method
    -  def process_inputs args
    -    fire_bullet args
    -  end
    -  
    -  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection
    -  def fire_bullet args
    -    return unless args.inputs.mouse.click # return unless mouse is clicked
    -    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity
    -      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked
    -      bullet.x = 0 # starts on the left side of the screen
    -      bullet.size = 10
    -      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized
    -      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set
    -    end
    -  end
    -  
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.space ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    -    end
    -  
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Box Collision - main.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb
    -  =begin
    -  
    -   APIs listing that haven't been encountered in previous sample apps:
    -  
    -   - first: Returns the first element of the array.
    -     For example, if we have an array
    -     numbers = [1, 2, 3, 4, 5]
    -     and we call first by saying
    -     numbers.first
    -     the number 1 will be returned because it is the first element of the numbers array.
    -  
    -   - num1.idiv(num2): Divides two numbers and returns an integer.
    -     For example,
    -     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.
    -     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.
    -  
    -   Reminders:
    -  
    -   - find_all: Finds all values that satisfy specific requirements.
    -  
    -   - ARRAY#intersect_rect?: An array with at least four values is
    -     considered a rect. The intersect_rect? function returns true
    -     or false depending on if the two rectangles intersect.
    -  
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -  
    -  =end
    -  
    -  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.
    -  # The player can then move and maneuver around them.
    -  
    -  class PoorManPlatformerPhysics
    -    attr_accessor :grid, :inputs, :state, :outputs
    -  
    -    # Calls all methods necessary for the app to run successfully.
    -    def tick
    -      defaults
    -      render
    -      calc
    -      process_inputs
    -    end
    -  
    -    # Sets default values for variables.
    -    # The ||= sign means that the variable will only be set to the value following the = sign if the value has
    -    # not already been set before. Intialization happens only in the first frame.
    -    def defaults
    -      state.tile_size               = 64
    -      state.gravity                 = -0.2
    -      state.previous_tile_size    ||= state.tile_size
    -      state.x                     ||= 0
    -      state.y                     ||= 800
    -      state.dy                    ||= 0
    -      state.dx                    ||= 0
    -      state.world                 ||= []
    -      state.world_lookup          ||= {}
    -      state.world_collision_rects ||= []
    -    end
    -  
    -    # Outputs solids and borders of different colors for the world and collision_rects collections.
    -    def render
    -  
    -      # Sets a black background on the screen (Comment this line out and the background will become white.)
    -      # Also note that black is the default color for when no color is assigned.
    -      outputs.solids << grid.rect
    -  
    -      # The position, size, and color (white) are set for borders given to the world collection.
    -      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.
    -      outputs.borders << state.world.map do |x, y|
    -        [x * state.tile_size,
    -         y * state.tile_size,
    -         state.tile_size,
    -         state.tile_size, 255, 255, 255]
    -      end
    -  
    -      # The top, bottom, and sides of the borders for collision_rects are different colors.
    -      outputs.borders << state.world_collision_rects.map do |e|
    -        [
    -          [e[:top],                             0, 170,   0], # top is a shade of green
    -          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue
    -          [e[:left_right],                    170,   0,   0], # left and right are a shade of red
    -        ]
    -      end
    -  
    -      # Sets the position, size, and color (a shade of green) of the borders of only the player's
    -      # box and outputs it. If you change the 180 to 0, the player's box will be black and you
    -      # won't be able to see it (because it will match the black background).
    -      outputs.borders << [state.x,
    -                          state.y,
    -                          state.tile_size,
    -                          state.tile_size,  0, 180, 0]
    -    end
    -  
    -    # Calls methods needed to perform calculations.
    -    def calc
    -      calc_world_lookup
    -      calc_player
    -    end
    -  
    -    # Performs calculations on world_lookup and sets values.
    -    def calc_world_lookup
    -  
    -      # If the tile size isn't equal to the previous tile size,
    -      # the previous tile size is set to the tile size,
    -      # and world_lookup hash is set to empty.
    -      if state.tile_size != state.previous_tile_size
    -        state.previous_tile_size = state.tile_size
    -        state.world_lookup = {} # empty hash
    -      end
    -  
    -      # return if the world_lookup hash has keys (or, in other words, is not empty)
    -      # return unless the world collection has values inside of it (or is not empty)
    -      return if state.world_lookup.keys.length > 0
    -      return unless state.world.length > 0
    -  
    -      # Starts with an empty hash for world_lookup.
    -      # Searches through the world and finds the coordinates that exist.
    -      state.world_lookup = {}
    -      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
    -  
    -      # Assigns world_collision_rects for every sprite drawn.
    -      state.world_collision_rects =
    -        state.world_lookup
    -            .keys
    -            .map do |coord_x, coord_y|
    -              s = state.tile_size
    -              # multiply by tile size so the grid coordinates; sets pixel value
    -              # don't forget that position is denoted by bottom left corner
    -              # set x = coord_x or y = coord_y and see what happens!
    -              x = s * coord_x
    -              y = s * coord_y
    -              {
    -                # The values added to x, y, and s position the world_collision_rects so they all appear
    -                # stacked (on top of world rects) but don't directly overlap.
    -                # Remove these added values and mess around with the rect placement!
    -                args:       [coord_x, coord_y],
    -                left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    -                top:        [x + 4, y + 6, s - 8, s - 6],
    -                bottom:     [x + 1, y - 1, s - 2, s - 8],
    -              }
    -            end
    -    end
    -  
    -    # Performs calculations to change the x and y values of the player's box.
    -    def calc_player
    -  
    -      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.
    -      # What goes up must come down because of gravity.
    -      state.dy += state.gravity
    -  
    -      # Calls the calc_box_collision and calc_edge_collision methods.
    -      calc_box_collision
    -      calc_edge_collision
    -  
    -      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.
    -      state.y += state.dy
    -      state.x += state.dx
    -  
    -      # Scales dx down.
    -      state.dx *= 0.8
    -    end
    -  
    -    # Calls methods needed to determine collisions between player and world_collision rects.
    -    def calc_box_collision
    -      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    -      collision_floor!
    -      collision_left!
    -      collision_right!
    -      collision_ceiling!
    -    end
    -  
    -    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    -    def collision_floor!
    -      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    -      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player
    -  
    -      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and
    -      # the top of a world_collision_rect (hence the "-0.1" above)
    -      floor_collisions = state.world_collision_rects
    -                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }
    -                             .first
    -  
    -      return unless floor_collisions # return unless collision occurred
    -      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect
    -      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked
    -    end
    -  
    -    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    -    def collision_left!
    -      return unless state.dx < 0 # return unless player is moving left
    -      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]
    -  
    -      # Goes through world_collision_rects to find all intersections beween the player's left side and the
    -      # right side of a world_collision_rect.
    -      left_side_collisions = state.world_collision_rects
    -                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    -                                 .first
    -  
    -      return unless left_side_collisions # return unless collision occurred
    -  
    -      # player's x is set to the value of the x of the collided rect's right side
    -      state.x = left_side_collisions[:left_right].right
    -      state.dx = 0 # player isn't moving left because its path is blocked
    -    end
    -  
    -    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    -    def collision_right!
    -      return unless state.dx > 0 # return unless player is moving right
    -      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]
    -  
    -      # Goes through world_collision_rects to find all intersections between the player's right side
    -      # and the left side of a world_collision_rect (hence the "+0.1" above)
    -      right_side_collisions = state.world_collision_rects
    -                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    -                                  .first
    -  
    -      return unless right_side_collisions # return unless collision occurred
    -  
    -      # player's x is set to the value of the collided rect's left, minus the size of a rect
    -      # tile size is subtracted because player's position is denoted by bottom left corner
    -      state.x = right_side_collisions[:left_right].left - state.tile_size
    -      state.dx = 0 # player isn't moving right because its path is blocked
    -    end
    -  
    -    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    -    def collision_ceiling!
    -      return unless state.dy > 0 # return unless player is moving up
    -      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]
    -  
    -      # Goes through world_collision_rects to find intersections between the bottom of a
    -      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)
    -      ceil_collisions = state.world_collision_rects
    -                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }
    -                            .first
    -  
    -      return unless ceil_collisions # return unless collision occurred
    -  
    -      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect
    -      state.y = ceil_collisions[:bottom].y - state.tile_size
    -      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked
    -    end
    -  
    -    # Makes sure the player remains within the screen's dimensions.
    -    def calc_edge_collision
    -  
    -      #Ensures that the player doesn't fall below the map.
    -      if state.y < 0
    -        state.y = 0
    -        state.dy = 0
    -  
    -      #Ensures that the player doesn't go too high.
    -      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the
    -      # size of the player's box (so it remains visible on the screen)
    -      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen
    -        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen
    -        state.dy = 0
    -      end
    -  
    -      # Ensures that the player remains in the horizontal range that it is supposed to.
    -      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right
    -        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen
    -        state.dx = 0
    -      elsif state.x <= 0 && state.dx < 0 # if player moves too far left
    -        state.x = 0 # player will remain as left as possible while remaining on screen
    -        state.dx = 0
    -      end
    -    end
    -  
    -    # Processes input from the user on the keyboard.
    -    def process_inputs
    -      if inputs.mouse.down
    -        state.world_lookup = {}
    -        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid
    -  
    -        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate
    -          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space
    -        else
    -          state.world << [x, y] # If no duplicates, adds to world collection
    -        end
    -      end
    -  
    -      # Sets dx to 0 if the player lets go of arrow keys.
    -      if inputs.keyboard.key_up.right
    -        state.dx = 0
    -      elsif inputs.keyboard.key_up.left
    -        state.dx = 0
    -      end
    -  
    -      # Sets dx to 3 in whatever direction the player chooses.
    -      if inputs.keyboard.key_held.right # if right key is pressed
    -        state.dx =  3
    -      elsif inputs.keyboard.key_held.left # if left key is pressed
    -        state.dx = -3
    -      end
    -  
    -      #Sets dy to 5 to make the player ~fly~ when they press the space bar
    -      if inputs.keyboard.key_held.space
    -        state.dy = 5
    -      end
    -    end
    -  
    -    def to_coord point
    -  
    -      # Integer divides (idiv) point.x to turn into grid
    -      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.
    -      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
    -    end
    -  
    -    # Represents the tolerance for a collision between the player's rect and another rect.
    -    def collision_tollerance
    -      0.0
    -    end
    -  end
    -  
    -  $platformer_physics = PoorManPlatformerPhysics.new
    -  
    -  def tick args
    -    $platformer_physics.grid    = args.grid
    -    $platformer_physics.inputs  = args.inputs
    -    $platformer_physics.state    = args.state
    -    $platformer_physics.outputs = args.outputs
    -    $platformer_physics.tick
    -    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."
    -  end
    -  
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    -    end
    -  
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Box Collision 2 - main.rb
    +*** Physics And Collisions - Box Collision 2 - main.rb
     #+begin_src ruby
       # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb
       =begin
    @@ -7353,9 +6734,9 @@ Follows is a source code listing for all files that have been open sourced. This
           mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode
       
           if state.mouse_held
    -        outputs.primitives << mouse_overlay.border
    +        outputs.primitives << mouse_overlay.border!
           else
    -        outputs.primitives << mouse_overlay.solid
    +        outputs.primitives << mouse_overlay.solid!
           end
         end
       
    @@ -9130,438 +8511,1074 @@ Follows is a source code listing for all files that have been open sourced. This
               end
       
       
    -          hypotenuse=args.state.ball_hypotenuse
    +          hypotenuse=args.state.ball_hypotenuse
    +  
    +          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]
    +      end
    +  
    +      def getShapePoints(args)
    +        points=[]
    +        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +  
    +        if @orientation == :right
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +          xa =@x + x_offset
    +          ya =@y
    +          wa =@block_size * 3 - @block_offset
    +          ha =(@block_size - @block_offset)
    +        elsif @orientation == :up
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +          xa =@x + x_offset
    +          ya =@y
    +          wa =@block_size - @block_offset
    +          ha =@block_size * 3 - @block_offset
    +  
    +        elsif @orientation == :left
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +          xa =@x + x_offset
    +          ya =@y
    +          wa =@block_size * 3 - @block_offset
    +          ha =@block_size - @block_offset
    +        elsif @orientation == :down
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +          xa =@x + x_offset
    +          ya =@y
    +          wa =@block_size - @block_offset
    +          ha =@block_size * 3 - @block_offset
    +        end
    +        points = [
    +          {x: xa, y:ya},
    +          {x: xa + wa,y:ya},
    +          {x: xa + wa,y:ya+ha},
    +          {x: xa, y:ya+ha},
    +        ]
    +        @squareColliders = [
    +          SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    +          SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    +          SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    +          SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    +        ]
    +        @colliders = [
    +          LinearCollider.new(points[0],points[1], :neg),
    +          LinearCollider.new(points[1],points[2], :neg),
    +          LinearCollider.new(points[2],points[3], :pos),
    +          LinearCollider.new(points[0],points[3], :pos),
    +        ]
    +        return points
    +      end
    +  
    +      def update args
    +        universalUpdate args, self
    +      end
    +  
    +      def draw(args)
    +          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    +  
    +          if @orientation == :right
    +              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +          elsif @orientation == :up
    +              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +          elsif @orientation == :left
    +              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +          elsif @orientation == :down
    +              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +          end
    +  
    +          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +  
    +      end
    +  end
    +
    +#+end_src
    +
    +*** Physics And Collisions - Arbitrary Collision - linear_collider.rb
    +#+begin_src ruby
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb
    +  
    +  COLLISIONWIDTH=8
    +  
    +  class LinearCollider
    +    attr_reader :pointA, :pointB
    +    def initialize (pointA, pointB, mode,collisionWidth=COLLISIONWIDTH)
    +      @pointA = pointA
    +      @pointB = pointB
    +      @mode = mode
    +      @collisionWidth = collisionWidth
    +  
    +      if (@pointA.x > @pointB.x)
    +        @pointA, @pointB = @pointB, @pointA
    +      end
    +  
    +      @linearCollider_collision_once = false
    +    end
    +  
    +    def collisionSlope args
    +      if (@pointB.x-@pointA.x == 0)
    +        return INFINITY
    +      end
    +      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)
    +    end
    +  
    +  
    +    def collision? (args, points, ball=nil)
    +  
    +      slope = collisionSlope args
    +      result = false
    +  
    +      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line
    +      vect=nil;mag=nil;vect=nil;
    +      if @mode == :both
    +        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +        mag  = (vect.x**2 + vect.y**2)**0.5
    +        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}
    +      else
    +        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +        mag  = (vect.x**2 + vect.y**2)**0.5
    +        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}
    +      end
    +  
    +      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;
    +      if @mode == :pos
    +        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    +        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    +        rpointC = {x:@pointB.x, y:@pointB.y}
    +        rpointD = {x:@pointA.x, y:@pointA.y}
    +      elsif @mode == :neg
    +        rpointA = {x:@pointA.x, y:@pointA.y}
    +        rpointB = {x:@pointB.x, y:@pointB.y}
    +        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    +        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    +      elsif @mode == :both
    +        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    +        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    +        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    +        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    +      end
    +      #four point rectangle
    +  
    +  
    +  
    +      if ball != nil
    +        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]
    +        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]
    +        correct = 1
    +        rect1 = [ball.x, ball.y, ball.width, ball.height]
    +        #$r1 = rect1
    +        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]
    +        #$r2 = rect2
    +        if rect1.intersect_rect?(rect2) == false
    +          return false
    +        end
    +      end
    +  
    +  
    +      #area of a triangle
    +      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }
    +  
    +      #if at least on point is in the rectangle then collision? is true - otherwise false
    +      for point in points
    +        #Check whether a given point lies inside a rectangle or not:
    +        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured
    +        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)
    +        areaSum = [
    +          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),
    +          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)
    +        ].inject(0){|sum,x| sum + x }
    +        e = 0.0001 #allow for minor error
    +        if areaRec>= areaSum-e and areaRec<= areaSum+e
    +          result = true
    +          #return true
    +          break
    +        end
    +      end
    +  
    +      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]
    +      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]
    +      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]
    +  
    +  
    +      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)
    +      return result
    +    end #end collision?
    +  
    +    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)
    +      a = fbx ; b = vrx ; c = fby
    +      d = vry ; e = ballMag
    +      if b**2 + d**2 == 0
    +        #unexpected
    +      end
    +      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    +      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    +      err = 0.00001
    +      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    +      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    +      r = 0
    +      if (ballMag >= o-err and ballMag <= o+err)
    +        r = x1
    +      elsif (ballMag >= p-err and ballMag <= p+err)
    +        r = x2
    +      else
    +        #unexpected
    +      end
    +      return r
    +    end
    +  
    +    def collide args, ball
    +      slope = collisionSlope args
    +  
    +      # perpVect: normal vector perpendicular to collision
    +      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +      mag  = (perpVect.x**2 + perpVect.y**2)**0.5
    +      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}
    +      perpVect = {x: -perpVect.y, y: perpVect.x}
    +      if perpVect.y > 0 #ensure perpVect points upward
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +      end
    +      previousPosition = {
    +        x:ball.x-ball.velocity.x,
    +        y:ball.y-ball.velocity.y
    +      }
    +      yInterc = @pointA.y + -slope*@pointA.x
    +      if slope == INFINITY
    +        if previousPosition.x < @pointA.x
    +          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +          yInterc = -INFINITY
    +        end
    +      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +      end
    +  
    +      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5
    +      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity
    +      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)
    +  
    +      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
    +  
    +      #the magnitude of the repelling force
    +      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)
    +      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    +      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +  
    +      fsumx = fbx+frx #sum of x forces
    +      fsumy = fby+fry #sum of y forces
    +      fr = velocityMag#fr is the resulting magnitude
    +      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    +      xnew = fr*Math.cos(thetaNew)#resulting x velocity
    +      ynew = fr*Math.sin(thetaNew)#resulting y velocity
    +      if (velocityMag < MAX_VELOCITY)
    +        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)
    +      else
    +        ball.velocity =  Vector2d.new(xnew, ynew)
    +      end
    +  
    +    end
    +  end
    +
    +#+end_src
    +
    +*** Physics And Collisions - Arbitrary Collision - main.rb
    +#+begin_src ruby
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/main.rb
    +  INFINITY= 10**10
    +  MAX_VELOCITY = 8.0
    +  BALL_COUNT = 90
    +  BALL_DISTANCE = 20
    +  require 'app/vector2d.rb'
    +  require 'app/blocks.rb'
    +  require 'app/ball.rb'
    +  require 'app/rectangle.rb'
    +  require 'app/linear_collider.rb'
    +  require 'app/square_collider.rb'
    +  
    +  
    +  
    +  #Method to init default values
    +  def defaults args
    +    args.state.board_width ||= args.grid.w / 4
    +    args.state.board_height ||= args.grid.h
    +    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]
    +    args.state.balls ||= []
    +    args.state.num_balls ||= 0
    +    args.state.ball_created_at ||= args.state.tick_count
    +    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5
    +    args.state.ballParents ||=nil
    +  
    +    init_blocks args
    +    init_balls args
    +  end
    +  
    +  begin :default_methods
    +    def init_blocks args
    +      block_size = args.state.board_width / 8
    +      #Space inbetween each block
    +      block_offset = 4
    +  
    +      args.state.squares ||=[
    +        Square.new(args, 2, 0, block_size, :right, block_offset),
    +        Square.new(args, 5, 0, block_size, :right, block_offset),
    +        Square.new(args, 6, 7, block_size, :right, block_offset)
    +      ]
    +  
    +  
    +      #Possible orientations are :right, :left, :up, :down
    +  
    +  
    +      args.state.tshapes ||= [
    +        TShape.new(args, 0, 6, block_size, :left, block_offset),
    +        TShape.new(args, 3, 3, block_size, :down, block_offset),
    +        TShape.new(args, 0, 3, block_size, :right, block_offset),
    +        TShape.new(args, 0, 11, block_size, :up, block_offset)
    +      ]
    +  
    +      args.state.lines ||= [
    +        Line.new(args,3, 8, block_size, :down, block_offset),
    +        Line.new(args, 7, 3, block_size, :up, block_offset),
    +        Line.new(args, 3, 7, block_size, :right, block_offset)
    +      ]
    +  
    +      #exit()
    +    end
    +  
    +    def init_balls args
    +      return unless args.state.num_balls < BALL_COUNT
    +  
    +  
    +      #only create a new ball every 10 ticks
    +      return unless args.state.ball_created_at.elapsed_time > 10
    +  
    +      if (args.state.num_balls == 0)
    +        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))
    +        args.state.ballParents = [args.state.balls[0]]
    +      else
    +        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )
    +        args.state.balls[-2].child = args.state.balls[-1]
    +      end
    +      args.state.ball_created_at = args.state.tick_count
    +      args.state.num_balls += 1
    +    end
    +  end
    +  
    +  #Render loop
    +  def render args
    +    bgClr = {r:10, g:10, b:200}
    +    bgClr = {r:255-30, g:255-30, b:255-30}
    +  
    +    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];
    +    args.outputs.borders << args.state.game_area
    +  
    +    render_instructions args
    +    render_shapes args
    +  
    +    render_balls args
    +  
    +    #args.state.rectangle.draw args
    +  
    +    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    +    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    +  
    +  end
    +  
    +  begin :render_methods
    +    def render_instructions args
    +      #gtk.current_framerate
    +      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]
    +      if (args.state.balls != nil && args.state.balls[0] != nil)
    +          bx =  args.state.balls[0].velocity.x
    +          by =  args.state.balls[0].velocity.y
    +          bmg = (bx**2.0 + by**2.0)**0.5
    +          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]
    +      end
    +  
    +  
    +    end
    +  
    +    def render_shapes args
    +      for s in args.state.squares
    +        s.draw args
    +      end
    +  
    +      for l in args.state.lines
    +        l.draw args
    +      end
    +  
    +      for t in args.state.tshapes
    +        t.draw args
    +      end
    +  
    +  
    +    end
    +  
    +    def render_balls args
    +      #args.state.balls.each do |ball|
    +        #ball.draw args
    +      #end
    +  
    +      args.outputs.sprites << args.state.balls.map do |ball|
    +        ball.getDraw args
    +      end
    +    end
    +  end
    +  
    +  #Calls all methods necessary for performing calculations
    +  def calc args
    +    for b in args.state.ballParents
    +      b.update args
    +    end
    +  
    +    for s in args.state.squares
    +      s.update args
    +    end
    +  
    +    for l in args.state.lines
    +      l.update args
    +    end
    +  
    +    for t in args.state.tshapes
    +      t.update args
    +    end
    +  
    +  
    +  
    +  end
    +  
    +  begin :calc_methods
    +  
    +  end
    +  
    +  def tick args
    +    defaults args
    +    render args
    +    calc args
    +  end
    +
    +#+end_src
    +
    +*** Physics And Collisions - Arbitrary Collision - paddle.rb
    +#+begin_src ruby
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb
    +  class Paddle
    +    attr_accessor :enabled
    +  
    +    def initialize ()
    +      @x=WIDTH/2
    +      @y=100
    +      @width=100
    +      @height=20
    +      @speed=10
    +  
    +      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +  
    +      @enabled = true
    +    end
    +  
    +    def update args
    +      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    +      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +  
    +      @xyCollision.update  args
    +      @xyCollision2.update args
    +      @xyCollision3.update args
    +      @xyCollision4.update args
    +  
    +      args.inputs.keyboard.key_held.left  ||= false
    +      args.inputs.keyboard.key_held.right  ||= false
    +  
    +      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    +        if args.inputs.keyboard.key_held.left && @enabled
    +          @x-=@speed
    +        elsif args.inputs.keyboard.key_held.right && @enabled
    +          @x+=@speed
    +        end
    +      end
    +  
    +      xmin =WIDTH/4
    +      xmax = 3*(WIDTH/4)
    +      @x = (@x+@width > xmax) ? xmax-@width : (@x @pointB.x)
    -        @pointA, @pointB = @pointB, @pointA
    -      end
       
    -      @linearCollider_collision_once = false
    -    end
    +    #start [Array of length 2] start of the line segment as a x,y cordinate
    +    #last [Array of length 2] end of the line segment as a x,y cordinate
       
    -    def collisionSlope args
    -      if (@pointB.x-@pointA.x == 0)
    -        return INFINITY
    -      end
    -      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)
    -    end
    +    #inorder for the LinearCollider to be functional the line segment must be said to have a thickness
    +    #(as it is unlikly that a colliding object will land exactly on the linesegment)
       
    +    #extension defines if the line's thickness extends negatively or positively
    +    #extension :pos     extends positively
    +    #extension :neg     extends negatively
       
    -    def collision? (args, points, ball=nil)
    +    #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)
    +    def initialize (pointA, pointB, extension=:neg, thickness=10)
    +      @pointA = pointA
    +      @pointB = pointB
    +      @thickness = thickness
    +      @extension = extension
       
    -      slope = collisionSlope args
    -      result = false
    +      @pointAExtended={
    +        x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    +        y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    +      }
    +      @pointBExtended={
    +        x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    +        y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    +      }
       
    -      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line
    -      vect=nil;mag=nil;vect=nil;
    -      if @mode == :both
    -        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -        mag  = (vect.x**2 + vect.y**2)**0.5
    -        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}
    -      else
    -        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -        mag  = (vect.x**2 + vect.y**2)**0.5
    -        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}
    -      end
    +    end
       
    -      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;
    -      if @mode == :pos
    -        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    -        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    -        rpointC = {x:@pointB.x, y:@pointB.y}
    -        rpointD = {x:@pointA.x, y:@pointA.y}
    -      elsif @mode == :neg
    -        rpointA = {x:@pointA.x, y:@pointA.y}
    -        rpointB = {x:@pointB.x, y:@pointB.y}
    -        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    -        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    -      elsif @mode == :both
    -        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    -        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    -        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    -        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    -      end
    -      #four point rectangle
    +    def resetPoints(pointA,pointB)
    +      @pointA = pointA
    +      @pointB = pointB
       
    +      @pointAExtended={
    +        x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    +        y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    +      }
    +      @pointBExtended={
    +        x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    +        y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    +      }
    +    end
       
    +    #TODO: Ugly function
    +    def slope (pointA, pointB)
    +      return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)
    +    end
       
    -      if ball != nil
    -        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]
    -        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]
    -        correct = 1
    -        rect1 = [ball.x, ball.y, ball.width, ball.height]
    -        #$r1 = rect1
    -        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]
    -        #$r2 = rect2
    -        if rect1.intersect_rect?(rect2) == false
    -          return false
    -        end
    +    #TODO: Ugly function
    +    def intercept(pointA, pointB)
    +      if (slope(pointA, pointB) == INFINITY)
    +        -INFINITY
    +      elsif slope(pointA, pointB) == -1*INFINITY
    +        INFINITY
    +      else
    +        pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)
           end
    +    end
       
    +    def calcY(pointA, pointB, x)
    +      return slope(pointA, pointB)*x + intercept(pointA, pointB)
    +    end
       
    -      #area of a triangle
    -      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }
    -  
    -      #if at least on point is in the rectangle then collision? is true - otherwise false
    -      for point in points
    -        #Check whether a given point lies inside a rectangle or not:
    -        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured
    -        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)
    -        areaSum = [
    -          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),
    -          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)
    -        ].inject(0){|sum,x| sum + x }
    -        e = 0.0001 #allow for minor error
    -        if areaRec>= areaSum-e and areaRec<= areaSum+e
    -          result = true
    -          #return true
    -          break
    -        end
    +    #test if a collision has occurred
    +    def isCollision? (point)
    +      #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test
    +      if slope(@pointA, @pointB) ==  INFINITY &&
    +        point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    +        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    +        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    +          return true
           end
       
    -      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]
    -      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]
    -      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]
    +      isNegInLine   = @extension == :neg &&
    +                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +      isPosInLine   = @extension == :pos &&
    +                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    +                      point.x <= [@pointA.x,@pointB.x].max &&
    +                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    +                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
       
    +      return isInBoxBounds && (isNegInLine || isPosInLine)
       
    -      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)
    -      return result
    -    end #end collision?
    +    end
       
    -    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)
    +    def getRepelMagnitude (fbx, fby, vrx, vry, args)
           a = fbx ; b = vrx ; c = fby
    -      d = vry ; e = ballMag
    +      d = vry ; e = args.state.ball.velocity.mag
    +  
           if b**2 + d**2 == 0
    -        #unexpected
    +        puts "magnitude error"
           end
    +  
           x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
           x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    -      err = 0.00001
    -      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    -      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    -      r = 0
    -      if (ballMag >= o-err and ballMag <= o+err)
    -        r = x1
    -      elsif (ballMag >= p-err and ballMag <= p+err)
    -        r = x2
    -      else
    -        #unexpected
    -      end
    -      return r
    +      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
         end
       
    -    def collide args, ball
    -      slope = collisionSlope args
    +    def update args
    +      #each of the four points on the square ball - NOTE simple to extend to a circle
    +      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    +                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    +                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    +                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    +              ]
       
    -      # perpVect: normal vector perpendicular to collision
    -      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -      mag  = (perpVect.x**2 + perpVect.y**2)**0.5
    -      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}
    -      perpVect = {x: -perpVect.y, y: perpVect.x}
    -      if perpVect.y > 0 #ensure perpVect points upward
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -      end
    -      previousPosition = {
    -        x:ball.x-ball.velocity.x,
    -        y:ball.y-ball.velocity.y
    -      }
    -      yInterc = @pointA.y + -slope*@pointA.x
    -      if slope == INFINITY
    -        if previousPosition.x < @pointA.x
    -          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -          yInterc = -INFINITY
    -        end
    -      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -      end
    +      #for each point p in points
    +      for point in points
    +        #isCollision.md has more information on this section
    +        #TODO: section can certainly be simplifyed
    +        if isCollision?(point)
    +          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
       
    -      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5
    -      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity
    -      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)
    +          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    +          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    +          choiceA = (u.mult(1))
    +          choiceB =  (u.mult(-1))
    +          vectorRepel = nil
       
    -      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
    +          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    +            choiceA, choiceB = choiceB, choiceA
    +          end
    +          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
       
    -      #the magnitude of the repelling force
    -      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)
    -      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    -      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    +          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    +            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    +          end
    +          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    +          #vectorRepel now has the repeling force
       
    -      fsumx = fbx+frx #sum of x forces
    -      fsumy = fby+fry #sum of y forces
    -      fr = velocityMag#fr is the resulting magnitude
    -      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    -      xnew = fr*Math.cos(thetaNew)#resulting x velocity
    -      ynew = fr*Math.sin(thetaNew)#resulting y velocity
    -      if (velocityMag < MAX_VELOCITY)
    -        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)
    -      else
    -        ball.velocity =  Vector2d.new(xnew, ynew)
    +          mag = args.state.ball.velocity.mag
    +          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    +          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    +          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    +  
    +          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    +          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +  
    +          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +  
    +          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    +          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +  
    +          fsumx = fbx+frx #sum of x forces
    +          fsumy = fby+fry #sum of y forces
    +          fr = mag#fr is the resulting magnitude
    +          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    +          xnew = fr*Math.cos(thetaNew) #resulting x velocity
    +          ynew = fr*Math.sin(thetaNew) #resulting y velocity
    +  
    +          args.state.ball.velocity = Vector2d.new(xnew,ynew)
    +          #args.state.ball.xy.add(args.state.ball.velocity)
    +          break #no need to check the other points ?
    +        else
    +        end
           end
    +    end #end update
       
    -    end
       end
     
     #+end_src
     
    -*** Physics And Collisions - Arbitrary Collision - main.rb
    +*** Physics And Collisions - Collision With Object Removal - main.rb
     #+begin_src ruby
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/main.rb
    -  INFINITY= 10**10
    -  MAX_VELOCITY = 8.0
    -  BALL_COUNT = 90
    -  BALL_DISTANCE = 20
    -  require 'app/vector2d.rb'
    -  require 'app/blocks.rb'
    -  require 'app/ball.rb'
    -  require 'app/rectangle.rb'
    -  require 'app/linear_collider.rb'
    -  require 'app/square_collider.rb'
    -  
    -  
    -  
    -  #Method to init default values
    -  def defaults args
    -    args.state.board_width ||= args.grid.w / 4
    -    args.state.board_height ||= args.grid.h
    -    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]
    -    args.state.balls ||= []
    -    args.state.num_balls ||= 0
    -    args.state.ball_created_at ||= args.state.tick_count
    -    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5
    -    args.state.ballParents ||=nil
    -  
    -    init_blocks args
    -    init_balls args
    -  end
    -  
    -  begin :default_methods
    -    def init_blocks args
    -      block_size = args.state.board_width / 8
    -      #Space inbetween each block
    -      block_offset = 4
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    +  # coding: utf-8
    +  INFINITY= 10**10
    +  WIDTH=1280
    +  HEIGHT=720
       
    -      args.state.squares ||=[
    -        Square.new(args, 2, 0, block_size, :right, block_offset),
    -        Square.new(args, 5, 0, block_size, :right, block_offset),
    -        Square.new(args, 6, 7, block_size, :right, block_offset)
    -      ]
    +  require 'app/vector2d.rb'
    +  require 'app/paddle.rb'
    +  require 'app/ball.rb'
    +  require 'app/linear_collider.rb'
       
    +  #Method to init default values
    +  def defaults args
    +    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    +    args.state.bricks ||= []
    +    args.state.num_bricks ||= 0
    +    args.state.game_over_at ||= 0
    +    args.state.paddle ||= Paddle.new
    +    args.state.ball   ||= Ball.new
    +    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    +    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    +    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    +    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
       
    -      #Possible orientations are :right, :left, :up, :down
    +    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    +  end
       
    +  #Render loop
    +  def render args
    +    render_instructions args
    +    render_board args
    +    render_bricks args
    +  end
       
    -      args.state.tshapes ||= [
    -        TShape.new(args, 0, 6, block_size, :left, block_offset),
    -        TShape.new(args, 3, 3, block_size, :down, block_offset),
    -        TShape.new(args, 0, 3, block_size, :right, block_offset),
    -        TShape.new(args, 0, 11, block_size, :up, block_offset)
    -      ]
    +  begin :render_methods
    +    #Method to display the instructions of the game
    +    def render_instructions args
    +      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    +    end
       
    -      args.state.lines ||= [
    -        Line.new(args,3, 8, block_size, :down, block_offset),
    -        Line.new(args, 7, 3, block_size, :up, block_offset),
    -        Line.new(args, 3, 7, block_size, :right, block_offset)
    -      ]
    +    def render_board args
    +      args.outputs.borders << args.state.game_board
    +    end
       
    -      #exit()
    +    def render_bricks args
    +      args.outputs.solids << args.state.bricks.map(&:rect)
         end
    +  end
       
    -    def init_balls args
    -      return unless args.state.num_balls < BALL_COUNT
    +  #Calls all methods necessary for performing calculations
    +  def calc args
    +    add_new_bricks args
    +    reset_game args
    +    calc_collision args
    +    win_game args
       
    +    args.state.westWall.update args
    +    args.state.eastWall.update args
    +    args.state.southWall.update args
    +    args.state.northWall.update args
    +    args.state.paddle.update args
    +    args.state.ball.update args
       
    -      #only create a new ball every 10 ticks
    -      return unless args.state.ball_created_at.elapsed_time > 10
    +    #args.state.testWall.update args
       
    -      if (args.state.num_balls == 0)
    -        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))
    -        args.state.ballParents = [args.state.balls[0]]
    -      else
    -        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )
    -        args.state.balls[-2].child = args.state.balls[-1]
    -      end
    -      args.state.ball_created_at = args.state.tick_count
    -      args.state.num_balls += 1
    -    end
    +    args.state.paddle.render args
    +    args.state.ball.render args
       end
       
    -  #Render loop
    -  def render args
    -    bgClr = {r:10, g:10, b:200}
    -    bgClr = {r:255-30, g:255-30, b:255-30}
    -  
    -    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];
    -    args.outputs.borders << args.state.game_area
    +  begin :calc_methods
    +    def add_new_bricks args
    +      return if args.state.num_bricks > 40
       
    -    render_instructions args
    -    render_shapes args
    +      #Width of the game board is 640px
    +      brick_width = (args.grid.w / 2) / 10
    +      brick_height = brick_width / 2
       
    -    render_balls args
    +      (4).map_with_index do |y|
    +        #Make a box that is 10 bricks wide and 4 bricks tall
    +        args.state.bricks += (10).map_with_index do |x|
    +          args.state.new_entity(:brick) do |b|
    +            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    +            b.y = args.grid.h - ((y + 1) * brick_height)
    +            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
       
    -    #args.state.rectangle.draw args
    +            #Add linear colliders to the brick
    +            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    +            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    +            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    +            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
       
    -    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    -    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    +            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    +            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    +            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
       
    -  end
    +            b.broken = false
       
    -  begin :render_methods
    -    def render_instructions args
    -      #gtk.current_framerate
    -      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]
    -      if (args.state.balls != nil && args.state.balls[0] != nil)
    -          bx =  args.state.balls[0].velocity.x
    -          by =  args.state.balls[0].velocity.y
    -          bmg = (bx**2.0 + by**2.0)**0.5
    -          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]
    +            args.state.num_bricks += 1
    +          end
    +        end
           end
    -  
    -  
         end
       
    -    def render_shapes args
    -      for s in args.state.squares
    -        s.draw args
    -      end
    +    def reset_game args
    +      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    +        #Freeze the ball
    +        args.state.ball.velocity.x = 0
    +        args.state.ball.velocity.y = 0
    +        #Freeze the paddle
    +        args.state.paddle.enabled = false
       
    -      for l in args.state.lines
    -        l.draw args
    +        args.state.game_over_at = args.state.tick_count
           end
       
    -      for t in args.state.tshapes
    -        t.draw args
    +      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    +        #Display a "Game over" message
    +        args.outputs.labels << [100, 100, "GAME OVER", 10]
           end
       
    +      #If 60 frames have passed since the game ended, restart the game
    +      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    +        # FIXME: only put value types in state
    +        args.state.ball = Ball.new
       
    -    end
    -  
    -    def render_balls args
    -      #args.state.balls.each do |ball|
    -        #ball.draw args
    -      #end
    +        # FIXME: only put value types in state
    +        args.state.paddle = Paddle.new
       
    -      args.outputs.sprites << args.state.balls.map do |ball|
    -        ball.getDraw args
    +        args.state.bricks = []
    +        args.state.num_bricks = 0
           end
         end
    -  end
       
    -  #Calls all methods necessary for performing calculations
    -  def calc args
    -    for b in args.state.ballParents
    -      b.update args
    -    end
    +    def calc_collision args
    +      #Remove the brick if it is hit with the ball
    +      ball = args.state.ball
    +      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
       
    -    for s in args.state.squares
    -      s.update args
    -    end
    +      #Loop through each brick to see if the ball is colliding with it
    +      args.state.bricks.each do |b|
    +        if b.rect.intersect_rect?(ball_rect)
    +          #Run the linear collider for the brick if there is a collision
    +          b[:collider_bottom].update args
    +          b[:collider_right].update args
    +          b[:collider_left].update args
    +          b[:collider_top].update args
       
    -    for l in args.state.lines
    -      l.update args
    -    end
    +          b.broken = true
    +        end
    +      end
       
    -    for t in args.state.tshapes
    -      t.update args
    +      args.state.bricks = args.state.bricks.reject(&:broken)
         end
       
    +    def win_game args
    +      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    +        #Freeze the ball
    +        args.state.ball.velocity.x = 0
    +        args.state.ball.velocity.y = 0
    +        #Freeze the paddle
    +        args.state.paddle.enabled = false
       
    +        args.state.game_over_at = args.state.tick_count
    +      end
       
    -  end
    -  
    -  begin :calc_methods
    +      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    +        #Display a "Game over" message
    +        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    +      end
    +    end
       
       end
       
    @@ -9569,13 +9586,25 @@ Follows is a source code listing for all files that have been open sourced. This
         defaults args
         render args
         calc args
    +  
    +    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +  
    +    #$tc+=1
    +    #if $tc == 5
    +      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    +      #$tc = 0
    +    #end
    +    #for t in $train
    +  
    +      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    +    #end
       end
     
     #+end_src
     
    -*** Physics And Collisions - Arbitrary Collision - paddle.rb
    +*** Physics And Collisions - Collision With Object Removal - paddle.rb
     #+begin_src ruby
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
       class Paddle
         attr_accessor :enabled
       
    @@ -9632,977 +9661,963 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Physics And Collisions - Arbitrary Collision - rectangle.rb
    +*** Physics And Collisions - Collision With Object Removal - tests.rb
     #+begin_src ruby
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/rectangle.rb
    -  class Rectangle
    -    def initialize args
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/tests.rb
    +  # For advanced users:
    +  # You can put some quick verification tests here, any method
    +  # that starts with the `test_` will be run when you save this file.
       
    -      @image = "sprites/roundSquare_white.png"
    -      @width  = 160.0
    -      @height = 80.0
    -      @x=$args.grid.right/2.0 - @width/2.0
    -      @y=$args.grid.top/2.0 - @height/2.0
    +  # Here is an example test and game
       
    -      @xtmp = @width  * (1.0/10.0)
    -      @ytmp = @height * (1.0/10.0)
    +  # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
       
    -      #ball0 = args.state.balls[0]
    -      #hypotenuse = (args.state.balls[0].width**2 + args.state.balls[0].height**2)**0.5
    -      hypotenuse=args.state.ball_hypotenuse
    -      @boldXY = {x:(@x-hypotenuse/2)-1, y:(@y-hypotenuse/2)-1}
    -      @boldWidth = @width + hypotenuse + 2
    -      @boldHeight = @height + hypotenuse + 2
    -      @bold = [(@x-hypotenuse/2)-1,(@y-hypotenuse/2)-1,@width + hypotenuse + 2,@height + hypotenuse + 2]
    +  class MySuperHappyFunGame
    +    attr_gtk
       
    +    def tick
    +      outputs.solids << [100, 100, 300, 300]
    +    end
    +  end
       
    -      @points = [
    -        {x:@x,        y:@y+@ytmp},
    -        {x:@x+@xtmp,        y:@y},
    -        {x:@x+@width-@xtmp, y:@y},
    -        {x:@x+@width, y:@y+@ytmp},
    -        {x:@x+@width, y:@y+@height-@ytmp},#
    -        {x:@x+@width-@xtmp, y:@y+@height},
    -        {x:@x+@xtmp,        y:@y+@height},
    -        {x:@x,        y:@y+@height-@ytmp}
    -      ]
    +  def test_universe args, assert
    +    game = MySuperHappyFunGame.new
    +    game.args = args
    +    game.tick
    +    assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    +    assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    +    puts "test_universe completed successfully"
    +  end
       
    -      @colliders = []
    -      #i = 0
    -      #while i < @points.length-1
    -        #@colliders.append(LinearCollider.new(@points[i],@points[i+1],:pos))
    -        #i+=1
    -      #end
    -      @colliders.append(LinearCollider.new(@points[0],@points[1], :neg))
    -      @colliders.append(LinearCollider.new(@points[1],@points[2], :neg))
    -      @colliders.append(LinearCollider.new(@points[2],@points[3], :neg))
    -      @colliders.append(LinearCollider.new(@points[3],@points[4], :neg))
    -      @colliders.append(LinearCollider.new(@points[4],@points[5], :pos))
    -      @colliders.append(LinearCollider.new(@points[5],@points[6], :pos))
    -      @colliders.append(LinearCollider.new(@points[6],@points[7], :pos))
    -      @colliders.append(LinearCollider.new(@points[0],@points[7], :pos))
    +  puts "running tests"
    +  $gtk.reset 100
    +  $gtk.log_level = :off
    +  $gtk.tests.start
    +
    +#+end_src
    +
    +*** Physics And Collisions - Collision With Object Removal - vector2d.rb
    +#+begin_src ruby
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/vector2d.rb
    +  
    +  class Vector2d
    +    attr_accessor :x, :y
    +  
    +    def initialize x=0, y=0
    +      @x=x
    +      @y=y
    +    end
    +  
    +    #returns a vector multiplied by scalar x
    +    #x [float] scalar
    +    def mult x
    +      r = Vector2d.new(0,0)
    +      r.x=@x*x
    +      r.y=@y*x
    +      r
    +    end
    +  
    +    # vect [Vector2d] vector to copy
    +    def copy vect
    +      Vector2d.new(@x, @y)
    +    end
    +  
    +    #returns a new vector equivalent to this+vect
    +    #vect [Vector2d] vector to add to self
    +    def add vect
    +      Vector2d.new(@x+vect.x,@y+vect.y)
    +    end
    +  
    +    #returns a new vector equivalent to this-vect
    +    #vect [Vector2d] vector to subtract to self
    +    def sub vect
    +      Vector2d.new(@x-vect.c, @y-vect.y)
    +    end
    +  
    +    #return the magnitude of the vector
    +    def mag
    +      ((@x**2)+(@y**2))**0.5
    +    end
    +  
    +    #returns a new normalize version of the vector
    +    def normalize
    +      Vector2d.new(@x/mag, @y/mag)
    +    end
    +  
    +    #TODO delet?
    +    def distABS vect
    +      (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +    end
    +  end
    +
    +#+end_src
    +
    +*** Mouse - Mouse Click - main.rb
    +#+begin_src ruby
    +  # ./samples/05_mouse/01_mouse_click/app/main.rb
    +  =begin
    +  
    +   APIs listing that haven't been encountered in previous sample apps:
    +  
    +   - product: Returns an array of all combinations of elements from all arrays.
    +  
    +     For example, [1,2].product([1,2]) would return the following array...
    +     [[1,1], [1,2], [2,1], [2,2]]
    +     More than two arrays can be given to product and it will still work,
    +     such as [1,2].product([1,2],[3,4]). What would product return in this case?
    +  
    +     Answer:
    +     [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[2,1,3],[2,1,4],[2,2,3],[2,2,4]]
    +  
    +   - num1.fdiv(num2): Returns the float division (will have a decimal) of the two given numbers.
    +     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    +  
    +   - yield: Allows you to call a method with a code block and yield to that block.
    +  
    +   Reminders:
    +  
    +   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    +  
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +  
    +   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +  
    +   - Ternary operator (?): Will evaluate a statement (just like an if statement)
    +     and perform an action if the result is true or another action if it is false.
    +  
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +  
    +   - args.outputs.borders: An array. The values generate a border.
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    +  
    +   - args.outputs.labels: An array. The values generate a label.
    +     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +     For more information about labels, go to mygame/documentation/02-labels.
    +  
    +  =end
    +  
    +  # This sample app is a classic game of Tic Tac Toe.
    +  
    +  class TicTacToe
    +    attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk
    +  
    +    # Starts the game with player x's turn and creates an array (to_a) for space combinations.
    +    # Calls methods necessary for the game to run properly.
    +    def tick
    +      state.current_turn ||= :x
    +      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
    +      render_board
    +      input_board
    +    end
    +  
    +    # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
    +    def render_board
    +      square_size = 80
    +  
    +      # Positions the game's board in the center of the screen.
    +      # Try removing what follows grid.w_half or grid.h_half and see how the position changes!
    +      board_left = grid.w_half - square_size * 1.5
    +      board_top  = grid.h_half - square_size * 1.5
    +  
    +      # At first glance, the add(1) looks pretty trivial. But if you remove it,
    +      # you'll see that the positioning of the board would be skewed without it!
    +      # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares
    +      # due to the change in board placement.
    +      outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces
    +        space.border ||= [
    +          board_left + x.add(1) * square_size, # space.border is initialized using this definition
    +          board_top  + y.add(1) * square_size,
    +          square_size,
    +          square_size
    +        ]
    +      end
    +  
    +      # Again, the calculations ensure that the piece is placed in the center of the grid square.
    +      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    +      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    +            label board_left + x.add(1) * square_size + square_size.fdiv(2),
    +            board_top  + y.add(1) * square_size + square_size - 20,
    +            space.piece # text of label, either "x" or "o"
    +      end
    +  
    +      # Uses a label to output whether x or o won, or if a draw occurred.
    +      # If the game is ongoing, a label shows whose turn it currently is.
    +      outputs.labels << if state.x_won
    +                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    +                        elsif state.o_won
    +                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    +                        elsif state.draw
    +                          label grid.w_half, grid.top - 80, "a draw"
    +                        else # if no one won and the game is ongoing
    +                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    +                        end
    +    end
    +  
    +    # Calls the methods responsible for handling user input and determining the winner.
    +    # Does nothing unless the mouse is clicked.
    +    def input_board
    +      return unless inputs.mouse.click
    +      input_place_piece
    +      input_restart_game
    +      determine_winner
    +    end
    +  
    +    # Handles user input for placing pieces on the board.
    +    def input_place_piece
    +      return if state.game_over
    +  
    +      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    +      # have a piece in it.
    +      __, __, space = all_spaces.find do |__, __, space|
    +        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
    +      end
    +  
    +      # The piece that goes into the space belongs to the player whose turn it currently is.
    +      return unless space
    +      space.piece = state.current_turn
    +  
    +      # This ternary operator statement allows us to change the current player's turn.
    +      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    +      state.current_turn = state.current_turn == :x ? :o : :x
    +    end
    +  
    +    # Resets the game.
    +    def input_restart_game
    +      return unless state.game_over
    +      gtk.reset
    +    end
    +  
    +    # Checks if x or o won the game.
    +    # If neither player wins and all nine squares are filled, a draw happens.
    +    # Once a player is chosen as the winner or a draw happens, the game is over.
    +    def determine_winner
    +      state.x_won = won? :x # evaluates to either true or false (boolean values)
    +      state.o_won = won? :o
    +      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    +      state.game_over = state.x_won || state.o_won || state.draw
    +    end
    +  
    +    # Determines if a player won by checking if there is a horizontal match or vertical match.
    +    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    +    def won? piece
    +      # performs action on all space combinations
    +      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
       
    -    end
    +        # Checks if the 3 grid spaces with the same y value (or same row) and
    +        # x values that are next to each other have pieces that belong to the same player.
    +        # Remember, the value of piece is equal to the current turn (which is the player).
    +        horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    +                           state.spaces[xs[1]][y].piece == piece &&
    +                           state.spaces[xs[2]][y].piece == piece
       
    -    def update args
    +        # Checks if the 3 grid spaces with the same x value (or same column) and
    +        # y values that are next to each other have pieces that belong to the same player.
    +        # The && represents an "and" statement: if even one part of the statement is false,
    +        # the entire statement evaluates to false.
    +        vertical_match = state.spaces[y][xs[0]].piece == piece &&
    +                         state.spaces[y][xs[1]].piece == piece &&
    +                         state.spaces[y][xs[2]].piece == piece
       
    -      for b in args.state.balls
    -        if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    -          for c in @colliders
    -            if c.collision?(args, b.getPoints(args),b)
    -              c.collide args, b
    -            end
    -          end
    -        end
    +        horizontal_match || vertical_match # if either is true, true is returned
           end
    -    end
       
    -    def draw args
    -      args.outputs.sprites << [
    -        @x,                                       # X
    -        @y,                                       # Y
    -        @width,                                   # W
    -        @height,                                  # H
    -        @image,                                   # PATH
    -        0,                                        # ANGLE
    -        255,                                      # ALPHA
    -        219,                                      # RED_SATURATION
    -        112,                                      # GREEN_SATURATION
    -        147                                       # BLUE_SATURATION
    -      ]
    -      #args.outputs.sprites << [@x, @y, @width, @height, "sprites/roundSquare_small_black.png"]
    +      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    +      # Is added to won regardless of whether the statement is true or false.
    +      won << (state.spaces[-1][-1].piece == piece && # bottom left
    +              state.spaces[ 0][ 0].piece == piece && # center
    +              state.spaces[ 1][ 1].piece == piece)   # top right
    +  
    +      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    +      # and is added to won.
    +      won << (state.spaces[ 1][-1].piece == piece && # bottom right
    +              state.spaces[ 0][ 0].piece == piece && # center
    +              state.spaces[-1][ 1].piece == piece)   # top left
    +  
    +      # Any false statements (meaning false diagonal matches) are rejected from won
    +      won.reject_false.any?
         end
       
    -    def serialize
    -    	{x: @x, y:@y}
    +    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    +    # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    +    # NOT have pieces in them.
    +    def filled_spaces
    +      state.space_combinations
    +        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    +        .map do |x, y|
    +          if block_given?
    +            yield x, y, state.spaces[x][y]
    +          else
    +            [x, y, state.spaces[x][y]] # sets definition of space
    +          end
    +      end
         end
       
    -    def inspect
    -    	serialize.to_s
    +    # Defines all spaces on the board.
    +    def all_spaces
    +      if !block_given?
    +        state.space_combinations.map do |x, y|
    +          [x, y, state.spaces[x][y]] # sets definition of space
    +        end
    +      else # if a block is given (block_given? is true)
    +        state.space_combinations.map do |x, y|
    +          yield x, y, state.spaces[x][y] # yield if a block is given
    +        end
    +      end
         end
       
    -    def to_s
    -    	serialize.to_s
    +    # Sets values for a label, such as the position, value, size, alignment, and color.
    +    def label x, y, value
    +      [x, y + 10, value, 20, 1, 0, 0, 0]
         end
       end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Arbitrary Collision - square_collider.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/square_collider.rb
    -  
    -  class SquareCollider
    -    def initialize x,y,direction,size=COLLISIONWIDTH
    -      @x = x
    -      @y = y
    -      @size = size
    -      @direction = direction
       
    -    end
    -    def collision? args, ball
    -      #args.outputs.solids <<  [@x, @y, @size, @size,     000, 255, 255]
    +  $tic_tac_toe = TicTacToe.new
       
    +  def tick args
    +    $tic_tac_toe._       = args
    +    $tic_tac_toe.state   = args.state
    +    $tic_tac_toe.outputs = args.outputs
    +    $tic_tac_toe.inputs  = args.inputs
    +    $tic_tac_toe.grid    = args.grid
    +    $tic_tac_toe.gtk     = args.gtk
    +    $tic_tac_toe.tick
    +    tick_instructions args, "Sample app shows how to work with mouse clicks."
    +  end
       
    -      return [@x,@y,@size,@size].intersect_rect?([ball.x,ball.y,ball.width,ball.height])
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
         end
       
    -    def collide args, ball
    -      vmag = (ball.velocity.x**2.0 +ball.velocity.y**2.0)**0.5
    -      a = ((2.0**0.5)*vmag)/2.0
    -      if vmag < MAX_VELOCITY
    -        ball.velocity.x = (a) * @direction.x * 1.1
    -        ball.velocity.y = (a) * @direction.y * 1.1
    -      else
    -        ball.velocity.x = (a) * @direction.x
    -        ball.velocity.y = (a) * @direction.y
    -      end
    -  
    -    end
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
       end
     
     #+end_src
     
    -*** Physics And Collisions - Arbitrary Collision - vector2d.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/vector2d.rb
    -  class Vector2d
    -      attr_accessor :x, :y
    -    
    -      def initialize x=0, y=0
    -        @x=x
    -        @y=y
    -      end
    -    
    -      #returns a vector multiplied by scalar x
    -      #x [float] scalar
    -      def mult x
    -        r = Vector2d.new(0,0)
    -        r.x=@x*x
    -        r.y=@y*x
    -        r
    -      end
    -    
    -      # vect [Vector2d] vector to copy
    -      def copy vect
    -        Vector2d.new(@x, @y)
    -      end
    -    
    -      #returns a new vector equivalent to this+vect
    -      #vect [Vector2d] vector to add to self
    -      def add vect
    -        Vector2d.new(@x+vect.x,@y+vect.y)
    -      end
    -    
    -      #returns a new vector equivalent to this-vect
    -      #vect [Vector2d] vector to subtract to self
    -      def sub vect
    -        Vector2d.new(@x-vect.c, @y-vect.y)
    -      end
    -    
    -      #return the magnitude of the vector
    -      def mag
    -        ((@x**2)+(@y**2))**0.5
    -      end
    -    
    -      #returns a new normalize version of the vector
    -      def normalize
    -        Vector2d.new(@x/mag, @y/mag)
    -      end
    -    
    -      #TODO delet?
    -      def distABS vect
    -        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    -      end
    -    end
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - ball.rb
    +*** Mouse - Mouse Move - main.rb
     #+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/ball.rb
    -  class Ball
    -    #TODO limit accessors?
    -    attr_accessor :xy, :width, :height, :velocity
    +  # ./samples/05_mouse/02_mouse_move/app/main.rb
    +  =begin
       
    +   Reminders:
       
    -    #@xy [Vector2d] x,y position
    -    #@velocity [Vector2d] velocity of ball
    -    def initialize
    -      @xy = Vector2d.new(WIDTH/2,500)
    -      @velocity = Vector2d.new(4,-4)
    -      @width =  20
    -      @height = 20
    -    end
    +   - num1.greater(num2): Returns the greater value.
    +     For example, if we have the command
    +     puts 4.greater(3)
    +     the number 4 would be printed to the console since it has a greater value than 3.
    +     Similar to lesser, which returns the lesser value.
       
    -    #move the ball according to its velocity
    -    def update args
    -      @xy.x+=@velocity.x
    -      @xy.y+=@velocity.y
    -    end
    +   - find_all: Finds all elements of a collection that meet certain requirements.
    +     For example, in this sample app, we're using find_all to find all zombies that have intersected
    +     or hit the player's sprite since these zombies have been killed.
       
    -    #render the ball to the screen
    -    def render args
    -      args.outputs.solids << [@xy.x,@xy.y,@width,@height,255,0,255];
    -      #args.outputs.labels << [20,HEIGHT-50,"velocity: " +@velocity.x.to_s+","+@velocity.y.to_s + "   magnitude:" + @velocity.mag.to_s]
    -    end
    +   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    +     Stores the frame the "down" event occurred.
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
       
    -    def rect
    -      [@xy.x,@xy.y,@width,@height]
    -    end
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
       
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - linear_collider.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/linear_collider.rb
    -  #The LinearCollider (theoretically) produces collisions upon a line segment defined point.y two x,y cordinates
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +     When we want to create a new object, we can declare it as a new entity and then define
    +     its properties. (Remember, you can use state to define ANY property and it will
    +     be retained across frames.)
       
    -  class LinearCollider
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
       
    -    #start [Array of length 2] start of the line segment as a x,y cordinate
    -    #last [Array of length 2] end of the line segment as a x,y cordinate
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +     each element by 2 or declaring every element as a new entity.
       
    -    #inorder for the LinearCollider to be functional the line segment must be said to have a thickness
    -    #(as it is unlikly that a colliding object will land exactly on the linesegment)
    +   - sample: Chooses a random element from the array.
       
    -    #extension defines if the line's thickness extends negatively or positively
    -    #extension :pos     extends positively
    -    #extension :neg     extends negatively
    +   - reject: Removes elements that meet certain requirements.
    +     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    +     rejecting zombies that were killed more than 30 frames ago.
       
    -    #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)
    -    def initialize (pointA, pointB, extension=:neg, thickness=10)
    -      @pointA = pointA
    -      @pointB = pointB
    -      @thickness = thickness
    -      @extension = extension
    +  =end
       
    -      @pointAExtended={
    -        x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -        y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -      }
    -      @pointBExtended={
    -        x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -        y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -      }
    +  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    +  # is to kill the zombies as fast as possible!
    +  
    +  class ProtectThePuppiesFromTheZombies
    +    attr_accessor :grid, :inputs, :state, :outputs
       
    +    # Calls the methods necessary for the game to run properly.
    +    def tick
    +      defaults
    +      render
    +      calc
    +      input
         end
       
    -    def resetPoints(pointA,pointB)
    -      @pointA = pointA
    -      @pointB = pointB
    +    # Sets default values for the zombies and for the player.
    +    # Initialization happens only in the first frame.
    +    def defaults
    +      state.flash_at               ||= 0
    +      state.zombie_min_spawn_rate  ||= 60
    +      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    +      state.zombies                ||= []
    +      state.killed_zombies         ||= []
       
    -      @pointAExtended={
    -        x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -        y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -      }
    -      @pointBExtended={
    -        x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -        y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -      }
    +      # Declares player as a new entity and sets its properties.
    +      # The player begins the game in the center of the screen, not moving in any direction.
    +      state.player ||= state.new_entity(:player, { x: 640,
    +                                                 y: 360,
    +                                                 attack_angle: 0,
    +                                                 dx: 0,
    +                                                 dy: 0 })
         end
       
    -    #TODO: Ugly function
    -    def slope (pointA, pointB)
    -      return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)
    +    # Outputs a gray background.
    +    # Calls the methods needed to output the player, zombies, etc onto the screen.
    +    def render
    +      outputs.solids << [grid.rect, 100, 100, 100]
    +      render_zombies
    +      render_killed_zombies
    +      render_player
    +      render_flash
         end
       
    -    #TODO: Ugly function
    -    def intercept(pointA, pointB)
    -      if (slope(pointA, pointB) == INFINITY)
    -        -INFINITY
    -      elsif slope(pointA, pointB) == -1*INFINITY
    -        INFINITY
    -      else
    -        pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)
    +    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    +    def render_zombies
    +      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    +        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    +        z.sprite
           end
         end
       
    -    def calcY(pointA, pointB, x)
    -      return slope(pointA, pointB)*x + intercept(pointA, pointB)
    -    end
    +    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    +    def render_killed_zombies
    +      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    +        z.sprite = [z.x,
    +                    z.y,
    +                    4 * 3,
    +                    8 * 3,
    +                    animation_sprite(z, z.death_at), # calls animation_sprite method
    +                    0, # angle
    +                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    +                    # change the value of 30 and see what happens when a zombie is killed
       
    -    #test if a collision has occurred
    -    def isCollision? (point)
    -      #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test
    -      if slope(@pointA, @pointB) ==  INFINITY &&
    -        point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    -        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    -        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    -          return true
    +        # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    +        # The slash is tilted 45 degrees from the angle of the player's attack.
    +        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    +        # the slash over the killed zombie's sprite.
    +        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
           end
    +    end
       
    -      isNegInLine   = @extension == :neg &&
    -                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -      isPosInLine   = @extension == :pos &&
    -                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    -                      point.x <= [@pointA.x,@pointB.x].max &&
    -                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    -                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
    -  
    -      return isInBoxBounds && (isNegInLine || isPosInLine)
    +    # Outputs the player sprite using the images in the sprites folder.
    +    def render_player
    +      state.player_sprite = [state.player.x,
    +                             state.player.y,
    +                            4 * 3,
    +                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    +      outputs.sprites << state.player_sprite
       
    +      # Outputs a small red square that previews the angles that the player can attack in.
    +      # It can be moved in a perfect circle around the player to show possible movements.
    +      # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    +      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    +                          state.player.y + state.player.attack_angle.vector_y(60),
    +                          3, 3, 255, 0, 0]
         end
       
    -    def getRepelMagnitude (fbx, fby, vrx, vry, args)
    -      a = fbx ; b = vrx ; c = fby
    -      d = vry ; e = args.state.ball.velocity.mag
    -  
    -      if b**2 + d**2 == 0
    -        puts "magnitude error"
    -      end
    +    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    +    def render_flash
    +      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    +      # Transparency gradually changes (or eases) during the 10 frames of flash.
    +      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
    +    end
       
    -      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    -      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    -      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
    +    # Calls all methods necessary for performing calculations.
    +    def calc
    +      calc_spawn_zombie
    +      calc_move_zombies
    +      calc_player
    +      calc_kill_zombie
         end
       
    -    def update args
    -      #each of the four points on the square ball - NOTE simple to extend to a circle
    -      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    -                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    -                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    -                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    -              ]
    +    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    +    def calc_spawn_zombie
    +      if state.zombie_spawn_countdown > 0
    +        state.zombie_spawn_countdown -= 1
    +        return
    +      end
       
    -      #for each point p in points
    -      for point in points
    -        #isCollision.md has more information on this section
    -        #TODO: section can certainly be simplifyed
    -        if isCollision?(point)
    -          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
    +      # New zombies are created, positioned on the screen, and added to the zombies collection.
    +      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    +        if rand > 0.5
    +          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    +          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    +          # the possible values exceed the screen's scope so zombies appear to be coming from far away
    +        else
    +          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    +          z.y = grid.rect.w.randomize(:ratio) # random y position on screen
    +        end
    +      end
       
    -          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    -          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    -          choiceA = (u.mult(1))
    -          choiceB =  (u.mult(-1))
    -          vectorRepel = nil
    +      # Calls random_spawn_countdown method (determines how fast new zombies appear)
    +      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    +      state.zombie_min_spawn_rate -= 1
    +      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    +      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
    +    end
       
    -          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    -            choiceA, choiceB = choiceB, choiceA
    -          end
    -          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
    +    # Moves all zombies towards the center of the screen.
    +    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    +    def calc_move_zombies
    +      state.zombies.each do |z| # for each zombie in the collection
    +        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    +        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
    +      end
    +      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
    +    end
       
    -          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    -          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    -            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    -          end
    -          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    -          #vectorRepel now has the repeling force
    +    # Calculates the position and movement of the player on the screen.
    +    def calc_player
    +      state.player.x += state.player.dx # changes x based on dx (change in x)
    +      state.player.y += state.player.dy # changes y based on dy (change in y)
       
    -          mag = args.state.ball.velocity.mag
    -          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    -          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    -          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    +      state.player.dx *= 0.9 # scales dx down
    +      state.player.dy *= 0.9 # scales dy down
       
    -          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    -          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    +      # This ensures that the player remains within the screen's scope.
    +      state.player.x = state.player.x.lesser(1280).greater(0)
    +      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
    +    end
       
    -          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    +    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    +    def calc_kill_zombie
       
    -          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    -          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +      # Find all zombies that intersect with the player. They are considered killed.
    +      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    +      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    +      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
       
    -          fsumx = fbx+frx #sum of x forces
    -          fsumy = fby+fry #sum of y forces
    -          fr = mag#fr is the resulting magnitude
    -          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    -          xnew = fr*Math.cos(thetaNew) #resulting x velocity
    -          ynew = fr*Math.sin(thetaNew) #resulting y velocity
    +      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    +        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    +      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    +      end
       
    -          args.state.ball.velocity = Vector2d.new(xnew,ynew)
    -          #args.state.ball.xy.add(args.state.ball.velocity)
    -          break #no need to check the other points ?
    -        else
    -        end
    +      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    +      # Death_at stores the frame a zombie was killed.
    +      killed_this_frame.each do |z|
    +        z.death_at = state.tick_count
           end
    -    end #end update
       
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - main.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    -  # coding: utf-8
    -  INFINITY= 10**10
    -  WIDTH=1280
    -  HEIGHT=720
    +      # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    +      # They are rejected if more than 30 frames have passed since their death.
    +      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
    +    end
       
    -  require 'app/vector2d.rb'
    -  require 'app/paddle.rb'
    -  require 'app/ball.rb'
    -  require 'app/linear_collider.rb'
    +    # Uses input from the user to move the player around the screen.
    +    def input
       
    -  #Method to init default values
    -  def defaults args
    -    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    -    args.state.bricks ||= []
    -    args.state.num_bricks ||= 0
    -    args.state.game_over_at ||= 0
    -    args.state.paddle ||= Paddle.new
    -    args.state.ball   ||= Ball.new
    -    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    -    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    -    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    -    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
    +      # If the "a" key or left key is pressed, the x position of the player decreases.
    +      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    +      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    +        state.player.x -= 5
    +      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    +        state.player.x += 5
    +      end
       
    -    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    -  end
    +      # If the "w" or up key is pressed, the y position of the player increases.
    +      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    +      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    +        state.player.y += 5
    +      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    +        state.player.y -= 5
    +      end
       
    -  #Render loop
    -  def render args
    -    render_instructions args
    -    render_board args
    -    render_bricks args
    -  end
    +      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    +      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    +      # Attack angle also contributes to the position of red square.
    +      if inputs.mouse.moved
    +        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    +      end
       
    -  begin :render_methods
    -    #Method to display the instructions of the game
    -    def render_instructions args
    -      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    +      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5
    +        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    +        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set
    +        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position
    +        state.player.dy = state.player.attack_angle.vector_y(25)
    +      end
         end
       
    -    def render_board args
    -      args.outputs.borders << args.state.game_board
    +    # Sets the zombie spawn's countdown to a random number.
    +    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)
    +    def random_spawn_countdown minimum
    +      10.randomize(:ratio, :sign).to_i + 60
         end
       
    -    def render_bricks args
    -      args.outputs.solids << args.state.bricks.map(&:rect)
    +    # Helps to iterate through the images in the sprites folder by setting the animation index.
    +    # 3 frames is how long to show an image, and 6 is how many images to flip through.
    +    def animation_index at
    +      at.idiv(3).mod(6)
    +    end
    +  
    +    # Animates the zombies by using the animation index to go through the images in the sprites folder.
    +    def animation_sprite zombie, at = nil
    +      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created
    +      index = animation_index at
    +      "sprites/zombie-#{index}.png" # string interpolation to iterate through images
         end
       end
       
    -  #Calls all methods necessary for performing calculations
    -  def calc args
    -    add_new_bricks args
    -    reset_game args
    -    calc_collision args
    -    win_game args
    +  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new
       
    -    args.state.westWall.update args
    -    args.state.eastWall.update args
    -    args.state.southWall.update args
    -    args.state.northWall.update args
    -    args.state.paddle.update args
    -    args.state.ball.update args
    +  def tick args
    +    $protect_the_puppies_from_the_zombies.grid    = args.grid
    +    $protect_the_puppies_from_the_zombies.inputs  = args.inputs
    +    $protect_the_puppies_from_the_zombies.state    = args.state
    +    $protect_the_puppies_from_the_zombies.outputs = args.outputs
    +    $protect_the_puppies_from_the_zombies.tick
    +    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."
    +  end
       
    -    #args.state.testWall.update args
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
       
    -    args.state.paddle.render args
    -    args.state.ball.render args
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
       end
    +
    +#+end_src
    +
    +*** Mouse - Mouse Move Paint App - main.rb
    +#+begin_src ruby
    +  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    +  =begin
       
    -  begin :calc_methods
    -    def add_new_bricks args
    -      return if args.state.num_bricks > 40
    -  
    -      #Width of the game board is 640px
    -      brick_width = (args.grid.w / 2) / 10
    -      brick_height = brick_width / 2
    +   APIs listing that haven't been encountered in previous sample apps:
       
    -      (4).map_with_index do |y|
    -        #Make a box that is 10 bricks wide and 4 bricks tall
    -        args.state.bricks += (10).map_with_index do |x|
    -          args.state.new_entity(:brick) do |b|
    -            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    -            b.y = args.grid.h - ((y + 1) * brick_height)
    -            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
    +   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
       
    -            #Add linear colliders to the brick
    -            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    -            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    -            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    -            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
    +     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    +     puts a.floor()
    +     which would print out 13.
    +     (There is also a ceil method, which returns an integer number greater than or equal to the original
    +     with no decimal. If we had called ceil on the variable a, the result would have been 14.)
       
    -            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    -            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    -            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
    +   Reminders:
       
    -            b.broken = false
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +     using their keys.
       
    -            args.state.num_bricks += 1
    -          end
    -        end
    -      end
    -    end
    +     For example, if we have a "numbers" hash that stores numbers in English as the
    +     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +     and on it goes.
       
    -    def reset_game args
    -      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    -        #Freeze the ball
    -        args.state.ball.velocity.x = 0
    -        args.state.ball.velocity.y = 0
    -        #Freeze the paddle
    -        args.state.paddle.enabled = false
    +     Now if we wanted to find the corresponding value of the "one" key, we could say
    +     puts numbers["one"]
    +     which would print "uno" to the console.
       
    -        args.state.game_over_at = args.state.tick_count
    -      end
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +     In this sample app, new_entity is used to create a new button that clears the grid.
    +     (Remember, you can use state to define ANY property and it will be retained across frames.)
       
    -      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    -        #Display a "Game over" message
    -        args.outputs.labels << [100, 100, "GAME OVER", 10]
    -      end
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
       
    -      #If 60 frames have passed since the game ended, restart the game
    -      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    -        # FIXME: only put value types in state
    -        args.state.ball = Ball.new
    +   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
       
    -        # FIXME: only put value types in state
    -        args.state.paddle = Paddle.new
    +   - args.outputs.labels: An array. The values in the array generate a label.
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +     For more information about labels, go to mygame/documentation/02-labels.md.
       
    -        args.state.bricks = []
    -        args.state.num_bricks = 0
    -      end
    -    end
    +   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
       
    -    def calc_collision args
    -      #Remove the brick if it is hit with the ball
    -      ball = args.state.ball
    -      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
    +  =end
       
    -      #Loop through each brick to see if the ball is colliding with it
    -      args.state.bricks.each do |b|
    -        if b.rect.intersect_rect?(ball_rect)
    -          #Run the linear collider for the brick if there is a collision
    -          b[:collider_bottom].update args
    -          b[:collider_right].update args
    -          b[:collider_left].update args
    -          b[:collider_top].update args
    +  # This sample app shows an empty grid that the user can paint on.
    +  # To paint, the user must keep their mouse presssed and drag it around the grid.
    +  # The "clear" button allows users to clear the grid so they can start over.
       
    -          b.broken = true
    -        end
    -      end
    +  class PaintApp
    +    attr_accessor :inputs, :state, :outputs, :grid, :args
       
    -      args.state.bricks = args.state.bricks.reject(&:broken)
    +    # Runs methods necessary for the game to function properly.
    +    def tick
    +      print_title
    +      add_grid
    +      check_click
    +      draw_buttons
         end
       
    -    def win_game args
    -      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    -        #Freeze the ball
    -        args.state.ball.velocity.x = 0
    -        args.state.ball.velocity.y = 0
    -        #Freeze the paddle
    -        args.state.paddle.enabled = false
    -  
    -        args.state.game_over_at = args.state.tick_count
    -      end
    -  
    -      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    -        #Display a "Game over" message
    -        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    -      end
    +    # Prints the title onto the screen by using a label.
    +    # Also separates the title from the grid with a line as a horizontal separator.
    +    def print_title
    +      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    +      outputs.lines << horizontal_separator(660, 0, 1280)
         end
       
    -  end
    -  
    -  def tick args
    -    defaults args
    -    render args
    -    calc args
    -  
    -    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +    # Sets the starting position, ending position, and color for the horizontal separator.
    +    # The starting and ending positions have the same y values.
    +    def horizontal_separator y, x, x2
    +      [x, y, x2, y, 150, 150, 150]
    +    end
       
    -    #$tc+=1
    -    #if $tc == 5
    -      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    -      #$tc = 0
    -    #end
    -    #for t in $train
    +    # Sets the starting position, ending position, and color for the vertical separator.
    +    # The starting and ending positions have the same x values.
    +    def vertical_separator x, y, y2
    +      [x, y, x, y2, 150, 150, 150]
    +    end
       
    -      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    -    #end
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - paddle.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
    -  class Paddle
    -    attr_accessor :enabled
    +    # Outputs a border and a grid containing empty squares onto the screen.
    +    def add_grid
       
    -    def initialize ()
    -      @x=WIDTH/2
    -      @y=100
    -      @width=100
    -      @height=20
    -      @speed=10
    +      # Sets the x, y, height, and width of the grid.
    +      # There are 31 horizontal lines and 31 vertical lines in the grid.
    +      # Feel free to count them yourself before continuing!
    +      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    +      lines_h = 31
    +      lines_v = 31
       
    -      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +      # Sets values for the grid's border, grid lines, and filled squares.
    +      # The filled_squares variable is initially set to an empty array.
    +      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    +      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    +      state.filled_squares ||= [] # there are no filled squares until the user fills them in
       
    -      @enabled = true
    +      # Outputs the grid lines, border, and filled squares onto the screen.
    +      outputs.lines.concat state.grid_lines
    +      outputs.borders << state.grid_border
    +      outputs.solids << state.filled_squares
         end
       
    -    def update args
    -      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    -      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    -  
    -      @xyCollision.update  args
    -      @xyCollision2.update args
    -      @xyCollision3.update args
    -      @xyCollision4.update args
    +    # Draws the grid by adding in vertical and horizontal separators.
    +    def draw_grid x, y, h, w, lines_h, lines_v
       
    -      args.inputs.keyboard.key_held.left  ||= false
    -      args.inputs.keyboard.key_held.right  ||= false
    +      # The grid starts off empty.
    +      grid = []
       
    -      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    -        if args.inputs.keyboard.key_held.left && @enabled
    -          @x-=@speed
    -        elsif args.inputs.keyboard.key_held.right && @enabled
    -          @x+=@speed
    -        end
    +      # Calculates the placement and adds horizontal lines or separators into the grid.
    +      curr_y = y # start at the bottom of the box
    +      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    +      lines_h.times do
    +        curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    +        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
           end
       
    -      xmin =WIDTH/4
    -      xmax = 3*(WIDTH/4)
    -      @x = (@x+@width > xmax) ? xmax-@width : (@x x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    +                            "lines_v" => lines_v, "dist_x" => dist_x,
    +                            "dist_y" => dist_y }
       
    -    def rect
    -      [@x, @y, @width, @height]
    +      return grid
         end
    -  end
    -
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - tests.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/tests.rb
    -  # For advanced users:
    -  # You can put some quick verification tests here, any method
    -  # that starts with the `test_` will be run when you save this file.
       
    -  # Here is an example test and game
    +    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    +    # If the mouse is up, the user cannot drag the mouse.
    +    def check_click
    +      if inputs.mouse.down #is mouse up or down?
    +        state.mouse_held = true # mouse is being held down
    +      elsif inputs.mouse.up # if mouse is up
    +      state.mouse_held = false # mouse is not being held down or dragged
    +        state.mouse_dragging = false
    +      end
       
    -  # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
    +      if state.mouse_held &&    # mouse needs to be down
    +        !inputs.mouse.click &&     # must not be first click
    +        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    +        state.mouse_dragging = true
    +      end
       
    -  class MySuperHappyFunGame
    -    attr_gtk
    +      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    +      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    +        search_lines(inputs.mouse.click.point, :click)
       
    -    def tick
    -      outputs.solids << [100, 100, 300, 300]
    +      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    +      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    +        search_lines(inputs.mouse.position, :drag)
    +      end
         end
    -  end
       
    -  def test_universe args, assert
    -    game = MySuperHappyFunGame.new
    -    game.args = args
    -    game.tick
    -    assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    -    assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    -    puts "test_universe completed successfully"
    -  end
    +    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    +    def search_lines (point, input_type)
    +      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    +      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
       
    -  puts "running tests"
    -  $gtk.reset 100
    -  $gtk.log_level = :off
    -  $gtk.tests.start
    -
    -#+end_src
    -
    -*** Physics And Collisions - Collision With Object Removal - vector2d.rb
    -#+begin_src ruby
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/vector2d.rb
    +      # Remove code following the .floor and see what happens when you try to fill in grid squares
    +      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    +      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
       
    -  class Vector2d
    -    attr_accessor :x, :y
    +      point.x += state.paint_grid["x"]
    +      point.y += state.paint_grid["y"]
       
    -    def initialize x=0, y=0
    -      @x=x
    -      @y=y
    -    end
    +      # Sets definition of a grid box, meaning its x, y, width, and height.
    +      # Floor is called on the point.x and point.y variables.
    +      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    +      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
       
    -    #returns a vector multiplied by scalar x
    -    #x [float] scalar
    -    def mult x
    -      r = Vector2d.new(0,0)
    -      r.x=@x*x
    -      r.y=@y*x
    -      r
    +      if input_type == :click # if user clicks their mouse
    +        if state.filled_squares.include? grid_box # if grid box is already filled in
    +          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    +        else
    +          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    +        end
    +      elsif input_type == :drag # if user drags mouse
    +        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    +          state.filled_squares << grid_box # the box is filled in and added to filled_squares
    +        end
    +      end
         end
       
    -    # vect [Vector2d] vector to copy
    -    def copy vect
    -      Vector2d.new(@x, @y)
    -    end
    +    # Creates and outputs a "Clear" button on the screen using a label and a border.
    +    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    +    def draw_buttons
    +      x, y, w, h = 390, 50, 240, 50
    +      state.clear_button        ||= state.new_entity(:button_with_fade)
       
    -    #returns a new vector equivalent to this+vect
    -    #vect [Vector2d] vector to add to self
    -    def add vect
    -      Vector2d.new(@x+vect.x,@y+vect.y)
    -    end
    +      # The x and y positions are set to display the label in the center of the button.
    +      # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    +      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    +      state.clear_button.border ||= [x, y, w, h]
       
    -    #returns a new vector equivalent to this-vect
    -    #vect [Vector2d] vector to subtract to self
    -    def sub vect
    -      Vector2d.new(@x-vect.c, @y-vect.y)
    +      # If the mouse is clicked inside the borders of the clear button,
    +      # the filled_squares collection is emptied and the squares are cleared.
    +      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    +        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    +        state.filled_squares.clear
    +        inputs.mouse.previous_click = nil
    +      end
    +  
    +      outputs.labels << state.clear_button.label
    +      outputs.borders << state.clear_button.border
    +  
    +      # When the clear button is clicked, the color of the button changes
    +      # and the transparency changes, as well. If you change the time from
    +      # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    +      if state.clear_button.clicked_at
    +        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    +      end
         end
    +  end
       
    -    #return the magnitude of the vector
    -    def mag
    -      ((@x**2)+(@y**2))**0.5
    -    end
    +  $paint_app = PaintApp.new
       
    -    #returns a new normalize version of the vector
    -    def normalize
    -      Vector2d.new(@x/mag, @y/mag)
    -    end
    +  def tick args
    +    $paint_app.inputs = args.inputs
    +    $paint_app.state = args.state
    +    $paint_app.grid = args.grid
    +    $paint_app.args = args
    +    $paint_app.outputs = args.outputs
    +    $paint_app.tick
    +    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    +  end
       
    -    #TODO delet?
    -    def distABS vect
    -      (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
         end
    +  
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
       end
     
     #+end_src
     
    -*** Mouse - Mouse Click - main.rb
    +*** Mouse - Coordinate Systems - main.rb
     #+begin_src ruby
    -  # ./samples/05_mouse/01_mouse_click/app/main.rb
    +  # ./samples/05_mouse/04_coordinate_systems/app/main.rb
       =begin
       
        APIs listing that haven't been encountered in previous sample apps:
       
    -   - product: Returns an array of all combinations of elements from all arrays.
    -  
    -     For example, [1,2].product([1,2]) would return the following array...
    -     [[1,1], [1,2], [2,1], [2,2]]
    -     More than two arrays can be given to product and it will still work,
    -     such as [1,2].product([1,2],[3,4]). What would product return in this case?
    -  
    -     Answer:
    -     [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[2,1,3],[2,1,4],[2,2,3],[2,2,4]]
    -  
    -   - num1.fdiv(num2): Returns the float division (will have a decimal) of the two given numbers.
    -     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    -  
    -   - yield: Allows you to call a method with a code block and yield to that block.
    +   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    +     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    +     position to know the mouse's coordinates.
    +     For more information about the mouse, go to mygame/documentation/07-mouse.md.
       
        Reminders:
       
    -   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    +   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +  
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
       
        - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
          as Ruby code, and the placeholder is replaced with its corresponding value or result.
       
    -   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -  
    -   - Ternary operator (?): Will evaluate a statement (just like an if statement)
    -     and perform an action if the result is true or another action if it is false.
    +     In this sample app, string interpolation is used to show the current position of the mouse
    +     in a label.
       
    -   - reject: Removes elements from a collection if they meet certain requirements.
    +   - args.outputs.labels: An array that generates a label.
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +     For more information about labels, go to mygame/documentation/02-labels.md.
       
    -   - args.outputs.borders: An array. The values generate a border.
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    -     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    +   - args.outputs.solids: An array that generates a solid.
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
       
    -   - args.outputs.labels: An array. The values generate a label.
    -     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -     For more information about labels, go to mygame/documentation/02-labels.
    +   - args.outputs.lines: An array that generates a line.
    +     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    +     For more information about lines, go to mygame/documentation/04-lines.md.
       
       =end
       
    -  # This sample app is a classic game of Tic Tac Toe.
    -  
    -  class TicTacToe
    -    attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk
    -  
    -    # Starts the game with player x's turn and creates an array (to_a) for space combinations.
    -    # Calls methods necessary for the game to run properly.
    -    def tick
    -      state.current_turn ||= :x
    -      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
    -      render_board
    -      input_board
    -    end
    -  
    -    # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
    -    def render_board
    -      square_size = 80
    -  
    -      # Positions the game's board in the center of the screen.
    -      # Try removing what follows grid.w_half or grid.h_half and see how the position changes!
    -      board_left = grid.w_half - square_size * 1.5
    -      board_top  = grid.h_half - square_size * 1.5
    -  
    -      # At first glance, the add(1) looks pretty trivial. But if you remove it,
    -      # you'll see that the positioning of the board would be skewed without it!
    -      # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares
    -      # due to the change in board placement.
    -      outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces
    -        space.border ||= [
    -          board_left + x.add(1) * square_size, # space.border is initialized using this definition
    -          board_top  + y.add(1) * square_size,
    -          square_size,
    -          square_size
    -        ]
    -      end
    -  
    -      # Again, the calculations ensure that the piece is placed in the center of the grid square.
    -      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    -      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    -            label board_left + x.add(1) * square_size + square_size.fdiv(2),
    -            board_top  + y.add(1) * square_size + square_size - 20,
    -            space.piece # text of label, either "x" or "o"
    -      end
    -  
    -      # Uses a label to output whether x or o won, or if a draw occurred.
    -      # If the game is ongoing, a label shows whose turn it currently is.
    -      outputs.labels << if state.x_won
    -                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    -                        elsif state.o_won
    -                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    -                        elsif state.draw
    -                          label grid.w_half, grid.top - 80, "a draw"
    -                        else # if no one won and the game is ongoing
    -                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    -                        end
    -    end
    -  
    -    # Calls the methods responsible for handling user input and determining the winner.
    -    # Does nothing unless the mouse is clicked.
    -    def input_board
    -      return unless inputs.mouse.click
    -      input_place_piece
    -      input_restart_game
    -      determine_winner
    -    end
    -  
    -    # Handles user input for placing pieces on the board.
    -    def input_place_piece
    -      return if state.game_over
    -  
    -      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    -      # have a piece in it.
    -      __, __, space = all_spaces.find do |__, __, space|
    -        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
    -      end
    -  
    -      # The piece that goes into the space belongs to the player whose turn it currently is.
    -      return unless space
    -      space.piece = state.current_turn
    -  
    -      # This ternary operator statement allows us to change the current player's turn.
    -      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    -      state.current_turn = state.current_turn == :x ? :o : :x
    -    end
    -  
    -    # Resets the game.
    -    def input_restart_game
    -      return unless state.game_over
    -      gtk.reset
    -    end
    -  
    -    # Checks if x or o won the game.
    -    # If neither player wins and all nine squares are filled, a draw happens.
    -    # Once a player is chosen as the winner or a draw happens, the game is over.
    -    def determine_winner
    -      state.x_won = won? :x # evaluates to either true or false (boolean values)
    -      state.o_won = won? :o
    -      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    -      state.game_over = state.x_won || state.o_won || state.draw
    -    end
    -  
    -    # Determines if a player won by checking if there is a horizontal match or vertical match.
    -    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    -    def won? piece
    -      # performs action on all space combinations
    -      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
    -  
    -        # Checks if the 3 grid spaces with the same y value (or same row) and
    -        # x values that are next to each other have pieces that belong to the same player.
    -        # Remember, the value of piece is equal to the current turn (which is the player).
    -        horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    -                           state.spaces[xs[1]][y].piece == piece &&
    -                           state.spaces[xs[2]][y].piece == piece
    -  
    -        # Checks if the 3 grid spaces with the same x value (or same column) and
    -        # y values that are next to each other have pieces that belong to the same player.
    -        # The && represents an "and" statement: if even one part of the statement is false,
    -        # the entire statement evaluates to false.
    -        vertical_match = state.spaces[y][xs[0]].piece == piece &&
    -                         state.spaces[y][xs[1]].piece == piece &&
    -                         state.spaces[y][xs[2]].piece == piece
    -  
    -        horizontal_match || vertical_match # if either is true, true is returned
    -      end
    -  
    -      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    -      # Is added to won regardless of whether the statement is true or false.
    -      won << (state.spaces[-1][-1].piece == piece && # bottom left
    -              state.spaces[ 0][ 0].piece == piece && # center
    -              state.spaces[ 1][ 1].piece == piece)   # top right
    +  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    +  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    +  # four quadrants by pressing the button.
       
    -      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    -      # and is added to won.
    -      won << (state.spaces[ 1][-1].piece == piece && # bottom right
    -              state.spaces[ 0][ 0].piece == piece && # center
    -              state.spaces[-1][ 1].piece == piece)   # top left
    +  def tick args
       
    -      # Any false statements (meaning false diagonal matches) are rejected from won
    -      won.reject_false.any?
    -    end
    +    # The addition and subtraction in the first two parameters of the label and solid
    +    # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    +    pos = args.inputs.mouse.position # stores coordinates of mouse's position
    +    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    +    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
       
    -    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    -    # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    -    # NOT have pieces in them.
    -    def filled_spaces
    -      state.space_combinations
    -        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    -        .map do |x, y|
    -          if block_given?
    -            yield x, y, state.spaces[x][y]
    -          else
    -            [x, y, state.spaces[x][y]] # sets definition of space
    -          end
    -      end
    -    end
    +    button = [0, 0, 370, 50] # sets definition of toggle button
    +    args.outputs.borders << button # outputs button as border (not filled in)
    +    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    +    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    +    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
       
    -    # Defines all spaces on the board.
    -    def all_spaces
    -      if !block_given?
    -        state.space_combinations.map do |x, y|
    -          [x, y, state.spaces[x][y]] # sets definition of space
    -        end
    -      else # if a block is given (block_given? is true)
    -        state.space_combinations.map do |x, y|
    -          yield x, y, state.spaces[x][y] # yield if a block is given
    +    if args.inputs.mouse.click # if the user clicks the mouse
    +      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    +      if pos.inside_rect? button # if the click occurred inside the button
    +        if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    +          args.grid.origin_center! # origin will be shown in center
    +        else
    +          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
             end
           end
         end
       
    -    # Sets values for a label, such as the position, value, size, alignment, and color.
    -    def label x, y, value
    -      [x, y + 10, value, 20, 1, 0, 0, 0]
    -    end
    -  end
    -  
    -  $tic_tac_toe = TicTacToe.new
    -  
    -  def tick args
    -    $tic_tac_toe._       = args
    -    $tic_tac_toe.state   = args.state
    -    $tic_tac_toe.outputs = args.outputs
    -    $tic_tac_toe.inputs  = args.inputs
    -    $tic_tac_toe.grid    = args.grid
    -    $tic_tac_toe.gtk     = args.gtk
    -    $tic_tac_toe.tick
    -    tick_instructions args, "Sample app shows how to work with mouse clicks."
    +    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
       end
       
       def tick_instructions args, text, y = 715
    @@ -10621,1032 +10636,1400 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** Mouse - Mouse Move - main.rb
    +*** Save Load - Save Load Game - main.rb
     #+begin_src ruby
    -  # ./samples/05_mouse/02_mouse_move/app/main.rb
    +  # ./samples/06_save_load/01_save_load_game/app/main.rb
       =begin
       
    -   Reminders:
    +   APIs listing that haven't been encountered in previous sample apps:
       
    -   - num1.greater(num2): Returns the greater value.
    -     For example, if we have the command
    -     puts 4.greater(3)
    -     the number 4 would be printed to the console since it has a greater value than 3.
    -     Similar to lesser, which returns the lesser value.
    +   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    +     because with a given symbol name, you can refer to the same object throughout
    +     a Ruby program.
       
    -   - find_all: Finds all elements of a collection that meet certain requirements.
    -     For example, in this sample app, we're using find_all to find all zombies that have intersected
    -     or hit the player's sprite since these zombies have been killed.
    +     In this sample app, we're using symbols for our buttons. We have buttons that
    +     light fires, save, load, etc. Each of these buttons has a distinct symbol like
    +     :light_fire, :save_game, :load_game, etc.
       
    -   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    -     Stores the frame the "down" event occurred.
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +   - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    +     if it does not already exist.
    +     For example,
    +     'car'.to_sym
    +     would return the symbol :car.
       
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +   - last: Returns the last element of an array.
       
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -     When we want to create a new object, we can declare it as a new entity and then define
    -     its properties. (Remember, you can use state to define ANY property and it will
    -     be retained across frames.)
    +   Reminders:
       
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +   - num1.lesser(num2): finds the lower value of the given options.
    +     For example, in the statement
    +     a = 4.lesser(3)
    +     3 has a lower value than 4, which means that the value of a would be set to 3,
    +     but if the statement had been
    +     a = 4.lesser(5)
    +     4 has a lower value than 5, which means that the value of a would be set to 4.
       
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -     each element by 2 or declaring every element as a new entity.
    +   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    +     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
       
    -   - sample: Chooses a random element from the array.
    +   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
       
    -   - reject: Removes elements that meet certain requirements.
    -     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    -     rejecting zombies that were killed more than 30 frames ago.
    +   - args.outputs.labels: An array. Values generate a label.
    +     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +     For more information, go to mygame/documentation/02-labels.md.
    +  
    +   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +     with at least four values is considered a rect. The inside_rect? function returns true
    +     or false depending on if the point is inside the rect.
       
       =end
       
    -  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    -  # is to kill the zombies as fast as possible!
    +  # This code allows users to perform different tasks, such as saving and loading the game.
    +  # Users also have options to reset the game and light a fire.
       
    -  class ProtectThePuppiesFromTheZombies
    -    attr_accessor :grid, :inputs, :state, :outputs
    +  class TextedBasedGame
       
    -    # Calls the methods necessary for the game to run properly.
    +    # Contains methods needed for game to run properly.
    +    # Increments tick count by 1 each time it runs (60 times in a single second)
         def tick
    -      defaults
    -      render
    -      calc
    -      input
    +      default
    +      show_intro
    +      state.engine_tick_count += 1
    +      tick_fire
         end
       
    -    # Sets default values for the zombies and for the player.
    -    # Initialization happens only in the first frame.
    -    def defaults
    -      state.flash_at               ||= 0
    -      state.zombie_min_spawn_rate  ||= 60
    -      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    -      state.zombies                ||= []
    -      state.killed_zombies         ||= []
    +    # Sets default values.
    +    # The ||= ensures that a variable's value is only set to the value following the = sign
    +    # if the value has not already been set before. Intialization happens only in the first frame.
    +    def default
    +      state.engine_tick_count ||= 0
    +      state.active_module     ||= :room
    +      state.fire_progress     ||= 0
    +      state.fire_ready_in     ||= 10
    +      state.previous_fire     ||= :dead
    +      state.fire              ||= :dead
    +    end
       
    -      # Declares player as a new entity and sets its properties.
    -      # The player begins the game in the center of the screen, not moving in any direction.
    -      state.player ||= state.new_entity(:player, { x: 640,
    -                                                 y: 360,
    -                                                 attack_angle: 0,
    -                                                 dx: 0,
    -                                                 dy: 0 })
    +    def show_intro
    +      return unless state.engine_tick_count == 0 # return unless the game just started
    +      set_story_line "awake." # calls set_story_line method, sets to "awake"
         end
       
    -    # Outputs a gray background.
    -    # Calls the methods needed to output the player, zombies, etc onto the screen.
    -    def render
    -      outputs.solids << [grid.rect, 100, 100, 100]
    -      render_zombies
    -      render_killed_zombies
    -      render_player
    -      render_flash
    +    # Sets story line.
    +    def set_story_line story_line
    +      state.story_line    = story_line # story line set to value of parameter
    +      state.active_module = :alert # active module set to alert
         end
       
    -    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    -    def render_zombies
    -      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    -        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    -        z.sprite
    +    # Clears story line.
    +    def clear_storyline
    +      state.active_module = :none # active module set to none
    +      state.story_line = nil # story line is cleared, set to nil (or empty)
    +    end
    +  
    +    # Determines fire progress (how close the fire is to being ready to light).
    +    def tick_fire
    +      return if state.active_module == :alert # return if active module is alert
    +      state.fire_progress += 1 # increment fire progress
    +      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    +      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
    +    end
    +  
    +    # Sets the value of fire (whether it is dead or roaring), and the story line
    +    def light_fire
    +      return unless fire_ready? # returns unless the fire is ready to be lit
    +      state.fire = :roaring # fire is lit, set to roaring
    +      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    +      if state.fire != state.previous_fire
    +        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    +        state.previous_fire = state.fire
           end
         end
       
    -    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    -    def render_killed_zombies
    -      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    -        z.sprite = [z.x,
    -                    z.y,
    -                    4 * 3,
    -                    8 * 3,
    -                    animation_sprite(z, z.death_at), # calls animation_sprite method
    -                    0, # angle
    -                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    -                    # change the value of 30 and see what happens when a zombie is killed
    +    # Checks if the fire is ready to be lit. Returns a boolean value.
    +    def fire_ready?
    +      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    +      # the fire is ready to be lit.
    +      state.fire_progress == state.fire_ready_in
    +    end
       
    -        # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    -        # The slash is tilted 45 degrees from the angle of the player's attack.
    -        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    -        # the slash over the killed zombie's sprite.
    -        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
    +    # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    +    # being able to light a fire.
    +    def light_fire_progress
    +      state.fire_progress.fdiv(10) # float division
    +    end
    +  
    +    # Defines fire as the state.fire variable.
    +    def fire
    +      state.fire
    +    end
    +  
    +    # Sets the title of the room.
    +    def room_title
    +      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    +      return "a room that is lit" # room is lit if the fire is not dead
    +    end
    +  
    +    # Sets the active_module to room.
    +    def go_to_room
    +      state.active_module = :room
    +    end
    +  
    +    # Defines active_module as the state.active_module variable.
    +    def active_module
    +      state.active_module
    +    end
    +  
    +    # Defines story_line as the state.story_line variable.
    +    def story_line
    +      state.story_line
    +    end
    +  
    +    # Update every 60 frames (or every second)
    +    def should_tick?
    +      state.tick_count.mod_zero?(60)
    +    end
    +  
    +    # Sets the value of the game state provider.
    +    def initialize game_state_provider
    +      @game_state_provider = game_state_provider
    +    end
    +  
    +    # Defines the game state.
    +    # Any variable prefixed with an @ symbol is an instance variable.
    +    def state
    +      @game_state_provider.state
    +    end
    +  
    +    # Saves the state of the game in a text file called game_state.txt.
    +    def save
    +      $gtk.serialize_state('game_state.txt', state)
    +    end
    +  
    +    # Loads the game state from the game_state.txt text file.
    +    # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    +    def load
    +      parsed_state = $gtk.deserialize_state('game_state.txt')
    +      if !parsed_state
    +        set_story_line "no game to load. press save first."
    +      else
    +        $gtk.args.state = parsed_state
           end
         end
       
    -    # Outputs the player sprite using the images in the sprites folder.
    -    def render_player
    -      state.player_sprite = [state.player.x,
    -                             state.player.y,
    -                            4 * 3,
    -                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    -      outputs.sprites << state.player_sprite
    +    # Resets the game.
    +    def reset
    +      $gtk.reset
    +    end
    +  end
       
    -      # Outputs a small red square that previews the angles that the player can attack in.
    -      # It can be moved in a perfect circle around the player to show possible movements.
    -      # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    -      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    -                          state.player.y + state.player.attack_angle.vector_y(60),
    -                          3, 3, 255, 0, 0]
    +  class TextedBasedGamePresenter
    +    attr_accessor :state, :outputs, :inputs
    +  
    +    # Creates empty collection called highlights.
    +    # Calls methods necessary to run the game.
    +    def tick
    +      state.layout.highlights ||= []
    +      game.tick if game.should_tick?
    +      render
    +      process_input
         end
       
    -    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    -    def render_flash
    -      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    -      # Transparency gradually changes (or eases) during the 10 frames of flash.
    -      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
    +    # Outputs a label of the tick count (passage of time) and calls all render methods.
    +    def render
    +      outputs.labels << [10, 30, state.tick_count]
    +      render_alert
    +      render_room
    +      render_highlights
         end
       
    -    # Calls all methods necessary for performing calculations.
    -    def calc
    -      calc_spawn_zombie
    -      calc_move_zombies
    -      calc_player
    -      calc_kill_zombie
    +    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    +    def render_alert
    +      return unless game.active_module == :alert
    +  
    +      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    +      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
         end
       
    -    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    -    def calc_spawn_zombie
    -      if state.zombie_spawn_countdown > 0
    -        state.zombie_spawn_countdown -= 1
    -        return
    -      end
    +    def render_room
    +      return unless game.active_module == :room
    +      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
       
    -      # New zombies are created, positioned on the screen, and added to the zombies collection.
    -      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    -        if rand > 0.5
    -          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    -          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    -          # the possible values exceed the screen's scope so zombies appear to be coming from far away
    -        else
    -          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    -          z.y = grid.rect.w.randomize(:ratio) # random y position on screen
    -        end
    -      end
    +      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    +      # that positions it 60 pixels lower than the previous output.
       
    -      # Calls random_spawn_countdown method (determines how fast new zombies appear)
    -      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    -      state.zombie_min_spawn_rate -= 1
    -      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    -      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
    +      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    +      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    +      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    +      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    +      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    +      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
         end
       
    -    # Moves all zombies towards the center of the screen.
    -    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    -    def calc_move_zombies
    -      state.zombies.each do |z| # for each zombie in the collection
    -        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    -        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
    -      end
    -      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
    -    end
    +    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    +    def render_highlights
    +      state.layout.highlights.each do |h| # for each highlight in the collection
    +          h.lifetime -= 1 # decrease the value of its lifetime
    +        end
       
    -    # Calculates the position and movement of the player on the screen.
    -    def calc_player
    -      state.player.x += state.player.dx # changes x based on dx (change in x)
    -      state.player.y += state.player.dy # changes y based on dy (change in y)
    +        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    +          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    +          # transparency changes; divide lifetime by max_lifetime, multiply result by 255
    +        end
       
    -      state.player.dx *= 0.9 # scales dx down
    -      state.player.dy *= 0.9 # scales dy down
    +        # reject highlights from collection that have no remaining lifetime
    +        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
    +    end
       
    -      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    -      # This ensures that the player remains within the screen's scope.
    -      state.player.x = state.player.x.lesser(1280).greater(0)
    -      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
    +    # Checks whether or not a button was clicked.
    +    # Returns a boolean value.
    +    def process_input
    +      button = button_clicked? # calls button_clicked? method
         end
       
    -    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    -    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    -    def calc_kill_zombie
    +    # Returns a boolean value.
    +    # Finds the button that was clicked from the button list and determines what method to call.
    +    # Adds a highlight to the highlights collection.
    +    def button_clicked?
    +      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    +        button = @button_list.find do |k, v| # goes through button_list to find button clicked
    +          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    +        end
    +        return unless button # return unless a button was clicked
    +        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    +        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    +          border = button[1][:primitives].last # sets border definition using value of last key in button list hash
       
    -      # Find all zombies that intersect with the player. They are considered killed.
    -      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    -      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    -      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
    +          # declares each highlight as a new entity, sets properties
    +          state.layout.highlights << state.new_entity(:highlight) do |h|
    +              h.x = border.x
    +              h.y = border.y
    +              h.w = border.w
    +              h.h = border.h
    +              h.max_lifetime = 10
    +              h.lifetime = h.max_lifetime
    +              h.color = [120, 120, 180] # sets color to shade of purple
    +            end
       
    -      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    -        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    -      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    -      end
    +            self.send method_to_call # invoke method identified by symbol
    +          else # otherwise, if self doesn't respond to given method
    +            border = button[1][:primitives].last # sets border definition using value of last key in hash
       
    -      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    -      # Death_at stores the frame a zombie was killed.
    -      killed_this_frame.each do |z|
    -        z.death_at = state.tick_count
    -      end
    +            # declares each highlight as a new entity, sets properties
    +            state.layout.highlights << state.new_entity(:highlight) do |h|
    +              h.x = border.x
    +              h.y = border.y
    +              h.w = border.w
    +              h.h = border.h
    +              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    +              h.lifetime = h.max_lifetime
    +              h.color = [120, 80, 80] # sets color to dark color
    +            end
       
    -      # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    -      # They are rejected if more than 30 frames have passed since their death.
    -      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
    +            # instructions for users on how to add the missing method_to_call to the code
    +            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    +            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    +            puts ""
    +            puts "```"
    +            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    +            puts ""
    +            puts "  def #{method_to_call}"
    +            puts "    puts 'Yay that worked!'"
    +            puts "  end"
    +            puts ""
    +            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    +            puts "```"
    +            puts ""
    +        end
         end
       
    -    # Uses input from the user to move the player around the screen.
    -    def input
    +    # Returns the position of the mouse when it is clicked.
    +    def click_pos
    +      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    +      return inputs.mouse.click.point # returns location of mouse click (coordinates)
    +    end
       
    -      # If the "a" key or left key is pressed, the x position of the player decreases.
    -      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    -      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    -        state.player.x -= 5
    -      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    -        state.player.x += 5
    -      end
    +    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    +    def button id, x, y, text
    +      @button_list[id] ||= { # assigns values to hash keys
    +        id: id,
    +        text: text,
    +        primitives: [
    +          [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    +          [x, y, 300, 50].border,             # sets definition of border
    +        ]
    +      }
       
    -      # If the "w" or up key is pressed, the y position of the player increases.
    -      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    -      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    -        state.player.y += 5
    -      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    -        state.player.y -= 5
    -      end
    +      @button_list[id][:primitives] # returns label and border for buttons
    +    end
       
    -      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    -      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    -      # Attack angle also contributes to the position of red square.
    -      if inputs.mouse.moved
    -        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -      end
    +    # Creates a progress bar (used for lighting the fire) and sets its values.
    +    def progress_bar id, x, y, text, percentage
    +      @button_list[id] = { # assigns values to hash keys
    +        id: id,
    +        text: text,
    +        primitives: [
    +          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    +          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    +          [x, y, 300, 50].border, # sets definition of border
    +        ]
    +      }
       
    -      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5
    -        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set
    -        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position
    -        state.player.dy = state.player.attack_angle.vector_y(25)
    -      end
    +      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    +      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    +      @button_list[id][:primitives][0][2] = 300 * percentage
    +      @button_list[id][:primitives]
         end
       
    -    # Sets the zombie spawn's countdown to a random number.
    -    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)
    -    def random_spawn_countdown minimum
    -      10.randomize(:ratio, :sign).to_i + 60
    +    # Defines the game.
    +    def game
    +      @game
         end
       
    -    # Helps to iterate through the images in the sprites folder by setting the animation index.
    -    # 3 frames is how long to show an image, and 6 is how many images to flip through.
    -    def animation_index at
    -      at.idiv(3).mod(6)
    +    # Initalizes the game and creates an empty list of buttons.
    +    def initialize
    +      @game = TextedBasedGame.new self
    +      @button_list ||= {}
         end
       
    -    # Animates the zombies by using the animation index to go through the images in the sprites folder.
    -    def animation_sprite zombie, at = nil
    -      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created
    -      index = animation_index at
    -      "sprites/zombie-#{index}.png" # string interpolation to iterate through images
    +    # Clears the storyline and takes the user to the room.
    +    def alert_dismiss_clicked
    +      game.clear_storyline
    +      game.go_to_room
         end
    -  end
       
    -  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new
    +    # Lights the fire when the user clicks the "light fire" option.
    +    def light_fire_clicked
    +      game.light_fire
    +    end
       
    -  def tick args
    -    $protect_the_puppies_from_the_zombies.grid    = args.grid
    -    $protect_the_puppies_from_the_zombies.inputs  = args.inputs
    -    $protect_the_puppies_from_the_zombies.state    = args.state
    -    $protect_the_puppies_from_the_zombies.outputs = args.outputs
    -    $protect_the_puppies_from_the_zombies.tick
    -    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."
    -  end
    +    # Saves the game when the user clicks the "save" option.
    +    def save_game_clicked
    +      game.save
    +    end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    +    # Resets the game when the user clicks the "reset" option.
    +    def reset_game_clicked
    +      game.reset
         end
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    # Loads the game when the user clicks the "load" option.
    +    def load_game_clicked
    +      game.load
    +    end
    +  end
    +  
    +  $text_based_rpg = TextedBasedGamePresenter.new
    +  
    +  def tick args
    +    $text_based_rpg.state = args.state
    +    $text_based_rpg.outputs = args.outputs
    +    $text_based_rpg.inputs = args.inputs
    +    $text_based_rpg.tick
       end
     
     #+end_src
     
    -*** Mouse - Mouse Move Paint App - main.rb
    +*** Advanced Audio - Audio Mixer - main.rb
     #+begin_src ruby
    -  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    -  =begin
    -  
    -   APIs listing that haven't been encountered in previous sample apps:
    -  
    -   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
    -  
    -     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    -     puts a.floor()
    -     which would print out 13.
    -     (There is also a ceil method, which returns an integer number greater than or equal to the original
    -     with no decimal. If we had called ceil on the variable a, the result would have been 14.)
    -  
    -   Reminders:
    -  
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -     using their keys.
    -  
    -     For example, if we have a "numbers" hash that stores numbers in English as the
    -     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -     and on it goes.
    -  
    -     Now if we wanted to find the corresponding value of the "one" key, we could say
    -     puts numbers["one"]
    -     which would print "uno" to the console.
    -  
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -     In this sample app, new_entity is used to create a new button that clears the grid.
    -     (Remember, you can use state to define ANY property and it will be retained across frames.)
    -  
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +  # ./samples/07_advanced_audio/01_audio_mixer/app/main.rb
    +  # these are the properties that you can sent on args.audio
    +  def spawn_new_sound args, name, path
    +    # Spawn randomly in an area that won't be covered by UI.
    +    screenx = (rand * 600.0) + 200.0
    +    screeny = (rand * 400.0) + 100.0
       
    -   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +    id = new_sound_id! args
    +    # you can hang anything on the audio hashes you want, so we store the
    +    #  actual screen position in here for convenience.
    +    args.audio[id] = {
    +      name: name,
    +      input: path,
    +      screenx: screenx,
    +      screeny: screeny,
    +      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    +      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    +      z: 0.0,
    +      gain: 1.0,
    +      pitch: 1.0,
    +      looping: true,
    +      paused: false
    +    }
       
    -   - args.outputs.labels: An array. The values in the array generate a label.
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +    args.state.selected = id
    +  end
       
    -   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    +  # these are values you can change on the ~args.audio~ data structure
    +  def input_panel args
    +    return unless args.state.panel
    +    return if args.state.dragging
       
    -  =end
    +    audio_entry = args.audio[args.state.selected]
    +    results = args.state.panel
       
    -  # This sample app shows an empty grid that the user can paint on.
    -  # To paint, the user must keep their mouse presssed and drag it around the grid.
    -  # The "clear" button allows users to clear the grid so they can start over.
    +    if args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.pitch_slider_rect.rect)
    +      audio_entry.pitch = 2.0 * ((args.inputs.mouse.x - results.pitch_slider_rect.x).to_f / (results.pitch_slider_rect.w - 1.0))
    +    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.playtime_slider_rect.rect)
    +      audio_entry.playtime = audio_entry.length_ * ((args.inputs.mouse.x - results.playtime_slider_rect.x).to_f / (results.playtime_slider_rect.w - 1.0))
    +    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.gain_slider_rect.rect)
    +      audio_entry.gain = (args.inputs.mouse.x - results.gain_slider_rect.x).to_f / (results.gain_slider_rect.w - 1.0)
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.looping_checkbox_rect.rect)
    +      audio_entry.looping = !audio_entry.looping
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.paused_checkbox_rect.rect)
    +      audio_entry.paused = !audio_entry.paused
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.delete_button_rect.rect)
    +      args.audio.delete args.state.selected
    +    end
    +  end
       
    -  class PaintApp
    -    attr_accessor :inputs, :state, :outputs, :grid, :args
    +  def render_sources args
    +    args.outputs.primitives << args.audio.keys.map do |k|
    +      s = args.audio[k]
       
    -    # Runs methods necessary for the game to function properly.
    -    def tick
    -      print_title
    -      add_grid
    -      check_click
    -      draw_buttons
    -    end
    +      isselected = (k == args.state.selected)
       
    -    # Prints the title onto the screen by using a label.
    -    # Also separates the title from the grid with a line as a horizontal separator.
    -    def print_title
    -      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    -      outputs.lines << horizontal_separator(660, 0, 1280)
    -    end
    +      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    +      [
    +        [s.screenx, s.screeny, args.state.boxsize, args.state.boxsize, *color].solid,
       
    -    # Sets the starting position, ending position, and color for the horizontal separator.
    -    # The starting and ending positions have the same y values.
    -    def horizontal_separator y, x, x2
    -      [x, y, x2, y, 150, 150, 150]
    +        {
    +          x: s.screenx + args.state.boxsize.half,
    +          y: s.screeny,
    +          text: s.name,
    +          r: 255,
    +          g: 255,
    +          b: 255,
    +          alignment_enum: 1
    +        }.label!
    +      ]
         end
    +  end
       
    -    # Sets the starting position, ending position, and color for the vertical separator.
    -    # The starting and ending positions have the same x values.
    -    def vertical_separator x, y, y2
    -      [x, y, x, y2, 150, 150, 150]
    -    end
    +  def playtime_str t
    +    minutes = (t / 60.0).floor
    +    seconds = t - (minutes * 60.0).to_f
    +    return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]
    +  end
       
    -    # Outputs a border and a grid containing empty squares onto the screen.
    -    def add_grid
    +  def label_with_drop_shadow x, y, text
    +    [
    +      { x: x + 1, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +      { x: x + 2, y: y + 0, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +      { x: x + 0, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 200, g: 200, b: 200 }.label!
    +    ]
    +  end
       
    -      # Sets the x, y, height, and width of the grid.
    -      # There are 31 horizontal lines and 31 vertical lines in the grid.
    -      # Feel free to count them yourself before continuing!
    -      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    -      lines_h = 31
    -      lines_v = 31
    +  def check_box opts = {}
    +    checkbox_template = opts.args.layout.rect(w: 0.5, h: 0.5, col: 2)
    +    final_rect = checkbox_template.center_inside_rect_y(opts.args.layout.rect(row: opts.row, col: opts.col))
    +    color = { r:   0, g:   0, b:   0 }
    +    color = { r: 255, g: 255, b: 255 } if opts.checked
       
    -      # Sets values for the grid's border, grid lines, and filled squares.
    -      # The filled_squares variable is initially set to an empty array.
    -      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    -      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    -      state.filled_squares ||= [] # there are no filled squares until the user fills them in
    +    {
    +      rect: final_rect,
    +      primitives: [
    +        (final_rect.to_solid color)
    +      ]
    +    }
    +  end
       
    -      # Outputs the grid lines, border, and filled squares onto the screen.
    -      outputs.lines.concat state.grid_lines
    -      outputs.borders << state.grid_border
    -      outputs.solids << state.filled_squares
    -    end
    +  def progress_bar opts = {}
    +    outer_rect  = opts.args.layout.rect(row: opts.row, col: opts.col, w: 5, h: 1)
    +    color = opts.percentage * 255
    +    baseline_progress_bar = opts.args
    +                                .layout
    +                                .rect(w: 5, h: 0.5)
       
    -    # Draws the grid by adding in vertical and horizontal separators.
    -    def draw_grid x, y, h, w, lines_h, lines_v
    +    final_rect = baseline_progress_bar.center_inside_rect(outer_rect)
    +    center = final_rect.rect_center_point
       
    -      # The grid starts off empty.
    -      grid = []
    +    {
    +      rect: final_rect,
    +      primitives: [
    +        final_rect.merge(r: color, g: color, b: color, a: 128).solid!,
    +        label_with_drop_shadow(center.x, center.y, opts.text)
    +      ]
    +    }
    +  end
       
    -      # Calculates the placement and adds horizontal lines or separators into the grid.
    -      curr_y = y # start at the bottom of the box
    -      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    -      lines_h.times do
    -        curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    -        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
    -      end
    +  def panel_primitives args, audio_entry
    +    results = { primitives: [] }
       
    -      # Calculates the placement and adds vertical lines or separators into the grid.
    -      curr_x = x # now start at the left of the box
    -      dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid
    -      lines_v.times do
    -        curr_x += dist_x # increment curr_x by the distance between the vertical lines
    -        grid << vertical_separator(curr_x, y + 1, y  + h) # add separator
    -      end
    +    return results unless audio_entry
       
    -      # paint_grid uses a hash to assign values to keys.
    -      state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    -                            "lines_v" => lines_v, "dist_x" => dist_x,
    -                            "dist_y" => dist_y }
    +    # this uses DRGTK's layout apis to layout the controls
    +    # imagine the screen is split into equal cells (24 cells across, 12 cells up and down)
    +    # args.layout.rect returns a hash which we merge values with to create primitives
    +    # using args.layout.rect removes the need for pixel pushing
       
    -      return grid
    -    end
    +    # args.outputs.debug << args.layout.debug_primitives(r: 255, g: 255, b: 255)
       
    -    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    -    # If the mouse is up, the user cannot drag the mouse.
    -    def check_click
    -      if inputs.mouse.down #is mouse up or down?
    -        state.mouse_held = true # mouse is being held down
    -      elsif inputs.mouse.up # if mouse is up
    -      state.mouse_held = false # mouse is not being held down or dragged
    -        state.mouse_dragging = false
    -      end
    +    white_color = { r: 255, g: 255, b: 255 }
    +    label_style = white_color.merge(vertical_alignment_enum: 1)
       
    -      if state.mouse_held &&    # mouse needs to be down
    -        !inputs.mouse.click &&     # must not be first click
    -        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    -        state.mouse_dragging = true
    -      end
    +    # panel background
    +    results.primitives << args.layout.rect(row: 0, col: 0, w: 7, h: 6, include_col_gutter: true, include_row_gutter: true)
    +                                     .border!(r: 255, g: 255, b: 255)
       
    -      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    -      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    -        search_lines(inputs.mouse.click.point, :click)
    +    # title
    +    results.primitives << args.layout.point(row: 0, col: 3.5, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text:           "Source #{args.state.selected} (#{args.audio[args.state.selected].name})",
    +                                            size_enum:      3,
    +                                            alignment_enum: 1)
       
    -      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    -      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    -        search_lines(inputs.mouse.position, :drag)
    -      end
    -    end
    +    # seperator line
    +    results.primitives << args.layout.rect(row: 1, col: 0, w: 7, h: 0)
    +                                     .line!(white_color)
       
    -    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    -    def search_lines (point, input_type)
    -      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    -      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
    +    # screen location
    +    results.primitives << args.layout.point(row: 1.0, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "screen:")
       
    -      # Remove code following the .floor and see what happens when you try to fill in grid squares
    -      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    -      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
    +    results.primitives << args.layout.point(row: 1.0, col: 2, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "(#{audio_entry.screenx.to_i}, #{audio_entry.screeny.to_i})")
       
    -      point.x += state.paint_grid["x"]
    -      point.y += state.paint_grid["y"]
    +    # position
    +    results.primitives << args.layout.point(row: 1.5, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "position:")
       
    -      # Sets definition of a grid box, meaning its x, y, width, and height.
    -      # Floor is called on the point.x and point.y variables.
    -      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    -      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
    +    results.primitives << args.layout.point(row: 1.5, col: 2, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "(#{audio_entry[:x].round(5).to_s[0..6]}, #{audio_entry[:y].round(5).to_s[0..6]})")
       
    -      if input_type == :click # if user clicks their mouse
    -        if state.filled_squares.include? grid_box # if grid box is already filled in
    -          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    -        else
    -          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    -        end
    -      elsif input_type == :drag # if user drags mouse
    -        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    -          state.filled_squares << grid_box # the box is filled in and added to filled_squares
    -        end
    -      end
    -    end
    +    results.primitives << args.layout.point(row: 2.0, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "pitch:")
       
    -    # Creates and outputs a "Clear" button on the screen using a label and a border.
    -    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    -    def draw_buttons
    -      x, y, w, h = 390, 50, 240, 50
    -      state.clear_button        ||= state.new_entity(:button_with_fade)
    +    results.pitch_slider_rect = progress_bar(row: 2.0, col: 2,
    +                                             percentage: audio_entry.pitch / 2.0,
    +                                             text: "#{audio_entry.pitch.to_sf}",
    +                                             args: args)
       
    -      # The x and y positions are set to display the label in the center of the button.
    -      # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    -      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    -      state.clear_button.border ||= [x, y, w, h]
    +    results.primitives << results.pitch_slider_rect.primitives
       
    -      # If the mouse is clicked inside the borders of the clear button,
    -      # the filled_squares collection is emptied and the squares are cleared.
    -      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    -        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    -        state.filled_squares.clear
    -        inputs.mouse.previous_click = nil
    -      end
    +    results.primitives << args.layout.point(row: 2.5, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "playtime:")
       
    -      outputs.labels << state.clear_button.label
    -      outputs.borders << state.clear_button.border
    +    results.playtime_slider_rect = progress_bar(args: args,
    +                                                row:  2.5,
    +                                                col:  2,
    +                                                percentage: audio_entry.playtime / audio_entry.length_,
    +                                                text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")
       
    -      # When the clear button is clicked, the color of the button changes
    -      # and the transparency changes, as well. If you change the time from
    -      # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    -      if state.clear_button.clicked_at
    -        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    -      end
    -    end
    -  end
    +    results.primitives << results.playtime_slider_rect.primitives
       
    -  $paint_app = PaintApp.new
    +    results.primitives << args.layout.point(row: 3.0, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "gain:")
       
    -  def tick args
    -    $paint_app.inputs = args.inputs
    -    $paint_app.state = args.state
    -    $paint_app.grid = args.grid
    -    $paint_app.args = args
    -    $paint_app.outputs = args.outputs
    -    $paint_app.tick
    -    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    -  end
    +    results.gain_slider_rect = progress_bar(args: args,
    +                                            row:  3.0,
    +                                            col:  2,
    +                                            percentage: audio_entry.gain,
    +                                            text: "#{audio_entry.gain.to_sf}")
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    -    end
    +    results.primitives << results.gain_slider_rect.primitives
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -  end
    -
    -#+end_src
    -
    -*** Mouse - Coordinate Systems - main.rb
    -#+begin_src ruby
    -  # ./samples/05_mouse/04_coordinate_systems/app/main.rb
    -  =begin
       
    -   APIs listing that haven't been encountered in previous sample apps:
    +    results.primitives << args.layout.point(row: 3.5, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "looping:")
       
    -   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    -     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    -     position to know the mouse's coordinates.
    -     For more information about the mouse, go to mygame/documentation/07-mouse.md.
    +    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
       
    -   Reminders:
    +    results.looping_checkbox_rect = check_box(args: args, row: 3.5, col: 2, checked: audio_entry.looping)
    +    results.primitives << results.looping_checkbox_rect.primitives
       
    -   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +    results.primitives << args.layout.point(row: 4.0, col: 0, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "paused:")
       
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
       
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +    results.paused_checkbox_rect = check_box(args: args, row: 4.0, col: 2, checked: !audio_entry.paused)
    +    results.primitives << results.paused_checkbox_rect.primitives
       
    -     In this sample app, string interpolation is used to show the current position of the mouse
    -     in a label.
    +    results.delete_button_rect = { rect: args.layout.rect(row: 5, col: 0, w: 7, h: 1) }
       
    -   - args.outputs.labels: An array that generates a label.
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +    results.primitives << results.delete_button_rect.to_solid(r: 180)
       
    -   - args.outputs.solids: An array that generates a solid.
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +    results.primitives << args.layout.point(row: 5, col: 3.5, row_anchor: 0.5)
    +                                     .merge(label_style)
    +                                     .merge(text: "DELETE", alignment_enum: 1)
       
    -   - args.outputs.lines: An array that generates a line.
    -     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    -     For more information about lines, go to mygame/documentation/04-lines.md.
    +    return results
    +  end
       
    -  =end
    +  def render_panel args
    +    args.state.panel = nil
    +    audio_entry = args.audio[args.state.selected]
    +    return unless audio_entry
       
    -  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    -  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    -  # four quadrants by pressing the button.
    +    mouse_down = (args.state.mouse_held >= 0)
    +    args.state.panel = panel_primitives args, audio_entry
    +    args.outputs.primitives << args.state.panel.primitives
    +  end
    +  
    +  def new_sound_id! args
    +    args.state.sound_id ||= 0
    +    args.state.sound_id  += 1
    +    args.state.sound_id
    +  end
    +  
    +  def render_launcher args
    +    args.outputs.primitives << args.state.spawn_sound_buttons.map(&:primitives)
    +  end
    +  
    +  def render_ui args
    +    render_launcher args
    +    render_panel args
    +  end
       
       def tick args
    +    defaults args
    +    render args
    +    input args
    +  end
       
    -    # The addition and subtraction in the first two parameters of the label and solid
    -    # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    -    pos = args.inputs.mouse.position # stores coordinates of mouse's position
    -    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    -    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
    +  def input args
    +    if !args.audio[args.state.selected]
    +      args.state.selected = nil
    +      args.state.dragging = nil
    +    end
       
    -    button = [0, 0, 370, 50] # sets definition of toggle button
    -    args.outputs.borders << button # outputs button as border (not filled in)
    -    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    -    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    -    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
    +    # spawn button and node interaction
    +    if args.inputs.mouse.click
    +      spawn_sound_button = args.state.spawn_sound_buttons.find { |b| args.inputs.mouse.inside_rect? b.rect }
       
    -    if args.inputs.mouse.click # if the user clicks the mouse
    -      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    -      if pos.inside_rect? button # if the click occurred inside the button
    -        if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    -          args.grid.origin_center! # origin will be shown in center
    -        else
    -          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
    -        end
    +      audio_click_key, audio_click_value = args.audio.find do |k, v|
    +        args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
    +      end
    +  
    +      if spawn_sound_button
    +        args.state.selected = nil
    +        spawn_new_sound args, spawn_sound_button.name, spawn_sound_button.path
    +      elsif audio_click_key
    +        args.state.selected = audio_click_key
           end
         end
       
    -    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
    +    if args.state.mouse_state == :held && args.state.selected
    +      v = args.audio[args.state.selected]
    +      if args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
    +        args.state.dragging = args.state.selected
    +      end
    +  
    +      if args.state.dragging
    +        s = args.audio[args.state.selected]
    +        # you can hang anything on the audio hashes you want, so we store the
    +        #  actual screen position so it doesn't scale weirdly vs your mouse.
    +        s.screenx = args.inputs.mouse.x - (args.state.boxsize / 2)
    +        s.screeny = args.inputs.mouse.y - (args.state.boxsize / 2)
    +  
    +        s.screeny = 50 if s.screeny < 50
    +        s.screeny = (719 - args.state.boxsize) if s.screeny > (719 - args.state.boxsize)
    +        s.screenx = 0 if s.screenx < 0
    +        s.screenx = (1279 - args.state.boxsize) if s.screenx > (1279 - args.state.boxsize)
    +  
    +        s.x = ((s.screenx / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    +        s.y = ((s.screeny / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    +      end
    +    elsif args.state.mouse_state == :released
    +      args.state.dragging = nil
    +    end
    +  
    +    input_panel args
       end
       
    -  def tick_instructions args, text, y = 715
    -    return if args.state.key_event_occurred
    -    if args.inputs.mouse.click ||
    -       args.inputs.keyboard.directional_vector ||
    -       args.inputs.keyboard.key_down.enter ||
    -       args.inputs.keyboard.key_down.escape
    -      args.state.key_event_occurred = true
    +  def defaults args
    +    args.state.mouse_state      ||= :released
    +    args.state.dragging_source  ||= false
    +    args.state.selected         ||= 0
    +    args.state.next_sound_index ||= 0
    +    args.state.boxsize          ||= 30
    +    args.state.sound_files      ||= [
    +      { name: :tada,   path: "sounds/tada.wav"   },
    +      { name: :splash, path: "sounds/splash.wav" },
    +      { name: :drum,   path: "sounds/drum.wav"   },
    +      { name: :spring, path: "sounds/spring.wav" },
    +      { name: :music,  path: "sounds/music.ogg"  }
    +    ]
    +  
    +    # generate buttons based off the sound collection above
    +    args.state.spawn_sound_buttons ||= begin
    +      # create a group of buttons
    +      # column centered (using col_offset to calculate the column offset)
    +      # where each item is 2 columns apart
    +      rects = args.layout.rect_group row:   11,
    +                                     col_offset: {
    +                                       count: args.state.sound_files.length,
    +                                       w:     2
    +                                     },
    +                                     dcol:  2,
    +                                     w:     2,
    +                                     h:     1,
    +                                     group: args.state.sound_files
    +  
    +      # now that you have the rects
    +      # construct the metadata for the buttons
    +      rects.map do |rect|
    +        {
    +          rect: rect,
    +          name: rect.name,
    +          path: rect.path,
    +          primitives: [
    +            rect.to_border(r: 255, g: 255, b: 255),
    +            rect.to_label(x: rect.center_x,
    +                          y: rect.center_y,
    +                          text: "#{rect.name}",
    +                          alignment_enum: 1,
    +                          vertical_alignment_enum: 1,
    +                          r: 255, g: 255, b: 255)
    +          ]
    +        }
    +      end
         end
       
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    if args.inputs.mouse.up
    +      args.state.mouse_state = :released
    +      args.state.dragging_source = false
    +    elsif args.inputs.mouse.down
    +      args.state.mouse_state = :held
    +    end
    +  
    +    args.outputs.background_color = [ 0, 0, 0, 255 ]
    +  end
    +  
    +  def render args
    +    render_ui args
    +    render_sources args
       end
     
     #+end_src
     
    -*** Save Load - Save Load Game - main.rb
    +*** Advanced Audio - Audio Mixer - server_ip_address.txt
     #+begin_src ruby
    -  # ./samples/06_save_load/01_save_load_game/app/main.rb
    -  =begin
    +  # ./samples/07_advanced_audio/01_audio_mixer/app/server_ip_address.txt
    +  192.168.1.65
    +#+end_src
    +
    +*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt
    +#+begin_src ruby
    +  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
    +  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
    +  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
       
    -   APIs listing that haven't been encountered in previous sample apps:
    +  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
    +  teamid=
    +  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
    +  appid=
    +  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
    +  appname=
    +
    +#+end_src
    +
    +*** Advanced Audio - Sound Synthesis - main.rb
    +#+begin_src ruby
    +  # ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb
    +  begin # region: top level tick methods
    +    def tick args
    +      defaults args
    +      render args
    +      input args
    +      process_audio_queue args
    +    end
       
    -   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    -     because with a given symbol name, you can refer to the same object throughout
    -     a Ruby program.
    +    def defaults args
    +      args.state.sine_waves      ||= {}
    +      args.state.square_waves    ||= {}
    +      args.state.saw_tooth_waves ||= {}
    +      args.state.triangle_waves  ||= {}
    +      args.state.audio_queue     ||= []
    +      args.state.buttons         ||= [
    +        (frequency_buttons args),
    +        (sine_wave_note_buttons args),
    +        (bell_buttons args),
    +        (square_wave_note_buttons args),
    +        (saw_tooth_wave_note_buttons args),
    +        (triangle_wave_note_buttons args),
    +      ].flatten
    +    end
       
    -     In this sample app, we're using symbols for our buttons. We have buttons that
    -     light fires, save, load, etc. Each of these buttons has a distinct symbol like
    -     :light_fire, :save_game, :load_game, etc.
    +    def render args
    +      args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    +      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    +      args.outputs.labels  << args.layout
    +                                .rect(row: 0, col: 11.5)
    +                                .yield_self { |r| r.merge y: r.y + r.h }
    +                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    +                                       alignment_enum: 1)
    +    end
       
    -   - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    -     if it does not already exist.
    -     For example,
    -     'car'.to_sym
    -     would return the symbol :car.
       
    -   - last: Returns the last element of an array.
    +    def input args
    +      args.state.buttons.each do |b|
    +        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    +          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    +          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    +          send b[:method_to_call], args, b
    +        end
    +      end
       
    -   Reminders:
    +      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    +        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    +      end
    +    end
       
    -   - num1.lesser(num2): finds the lower value of the given options.
    -     For example, in the statement
    -     a = 4.lesser(3)
    -     3 has a lower value than 4, which means that the value of a would be set to 3,
    -     but if the statement had been
    -     a = 4.lesser(5)
    -     4 has a lower value than 5, which means that the value of a would be set to 4.
    +    def process_audio_queue args
    +      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    +      args.state.audio_queue -= to_queue
    +      to_queue.each { |a| args.audio[a[:id]] = a }
       
    -   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    -     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    +      args.audio.find_all { |k, v| v[:decay_rate] }
    +        .each     { |k, v| v[:gain] -= v[:decay_rate] }
       
    -   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +      sounds_to_stop = args.audio
    +                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    +                         .map { |k, v| k }
       
    -   - args.outputs.labels: An array. Values generate a label.
    -     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -     For more information, go to mygame/documentation/02-labels.md.
    +      sounds_to_stop.each { |k| args.audio.delete k }
    +    end
    +  end
       
    -   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -     with at least four values is considered a rect. The inside_rect? function returns true
    -     or false depending on if the point is inside the rect.
    +  begin # region: button definitions, ui layout, callback functions
    +    def button args, opts
    +      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
       
    -  =end
    +      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
       
    -  # This code allows users to perform different tasks, such as saving and loading the game.
    -  # Users also have options to reset the game and light a fire.
    +      label_offset_x = 5
    +      label_offset_y = 30
       
    -  class TextedBasedGame
    +      button_def[:label]  = button_def[:rect].merge text: opts[:text],
    +                                                    size_enum: -2.5,
    +                                                    x: button_def[:rect].x + label_offset_x,
    +                                                    y: button_def[:rect].y + label_offset_y
       
    -    # Contains methods needed for game to run properly.
    -    # Increments tick count by 1 each time it runs (60 times in a single second)
    -    def tick
    -      default
    -      show_intro
    -      state.engine_tick_count += 1
    -      tick_fire
    +      button_def
         end
       
    -    # Sets default values.
    -    # The ||= ensures that a variable's value is only set to the value following the = sign
    -    # if the value has not already been set before. Intialization happens only in the first frame.
    -    def default
    -      state.engine_tick_count ||= 0
    -      state.active_module     ||= :room
    -      state.fire_progress     ||= 0
    -      state.fire_ready_in     ||= 10
    -      state.previous_fire     ||= :dead
    -      state.fire              ||= :dead
    +    def play_sine_wave args, sender
    +      queue_sine_wave args,
    +                      frequency: sender[:frequency],
    +                      duration: 1.seconds,
    +                      fade_out: true
         end
       
    -    def show_intro
    -      return unless state.engine_tick_count == 0 # return unless the game just started
    -      set_story_line "awake." # calls set_story_line method, sets to "awake"
    +    def play_note args, sender
    +      method_to_call = :queue_sine_wave
    +      method_to_call = :queue_square_wave    if sender[:type] == :square
    +      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    +      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    +      method_to_call = :queue_bell           if sender[:type] == :bell
    +  
    +      send method_to_call, args,
    +           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    +           duration: 1.seconds,
    +           fade_out: true
         end
       
    -    # Sets story line.
    -    def set_story_line story_line
    -      state.story_line    = story_line # story line set to value of parameter
    -      state.active_module = :alert # active module set to alert
    +    def frequency_buttons args
    +      [
    +        (button args,
    +                row: 4.0, col: 0, text: "300hz",
    +                frequency: 300,
    +                method_to_call: :play_sine_wave),
    +        (button args,
    +                row: 5.0, col: 0, text: "400hz",
    +                frequency: 400,
    +                method_to_call: :play_sine_wave),
    +        (button args,
    +                row: 6.0, col: 0, text: "500hz",
    +                frequency: 500,
    +                method_to_call: :play_sine_wave),
    +      ]
         end
       
    -    # Clears story line.
    -    def clear_storyline
    -      state.active_module = :none # active module set to none
    -      state.story_line = nil # story line is cleared, set to nil (or empty)
    +    def sine_wave_note_buttons args
    +      [
    +        (button args,
    +                row: 1.5, col: 2, text: "Sine C4",
    +                note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 2.5, col: 2, text: "Sine D4",
    +                note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 3.5, col: 2, text: "Sine E4",
    +                note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 4.5, col: 2, text: "Sine F4",
    +                note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 5.5, col: 2, text: "Sine G4",
    +                note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 6.5, col: 2, text: "Sine A5",
    +                note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 7.5, col: 2, text: "Sine B5",
    +                note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    +        (button args,
    +                row: 8.5, col: 2, text: "Sine C5",
    +                note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    +      ]
         end
       
    -    # Determines fire progress (how close the fire is to being ready to light).
    -    def tick_fire
    -      return if state.active_module == :alert # return if active module is alert
    -      state.fire_progress += 1 # increment fire progress
    -      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    -      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
    +    def square_wave_note_buttons args
    +      [
    +        (button args,
    +                row: 1.5, col: 6, text: "Square C4",
    +                note: :c, octave: 4, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 2.5, col: 6, text: "Square D4",
    +                note: :d, octave: 4, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 3.5, col: 6, text: "Square E4",
    +                note: :e, octave: 4, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 4.5, col: 6, text: "Square F4",
    +                note: :f, octave: 4, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 5.5, col: 6, text: "Square G4",
    +                note: :g, octave: 4, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 6.5, col: 6, text: "Square A5",
    +                note: :a, octave: 5, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 7.5, col: 6, text: "Square B5",
    +                note: :b, octave: 5, type: :square, method_to_call: :play_note),
    +        (button args,
    +                row: 8.5, col: 6, text: "Square C5",
    +                note: :c, octave: 5, type: :square, method_to_call: :play_note),
    +      ]
    +    end
    +    def saw_tooth_wave_note_buttons args
    +      [
    +        (button args,
    +                row: 1.5, col: 8, text: "Saw C4",
    +                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 2.5, col: 8, text: "Saw D4",
    +                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 3.5, col: 8, text: "Saw E4",
    +                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 4.5, col: 8, text: "Saw F4",
    +                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 5.5, col: 8, text: "Saw G4",
    +                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 6.5, col: 8, text: "Saw A5",
    +                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 7.5, col: 8, text: "Saw B5",
    +                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +        (button args,
    +                row: 8.5, col: 8, text: "Saw C5",
    +                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +      ]
         end
       
    -    # Sets the value of fire (whether it is dead or roaring), and the story line
    -    def light_fire
    -      return unless fire_ready? # returns unless the fire is ready to be lit
    -      state.fire = :roaring # fire is lit, set to roaring
    -      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    -      if state.fire != state.previous_fire
    -        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    -        state.previous_fire = state.fire
    +    def triangle_wave_note_buttons args
    +      [
    +        (button args,
    +                row: 1.5, col: 10, text: "Triangle C4",
    +                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 2.5, col: 10, text: "Triangle D4",
    +                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 3.5, col: 10, text: "Triangle E4",
    +                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 4.5, col: 10, text: "Triangle F4",
    +                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 5.5, col: 10, text: "Triangle G4",
    +                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 6.5, col: 10, text: "Triangle A5",
    +                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 7.5, col: 10, text: "Triangle B5",
    +                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    +        (button args,
    +                row: 8.5, col: 10, text: "Triangle C5",
    +                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    +      ]
    +    end
    +  
    +    def bell_buttons args
    +      [
    +        (button args,
    +                row: 1.5, col: 4, text: "Bell C4",
    +                note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 2.5, col: 4, text: "Bell D4",
    +                note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 3.5, col: 4, text: "Bell E4",
    +                note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 4.5, col: 4, text: "Bell F4",
    +                note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 5.5, col: 4, text: "Bell G4",
    +                note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 6.5, col: 4, text: "Bell A5",
    +                note: :a, octave: 5, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 7.5, col: 4, text: "Bell B5",
    +                note: :b, octave: 5, type: :bell, method_to_call: :play_note),
    +        (button args,
    +                row: 8.5, col: 4, text: "Bell C5",
    +                note: :c, octave: 5, type: :bell, method_to_call: :play_note),
    +      ]
    +    end
    +  end
    +  
    +  begin # region: wave generation
    +    begin # sine wave
    +      def defaults_sine_wave_for
    +        { frequency: 440, sample_rate: 48000 }
    +      end
    +  
    +      def sine_wave_for opts = {}
    +        opts = defaults_sine_wave_for.merge opts
    +        frequency   = opts[:frequency]
    +        sample_rate = opts[:sample_rate]
    +        period_size = (sample_rate.fdiv frequency).ceil
    +        period_size.map_with_index do |i|
    +          Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)
    +        end.to_a
    +      end
    +  
    +      def defaults_queue_sine_wave
    +        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +      end
    +  
    +      def queue_sine_wave args, opts = {}
    +        opts        = defaults_queue_sine_wave.merge opts
    +        frequency   = opts[:frequency]
    +        sample_rate = 48000
    +  
    +        sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate
    +        args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate
    +  
    +        proc = lambda do
    +          generate_audio_data args.state.sine_waves[frequency], sample_rate
    +        end
    +  
    +        audio_state = new_audio_state args, opts
    +        audio_state[:input] = [1, sample_rate, proc]
    +        queue_audio args, audio_state: audio_state, wave: sine_wave
           end
         end
       
    -    # Checks if the fire is ready to be lit. Returns a boolean value.
    -    def fire_ready?
    -      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    -      # the fire is ready to be lit.
    -      state.fire_progress == state.fire_ready_in
    -    end
    +    begin # region: square wave
    +      def defaults_square_wave_for
    +        { frequency: 440, sample_rate: 48000 }
    +      end
       
    -    # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    -    # being able to light a fire.
    -    def light_fire_progress
    -      state.fire_progress.fdiv(10) # float division
    -    end
    +      def square_wave_for opts = {}
    +        opts = defaults_square_wave_for.merge opts
    +        sine_wave = sine_wave_for opts
    +        sine_wave.map do |v|
    +          if v >= 0
    +            1.0
    +          else
    +            -1.0
    +          end
    +        end.to_a
    +      end
       
    -    # Defines fire as the state.fire variable.
    -    def fire
    -      state.fire
    -    end
    +      def defaults_queue_square_wave
    +        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +      end
       
    -    # Sets the title of the room.
    -    def room_title
    -      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    -      return "a room that is lit" # room is lit if the fire is not dead
    -    end
    +      def queue_square_wave args, opts = {}
    +        opts        = defaults_queue_square_wave.merge opts
    +        frequency   = opts[:frequency]
    +        sample_rate = 48000
       
    -    # Sets the active_module to room.
    -    def go_to_room
    -      state.active_module = :room
    -    end
    +        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    +        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
       
    -    # Defines active_module as the state.active_module variable.
    -    def active_module
    -      state.active_module
    -    end
    +        proc = lambda do
    +          generate_audio_data args.state.square_waves[frequency], sample_rate
    +        end
       
    -    # Defines story_line as the state.story_line variable.
    -    def story_line
    -      state.story_line
    +        audio_state = new_audio_state args, opts
    +        audio_state[:input] = [1, sample_rate, proc]
    +        queue_audio args, audio_state: audio_state, wave: square_wave
    +      end
         end
       
    -    # Update every 60 frames (or every second)
    -    def should_tick?
    -      state.tick_count.mod_zero?(60)
    -    end
    +    begin # region: saw tooth wave
    +      def defaults_saw_tooth_wave_for
    +        { frequency: 440, sample_rate: 48000 }
    +      end
       
    -    # Sets the value of the game state provider.
    -    def initialize game_state_provider
    -      @game_state_provider = game_state_provider
    -    end
    +      def saw_tooth_wave_for opts = {}
    +        opts = defaults_saw_tooth_wave_for.merge opts
    +        sine_wave = sine_wave_for opts
    +        period_size = sine_wave.length
    +        sine_wave.map_with_index do |v, i|
    +          (((i % period_size).fdiv period_size) * 2) - 1
    +        end
    +      end
       
    -    # Defines the game state.
    -    # Any variable prefixed with an @ symbol is an instance variable.
    -    def state
    -      @game_state_provider.state
    -    end
    +      def defaults_queue_saw_tooth_wave
    +        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +      end
       
    -    # Saves the state of the game in a text file called game_state.txt.
    -    def save
    -      $gtk.serialize_state('game_state.txt', state)
    -    end
    +      def queue_saw_tooth_wave args, opts = {}
    +        opts        = defaults_queue_saw_tooth_wave.merge opts
    +        frequency   = opts[:frequency]
    +        sample_rate = 48000
       
    -    # Loads the game state from the game_state.txt text file.
    -    # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    -    def load
    -      parsed_state = $gtk.deserialize_state('game_state.txt')
    -      if !parsed_state
    -        set_story_line "no game to load. press save first."
    -      else
    -        $gtk.args.state = parsed_state
    +        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +  
    +        proc = lambda do
    +          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    +        end
    +  
    +        audio_state = new_audio_state args, opts
    +        audio_state[:input] = [1, sample_rate, proc]
    +        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
           end
         end
       
    -    # Resets the game.
    -    def reset
    -      $gtk.reset
    -    end
    -  end
    +    begin # region: triangle wave
    +      def defaults_triangle_wave_for
    +        { frequency: 440, sample_rate: 48000 }
    +      end
       
    -  class TextedBasedGamePresenter
    -    attr_accessor :state, :outputs, :inputs
    +      def triangle_wave_for opts = {}
    +        opts = defaults_saw_tooth_wave_for.merge opts
    +        sine_wave = sine_wave_for opts
    +        period_size = sine_wave.length
    +        sine_wave.map_with_index do |v, i|
    +          ratio = (i.fdiv period_size)
    +          if ratio <= 0.5
    +            (ratio * 4) - 1
    +          else
    +            ratio -= 0.5
    +            1 - (ratio * 4)
    +          end
    +        end
    +      end
       
    -    # Creates empty collection called highlights.
    -    # Calls methods necessary to run the game.
    -    def tick
    -      state.layout.highlights ||= []
    -      game.tick if game.should_tick?
    -      render
    -      process_input
    -    end
    +      def defaults_queue_triangle_wave
    +        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +      end
       
    -    # Outputs a label of the tick count (passage of time) and calls all render methods.
    -    def render
    -      outputs.labels << [10, 30, state.tick_count]
    -      render_alert
    -      render_room
    -      render_highlights
    -    end
    +      def queue_triangle_wave args, opts = {}
    +        opts        = defaults_queue_triangle_wave.merge opts
    +        frequency   = opts[:frequency]
    +        sample_rate = 48000
       
    -    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    -    def render_alert
    -      return unless game.active_module == :alert
    +        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    +        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
       
    -      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    -      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
    +        proc = lambda do
    +          generate_audio_data args.state.triangle_waves[frequency], sample_rate
    +        end
    +  
    +        audio_state = new_audio_state args, opts
    +        audio_state[:input] = [1, sample_rate, proc]
    +        queue_audio args, audio_state: audio_state, wave: triangle_wave
    +      end
         end
       
    -    def render_room
    -      return unless game.active_module == :room
    -      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
    +    begin # region: bell
    +      def defaults_queue_bell
    +        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    +      end
       
    -      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    -      # that positions it 60 pixels lower than the previous output.
    +      def queue_bell args, opts = {}
    +        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
    +      end
       
    -      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    -      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    -      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    -      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    -      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    -      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
    -    end
    +      def bell_harmonics
    +        [
    +          { frequency_ratio: 0.5, duration_ratio: 1.00 },
    +          { frequency_ratio: 1.0, duration_ratio: 0.80 },
    +          { frequency_ratio: 2.0, duration_ratio: 0.60 },
    +          { frequency_ratio: 3.0, duration_ratio: 0.40 },
    +          { frequency_ratio: 4.2, duration_ratio: 0.25 },
    +          { frequency_ratio: 5.4, duration_ratio: 0.20 },
    +          { frequency_ratio: 6.8, duration_ratio: 0.15 }
    +        ]
    +      end
       
    -    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    -    def render_highlights
    -      state.layout.highlights.each do |h| # for each highlight in the collection
    -          h.lifetime -= 1 # decrease the value of its lifetime
    -        end
    +      def defaults_bell_to_sine_waves
    +        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    +      end
       
    -        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    -          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    -          # transparency changes; divide lifetime by max_lifetime, multiply result by 255
    +      def bell_to_sine_waves opts = {}
    +        opts = defaults_bell_to_sine_waves.merge opts
    +        bell_harmonics.map do |b|
    +          {
    +            frequency: opts[:frequency] * b[:frequency_ratio],
    +            duration:  opts[:duration] * b[:duration_ratio],
    +            queue_in:  opts[:queue_in],
    +            gain:      (1.fdiv bell_harmonics.length),
    +            fade_out:  true
    +          }
             end
    -  
    -        # reject highlights from collection that have no remaining lifetime
    -        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
    +      end
         end
       
    -    # Checks whether or not a button was clicked.
    -    # Returns a boolean value.
    -    def process_input
    -      button = button_clicked? # calls button_clicked? method
    -    end
    +    begin # audio entity construction
    +      def generate_audio_data sine_wave, sample_rate
    +        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    +        copy_count  = (sample_size.fdiv sine_wave.length).ceil
    +        sine_wave * copy_count
    +      end
       
    -    # Returns a boolean value.
    -    # Finds the button that was clicked from the button list and determines what method to call.
    -    # Adds a highlight to the highlights collection.
    -    def button_clicked?
    -      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    -        button = @button_list.find do |k, v| # goes through button_list to find button clicked
    -          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    -        end
    -        return unless button # return unless a button was clicked
    -        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    -        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    -          border = button[1][:primitives].last # sets border definition using value of last key in button list hash
    +      def defaults_new_audio_state
    +        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +      end
       
    -          # declares each highlight as a new entity, sets properties
    -          state.layout.highlights << state.new_entity(:highlight) do |h|
    -              h.x = border.x
    -              h.y = border.y
    -              h.w = border.w
    -              h.h = border.h
    -              h.max_lifetime = 10
    -              h.lifetime = h.max_lifetime
    -              h.color = [120, 120, 180] # sets color to shade of purple
    -            end
    +      def new_audio_state args, opts = {}
    +        opts        = defaults_new_audio_state.merge opts
    +        decay_rate  = 0
    +        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    +        frequency   = opts[:frequency]
    +        sample_rate = 48000
       
    -            self.send method_to_call # invoke method identified by symbol
    -          else # otherwise, if self doesn't respond to given method
    -            border = button[1][:primitives].last # sets border definition using value of last key in hash
    +        {
    +          id:               (new_id! args),
    +          frequency:        frequency,
    +          sample_rate:      48000,
    +          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    +          gain:             opts[:gain].to_f,
    +          queue_at:         args.state.tick_count + opts[:queue_in],
    +          decay_rate:       decay_rate,
    +          pitch:            1.0,
    +          looping:          true,
    +          paused:           false
    +        }
    +      end
       
    -            # declares each highlight as a new entity, sets properties
    -            state.layout.highlights << state.new_entity(:highlight) do |h|
    -              h.x = border.x
    -              h.y = border.y
    -              h.w = border.w
    -              h.h = border.h
    -              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    -              h.lifetime = h.max_lifetime
    -              h.color = [120, 80, 80] # sets color to dark color
    -            end
    +      def queue_audio args, opts = {}
    +        graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    +        args.state.audio_queue << opts[:audio_state]
    +      end
       
    -            # instructions for users on how to add the missing method_to_call to the code
    -            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    -            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    -            puts ""
    -            puts "```"
    -            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    -            puts ""
    -            puts "  def #{method_to_call}"
    -            puts "    puts 'Yay that worked!'"
    -            puts "  end"
    -            puts ""
    -            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    -            puts "```"
    -            puts ""
    -        end
    -    end
    +      def new_id! args
    +        args.state.audio_id ||= 0
    +        args.state.audio_id  += 1
    +      end
       
    -    # Returns the position of the mouse when it is clicked.
    -    def click_pos
    -      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    -      return inputs.mouse.click.point # returns location of mouse click (coordinates)
    -    end
    +      def graph_wave args, wave, frequency
    +        if args.state.tick_count != args.state.graphed_at
    +          args.outputs.static_lines.clear
    +          args.outputs.static_sprites.clear
    +        end
       
    -    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    -    def button id, x, y, text
    -      @button_list[id] ||= { # assigns values to hash keys
    -        id: id,
    -        text: text,
    -        primitives: [
    -          [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    -          [x, y, 300, 50].border,             # sets definition of border
    -        ]
    -      }
    +        wave = wave
       
    -      @button_list[id][:primitives] # returns label and border for buttons
    -    end
    +        r, g, b = frequency.to_i % 85,
    +                  frequency.to_i % 170,
    +                  frequency.to_i % 255
       
    -    # Creates a progress bar (used for lighting the fire) and sets its values.
    -    def progress_bar id, x, y, text, percentage
    -      @button_list[id] = { # assigns values to hash keys
    -        id: id,
    -        text: text,
    -        primitives: [
    -          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    -          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    -          [x, y, 300, 50].border, # sets definition of border
    -        ]
    -      }
    +        starting_rect = args.layout.rect(row: 5, col: 13)
    +        x_scale    = 10
    +        y_scale    = 100
    +        max_points = 25
       
    -      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    -      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    -      @button_list[id][:primitives][0][2] = 300 * percentage
    -      @button_list[id][:primitives]
    -    end
    +        points = wave
    +        if wave.length > max_points
    +          resolution = wave.length.idiv max_points
    +          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    +        end
       
    -    # Defines the game.
    -    def game
    -      @game
    -    end
    +        args.outputs.static_lines << points.map_with_index do |y, x|
    +          next_y = points[x + 1]
       
    -    # Initalizes the game and creates an empty list of buttons.
    -    def initialize
    -      @game = TextedBasedGame.new self
    -      @button_list ||= {}
    -    end
    +          if next_y
    +            {
    +              x:  starting_rect.x + (x * x_scale),
    +              y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    +              x2: starting_rect.x + ((x + 1) * x_scale),
    +              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    +              r:  r,
    +              g:  g,
    +              b:  b
    +            }
    +          end
    +        end
       
    -    # Clears the storyline and takes the user to the room.
    -    def alert_dismiss_clicked
    -      game.clear_storyline
    -      game.go_to_room
    -    end
    +        args.outputs.static_sprites << points.map_with_index do |y, x|
    +          {
    +            x:  (starting_rect.x + (x * x_scale)) - 2,
    +            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    +            w:  4,
    +            h:  4,
    +            path: 'sprites/square-white.png',
    +            r: r,
    +            g: g,
    +            b: b
    +          }
    +        end
       
    -    # Lights the fire when the user clicks the "light fire" option.
    -    def light_fire_clicked
    -      game.light_fire
    +        args.state.graphed_at = args.state.tick_count
    +      end
         end
       
    -    # Saves the game when the user clicks the "save" option.
    -    def save_game_clicked
    -      game.save
    -    end
    +    begin # region: musical note mapping
    +      def defaults_frequency_for
    +        { note: :a, octave: 5, sharp:  false, flat:   false }
    +      end
       
    -    # Resets the game when the user clicks the "reset" option.
    -    def reset_game_clicked
    -      game.reset
    -    end
    +      def frequency_for opts = {}
    +        opts = defaults_frequency_for.merge opts
    +        octave_offset_multiplier  = opts[:octave] - 5
    +        note = note_frequencies_octave_5[opts[:note]]
    +        if octave_offset_multiplier < 0
    +          note = note * 1 / (octave_offset_multiplier.abs + 1)
    +        elsif octave_offset_multiplier > 0
    +          note = note * (octave_offset_multiplier.abs + 1) / 1
    +        end
    +        note
    +      end
       
    -    # Loads the game when the user clicks the "load" option.
    -    def load_game_clicked
    -      game.load
    +      def note_frequencies_octave_5
    +        {
    +          a: 440.0,
    +          a_sharp: 466.16, b_flat: 466.16,
    +          b: 493.88,
    +          c: 523.25,
    +          c_sharp: 554.37, d_flat: 587.33,
    +          d: 587.33,
    +          d_sharp: 622.25, e_flat: 659.25,
    +          e: 659.25,
    +          f: 698.25,
    +          f_sharp: 739.99, g_flat: 739.99,
    +          g: 783.99,
    +          g_sharp: 830.61, a_flat: 830.61
    +        }
    +      end
         end
       end
       
    -  $text_based_rpg = TextedBasedGamePresenter.new
    -  
    -  def tick args
    -    $text_based_rpg.state = args.state
    -    $text_based_rpg.outputs = args.outputs
    -    $text_based_rpg.inputs = args.inputs
    -    $text_based_rpg.tick
    -  end
    +  $gtk.reset
     
     #+end_src
     
    @@ -12602,7 +12985,7 @@ Follows is a source code listing for all files that have been open sourced. This
           flip_horizontally: false,
           angle_anchor_x: 0.5,            # rotation center set to middle
           angle_anchor_y: 0.5
    -    }.sprite
    +    }.sprite!
       
         # Outputs label as primitive using a hash
         args.outputs.primitives << {
    @@ -12616,7 +12999,7 @@ Follows is a source code listing for all files that have been open sourced. This
           b:         50,
           a:         255,                 # transparency
           font:      "fonts/manaspc.ttf"  # font style
    -    }.label
    +    }.label!
       
         # Outputs solid as primitive using a hash
         args.outputs.primitives << {
    @@ -12628,7 +13011,7 @@ Follows is a source code listing for all files that have been open sourced. This
           g:  50,
           b:  50,
           a: 255                          # transparency
    -    }.solid
    +    }.solid!
       
         # Outputs border as primitive using a hash
         # Same parameters as solid
    @@ -12641,7 +13024,7 @@ Follows is a source code listing for all files that have been open sourced. This
           g:  50,
           b:  50,
           a: 255                          # transparency
    -    }.border
    +    }.border!
       
         # Outputs line as primitive using a hash
         args.outputs.primitives << {
    @@ -12653,7 +13036,7 @@ Follows is a source code listing for all files that have been open sourced. This
           g:   50,
           b:   50,
           a:  255                         # transparency
    -    }.line
    +    }.line!
       end
     
     #+end_src
    @@ -12705,9 +13088,108 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Advanced Rendering - Simple Camera - main.rb
    +#+begin_src ruby
    +  # ./samples/07_advanced_rendering/07_simple_camera/app/main.rb
    +  def tick args
    +    # variables you can play around with
    +    args.state.world.w      ||= 1280
    +    args.state.world.h      ||= 720
    +  
    +    args.state.player.x     ||= 0
    +    args.state.player.y     ||= 0
    +    args.state.player.size  ||= 32
    +  
    +    args.state.enemy.x      ||= 700
    +    args.state.enemy.y      ||= 700
    +    args.state.enemy.size   ||= 16
    +  
    +    args.state.camera.x                ||= 640
    +    args.state.camera.y                ||= 300
    +    args.state.camera.scale            ||= 1.0
    +    args.state.camera.show_empty_space ||= :yes
    +  
    +    # instructions
    +    args.outputs.primitives << { x: 0, y:  80.from_top, w: 360, h: 80, r: 0, g: 0, b: 0, a: 128 }.solid!
    +    args.outputs.primitives << { x: 10, y: 10.from_top, text: "arrow keys to move around", r: 255, g: 255, b: 255}.label!
    +    args.outputs.primitives << { x: 10, y: 30.from_top, text: "+/- to change zoom of camera", r: 255, g: 255, b: 255}.label!
    +    args.outputs.primitives << { x: 10, y: 50.from_top, text: "tab to change camera edge behavior", r: 255, g: 255, b: 255}.label!
    +  
    +    # render scene
    +    args.outputs[:scene].w = args.state.world.w
    +    args.outputs[:scene].h = args.state.world.h
    +  
    +    args.outputs[:scene].solids << { x: 0, y: 0, w: args.state.world.w, h: args.state.world.h, r: 20, g: 60, b: 80 }
    +    args.outputs[:scene].solids << { x: args.state.player.x, y: args.state.player.y,
    +                                     w: args.state.player.size, h: args.state.player.size, r: 80, g: 155, b: 80 }
    +    args.outputs[:scene].solids << { x: args.state.enemy.x, y: args.state.enemy.y,
    +                                     w: args.state.enemy.size, h: args.state.enemy.size, r: 155, g: 80, b: 80 }
    +  
    +    # render camera
    +    scene_position = calc_scene_position args
    +    args.outputs.sprites << { x: scene_position.x,
    +                              y: scene_position.y,
    +                              w: scene_position.w,
    +                              h: scene_position.h,
    +                              path: :scene }
    +  
    +    # move player
    +    if args.inputs.directional_angle
    +      args.state.player.x += args.inputs.directional_angle.vector_x * 5
    +      args.state.player.y += args.inputs.directional_angle.vector_y * 5
    +      args.state.player.x  = args.state.player.x.clamp(0, args.state.world.w - args.state.player.size)
    +      args.state.player.y  = args.state.player.y.clamp(0, args.state.world.h - args.state.player.size)
    +    end
    +  
    +    # +/- to zoom in and out
    +    if args.inputs.keyboard.plus && args.state.tick_count.zmod?(3)
    +      args.state.camera.scale += 0.05
    +    elsif args.inputs.keyboard.hyphen && args.state.tick_count.zmod?(3)
    +      args.state.camera.scale -= 0.05
    +    elsif args.inputs.keyboard.key_down.tab
    +      if args.state.camera.show_empty_space == :yes
    +        args.state.camera.show_empty_space = :no
    +      else
    +        args.state.camera.show_empty_space = :yes
    +      end
    +    end
    +  
    +    args.state.camera.scale = args.state.camera.scale.greater(0.1)
    +  end
    +  
    +  def calc_scene_position args
    +    result = { x: args.state.camera.x - (args.state.player.x * args.state.camera.scale),
    +               y: args.state.camera.y - (args.state.player.y * args.state.camera.scale),
    +               w: args.state.world.w * args.state.camera.scale,
    +               h: args.state.world.h * args.state.camera.scale,
    +               scale: args.state.camera.scale }
    +  
    +    return result if args.state.camera.show_empty_space == :yes
    +  
    +    if result.w < args.grid.w
    +      result.merge!(x: (args.grid.w - result.w).half)
    +    elsif (args.state.player.x * result.scale) < args.grid.w.half
    +      result.merge!(x: 10)
    +    elsif (result.x + result.w) < args.grid.w
    +      result.merge!(x: - result.w + (args.grid.w - 10))
    +    end
    +  
    +    if result.h < args.grid.h
    +      result.merge!(y: (args.grid.h - result.h).half)
    +    elsif (result.y) > 10
    +      result.merge!(y: 10)
    +    elsif (result.y + result.h) < args.grid.h
    +      result.merge!(y: - result.h + (args.grid.h - 10))
    +    end
    +  
    +    result
    +  end
    +
    +#+end_src
    +
     *** Advanced Rendering - Splitscreen Camera - main.rb
     #+begin_src ruby
    -  # ./samples/07_advanced_rendering/07_splitscreen_camera/app/main.rb
    +  # ./samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb
       class CameraMovement
         attr_accessor :state, :inputs, :outputs, :grid
       
    @@ -13108,7 +13590,7 @@ Follows is a source code listing for all files that have been open sourced. This
     
     *** Advanced Rendering - Z Targeting Camera - main.rb
     #+begin_src ruby
    -  # ./samples/07_advanced_rendering/08_z_targeting_camera/app/main.rb
    +  # ./samples/07_advanced_rendering/09_z_targeting_camera/app/main.rb
       class Game
         attr_gtk
       
    @@ -13218,6 +13700,61 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Advanced Rendering - Blend Modes - main.rb
    +#+begin_src ruby
    +  # ./samples/07_advanced_rendering/10_blend_modes/app/main.rb
    +  $gtk.reset
    +  
    +  def draw_blendmode args, mode
    +    w = 160
    +    h = w
    +    args.state.x += (1280-w) / (args.state.blendmodes.length + 1)
    +    x = args.state.x
    +    y = (720 - h) / 2
    +    s = 'sprites/blue-feathered.png'
    +    args.outputs.sprites << { blendmode_enum: mode.value, x: x, y: y, w: w, h: h, path: s }
    +    args.outputs.labels << [x + (w/2), y, mode.name.to_s, 1, 1, 255, 255, 255]
    +  end
    +  
    +  def tick args
    +  
    +    # Different blend modes do different things, depending on what they
    +    # blend against (in this case, the pixels of the background color).
    +    args.state.bg_element ||= 1
    +    args.state.bg_color ||= 255
    +    args.state.bg_color_direction ||= 1
    +    bg_r = (args.state.bg_element == 1) ? args.state.bg_color : 0
    +    bg_g = (args.state.bg_element == 2) ? args.state.bg_color : 0
    +    bg_b = (args.state.bg_element == 3) ? args.state.bg_color : 0
    +    args.state.bg_color += args.state.bg_color_direction
    +    if (args.state.bg_color_direction > 0) && (args.state.bg_color >= 255)
    +      args.state.bg_color_direction = -1
    +      args.state.bg_color = 255
    +    elsif (args.state.bg_color_direction < 0) && (args.state.bg_color <= 0)
    +      args.state.bg_color_direction = 1
    +      args.state.bg_color = 0
    +      args.state.bg_element += 1
    +      if args.state.bg_element >= 4
    +        args.state.bg_element = 1
    +      end
    +    end
    +  
    +    args.outputs.background_color = [ bg_r, bg_g, bg_b, 255 ]
    +  
    +    args.state.blendmodes ||= [
    +      { name: :none,  value: 0 },
    +      { name: :blend, value: 1 },
    +      { name: :add,   value: 2 },
    +      { name: :mod,   value: 3 },
    +      { name: :mul,   value: 4 }
    +    ]
    +  
    +    args.state.x = 0  # reset this, draw_blendmode will increment it.
    +    args.state.blendmodes.each { |blendmode| draw_blendmode args, blendmode }
    +  end
    +
    +#+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
    @@ -13710,7 +14247,11 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    -      puts "* INFO - Please specify the number of sprites to render."
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Sprites, Hashes"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
    @@ -13780,7 +14321,11 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    -      puts "* INFO - Please specify the number of sprites to render."
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Sprites, Open Entities"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
    @@ -13854,7 +14399,11 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    -      puts "* INFO - Please specify the number of sprites to render."
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Sprites, Strict Entities"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
    @@ -13911,6 +14460,11 @@ Follows is a source code listing for all files that have been open sourced. This
       def tick args
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Sprites, Classes"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
    @@ -13968,19 +14522,24 @@ Follows is a source code listing for all files that have been open sourced. This
       def tick args
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Static Sprites, Classes"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
         # init
         if args.state.tick_count == 0
           args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
    +      args.outputs.static_sprites << args.state.stars
         end
       
         # update
         args.state.stars.each(&:move)
       
         # render
    -    args.outputs.sprites << args.state.stars
         args.outputs.background_color = [0, 0, 0]
         args.outputs.primitives << args.gtk.current_framerate_primitives
       end
    @@ -14038,10 +14597,21 @@ Follows is a source code listing for all files that have been open sourced. This
           # path,
           # angle,
           # alpha, red_saturation, green_saturation, blue_saturation
    +      # tile_x, tile_y, tile_w, tile_h,
           # flip_horizontally, flip_vertically,
    -      # tile_x, tile_y, tile_w, tile_h
           # angle_anchor_x, angle_anchor_y,
           # source_x, source_y, source_w, source_h
    +  
    +      # The argument order for ffi_draw.draw_sprite_4 is:
    +      # x, y, w, h,
    +      # path,
    +      # angle,
    +      # alpha, red_saturation, green_saturation, blue_saturation
    +      # tile_x, tile_y, tile_w, tile_h,
    +      # flip_horizontally, flip_vertically,
    +      # angle_anchor_x, angle_anchor_y,
    +      # source_x, source_y, source_w, source_h,
    +      # blendmode_enum
         end
       end
       
    @@ -14049,6 +14619,11 @@ Follows is a source code listing for all files that have been open sourced. This
       def tick args
         # sets console command when sample app initially opens
         if Kernel.global_tick_count == 0
    +      puts ""
    +      puts ""
    +      puts "========================================================="
    +      puts "* INFO: Static Sprites, Classes, Draw Override"
    +      puts "* INFO: Please specify the number of sprites to render."
           args.gtk.console.set_command "reset_with count: 100"
         end
       
    @@ -14219,6 +14794,55 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Advanced Debugging - Unit Tests - benchmark_api_tests.rb
    +#+begin_src ruby
    +  # ./samples/10_advanced_debugging/03_unit_tests/benchmark_api_tests.rb
    +  def test_benchmark_api args, assert
    +    result = args.gtk.benchmark iterations: 100,
    +                                only_one: -> () {
    +                                  r = 0
    +                                  (1..100).each do |i|
    +                                    r += 1
    +                                  end
    +                                }
    +  
    +    assert.equal! result.first_place.name, :only_one
    +  
    +    result = args.gtk.benchmark iterations: 100,
    +                                iterations_100: -> () {
    +                                  r = 0
    +                                  (1..100).each do |i|
    +                                    r += 1
    +                                  end
    +                                },
    +                                iterations_50: -> () {
    +                                  r = 0
    +                                  (1..50).each do |i|
    +                                    r += 1
    +                                  end
    +                                }
    +  
    +    assert.equal! result.first_place.name, :iterations_50
    +  
    +    result = args.gtk.benchmark iterations: 1,
    +                                iterations_100: -> () {
    +                                  r = 0
    +                                  (1..100).each do |i|
    +                                    r += 1
    +                                  end
    +                                },
    +                                iterations_50: -> () {
    +                                  r = 0
    +                                  (1..50).each do |i|
    +                                    r += 1
    +                                  end
    +                                }
    +  
    +    assert.equal! result.too_small_to_measure, true
    +  end
    +
    +#+end_src
    +
     *** Advanced Debugging - Unit Tests - exception_raising_tests.rb
     #+begin_src ruby
       # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb
    @@ -14739,6 +15363,142 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Advanced Debugging - Unit Tests - pretty_format_tests.rb
    +#+begin_src ruby
    +  # ./samples/10_advanced_debugging/03_unit_tests/pretty_format_tests.rb
    +  def H opts
    +    opts
    +  end
    +  
    +  def A *opts
    +    opts
    +  end
    +  
    +  def assert_format args, assert, hash, expected
    +    actual = args.fn.pretty_format hash
    +    assert.are_equal! actual, expected
    +  end
    +  
    +  def test_pretty_print args, assert
    +    # =============================
    +    # hash with single value
    +    # =============================
    +    input = (H first_name: "John")
    +    expected = <<-S
    +  {:first_name "John"}
    +  S
    +    (assert_format args, assert, input, expected)
    +  
    +    # =============================
    +    # hash with two values
    +    # =============================
    +    input = (H first_name: "John", last_name: "Smith")
    +    expected = <<-S
    +  {:first_name "John"
    +   :last_name "Smith"}
    +  S
    +  
    +    (assert_format args, assert, input, expected)
    +  
    +    # =============================
    +    # hash with inner hash
    +    # =============================
    +    input = (H first_name: "John",
    +               last_name: "Smith",
    +               middle_initial: "I",
    +               so: (H first_name: "Pocahontas",
    +                      last_name: "Tsenacommacah"),
    +               friends: (A (H first_name: "Side", last_name: "Kick"),
    +                           (H first_name: "Tim", last_name: "Wizard")))
    +    expected = <<-S
    +  {:first_name "John"
    +   :last_name "Smith"
    +   :middle_initial "I"
    +   :so {:first_name "Pocahontas"
    +        :last_name "Tsenacommacah"}
    +   :friends [{:first_name "Side"
    +              :last_name "Kick"}
    +             {:first_name "Tim"
    +              :last_name "Wizard"}]}
    +  S
    +  
    +    (assert_format args, assert, input, expected)
    +  
    +    # =============================
    +    # array with one value
    +    # =============================
    +    input = (A 1)
    +    expected = <<-S
    +  [1]
    +  S
    +    (assert_format args, assert, input, expected)
    +  
    +    # =============================
    +    # array with multiple values
    +    # =============================
    +    input = (A 1, 2, 3)
    +    expected = <<-S
    +  [1
    +   2
    +   3]
    +  S
    +    (assert_format args, assert, input, expected)
    +  
    +    # =============================
    +    # array with multiple values hashes
    +    # =============================
    +    input = (A (H first_name: "Side", last_name: "Kick"),
    +               (H first_name: "Tim", last_name: "Wizard"))
    +    expected = <<-S
    +  [{:first_name "Side"
    +    :last_name "Kick"}
    +   {:first_name "Tim"
    +    :last_name "Wizard"}]
    +  S
    +  
    +    (assert_format args, assert, input, expected)
    +  end
    +  
    +  def test_nested_nested args, assert
    +    # =============================
    +    # nested array in nested hash
    +    # =============================
    +    input = (H type: :root,
    +               text: "Root",
    +               children: (A (H level: 1,
    +                               text: "Level 1",
    +                               children: (A (H level: 2,
    +                                               text: "Level 2",
    +                                               children: [])))))
    +  
    +    expected = <<-S
    +  {:type :root
    +   :text "Root"
    +   :children [{:level 1
    +               :text "Level 1"
    +               :children [{:level 2
    +                           :text "Level 2"
    +                           :children []}]}]}
    +  
    +  S
    +  
    +    (assert_format args, assert, input, expected)
    +  end
    +  
    +  def test_scene args, assert
    +    script = <<-S
    +  * Scene 1
    +  ** Narrator
    +  They say happy endings don't exist.
    +  ** Narrator
    +  They say true love is a lie.
    +  S
    +    input = parse_org args, script
    +    puts (args.fn.pretty_format input)
    +  end
    +
    +#+end_src
    +
     *** Advanced Debugging - Unit Tests - require_tests.rb
     #+begin_src ruby
       # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb
    @@ -18624,13 +19384,13 @@ Follows is a source code listing for all files that have been open sourced. This
       
         def tick
           defaults
    -      render 
    -      input  
    +      render
    +      input
           # If animation is playing, and max steps have not been reached
           # Move the search a step forward
           if state.play && state.current_step < state.max_steps
             # Variable that tells the program what step to recalculate up to
    -        state.current_step += 1 
    +        state.current_step += 1
             move_searches_one_step_forward
           end
         end
    @@ -18652,7 +19412,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # We store this value, because we want to remember the value even when
           # the user's cursor is no longer over what they're interacting with, but
           # they are still clicking down on the mouse.
    -      state.user_input ||= :none 
    +      state.user_input ||= :none
       
           # These variables allow the breadth first search to take place
           # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key.
    @@ -18677,7 +19437,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # Unless the current step has a value
           unless state.current_step
             # Set the current step to 10
    -        state.current_step = 10 
    +        state.current_step = 10
             # And calculate the searches up to step 10
             recalculate_searches
           end
    @@ -18687,7 +19447,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # This step is roughly the grid's width * height
           # When anim_steps equals max_steps no more calculations will occur
           # and the slider will be at the end
    -      state.max_steps = grid.width * grid.height 
    +      state.max_steps = grid.width * grid.height
       
           # Whether the animation should play or not
           # If true, every tick moves anim_steps forward one
    @@ -18780,7 +19540,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # If the mouse was clicked this tick
           if inputs.mouse.down
             # Determine what the user is editing and appropriately edit the state.user_input variable
    -        determine_input          
    +        determine_input
           end
       
           # Process user input based on user_input variable and current mouse position
    @@ -18793,35 +19553,35 @@ Follows is a source code listing for all files that have been open sourced. This
           if mouse_over_slider?
             state.user_input = :slider
           # If the mouse is over the star in the first grid
    -      elsif bfs_mouse_over_star?                 
    +      elsif bfs_mouse_over_star?
             # The user is editing the star from the first grid
    -        state.user_input = :bfs_star          
    +        state.user_input = :bfs_star
           # If the mouse is over the star in the second grid
    -      elsif heuristic_mouse_over_star?                 
    +      elsif heuristic_mouse_over_star?
             # The user is editing the star from the second grid
    -        state.user_input = :heuristic_star          
    +        state.user_input = :heuristic_star
           # If the mouse is over the target in the first grid
    -      elsif bfs_mouse_over_target?                 
    +      elsif bfs_mouse_over_target?
             # The user is editing the target from the first grid
    -        state.user_input = :bfs_target          
    +        state.user_input = :bfs_target
           # If the mouse is over the target in the second grid
    -      elsif heuristic_mouse_over_target?                 
    +      elsif heuristic_mouse_over_target?
             # The user is editing the target from the second grid
    -        state.user_input = :heuristic_target 
    +        state.user_input = :heuristic_target
           # If the mouse is over a wall in the first grid
    -      elsif bfs_mouse_over_wall?                 
    +      elsif bfs_mouse_over_wall?
             # The user is removing a wall from the first grid
    -        state.user_input = :bfs_remove_wall   
    +        state.user_input = :bfs_remove_wall
           # If the mouse is over a wall in the second grid
    -      elsif heuristic_mouse_over_wall?                 
    +      elsif heuristic_mouse_over_wall?
             # The user is removing a wall from the second grid
             state.user_input = :heuristic_remove_wall
           # If the mouse is over the first grid
    -      elsif bfs_mouse_over_grid?                 
    +      elsif bfs_mouse_over_grid?
             # The user is adding a wall from the first grid
             state.user_input = :bfs_add_wall
           # If the mouse is over the second grid
    -      elsif heuristic_mouse_over_grid?                 
    +      elsif heuristic_mouse_over_grid?
             # The user is adding a wall from the second grid
             state.user_input = :heuristic_add_wall
           end
    @@ -18831,22 +19591,22 @@ Follows is a source code listing for all files that have been open sourced. This
         def process_input
           if state.user_input == :slider
             process_input_slider
    -      elsif state.user_input == :bfs_star         
    -        process_input_bfs_star                            
    +      elsif state.user_input == :bfs_star
    +        process_input_bfs_star
           elsif state.user_input == :heuristic_star
    -        process_input_heuristic_star                            
    -      elsif state.user_input == :bfs_target         
    -        process_input_bfs_target                            
    -      elsif state.user_input == :heuristic_target         
    -        process_input_heuristic_target                            
    -      elsif state.user_input == :bfs_remove_wall  
    -        process_input_bfs_remove_wall                     
    +        process_input_heuristic_star
    +      elsif state.user_input == :bfs_target
    +        process_input_bfs_target
    +      elsif state.user_input == :heuristic_target
    +        process_input_heuristic_target
    +      elsif state.user_input == :bfs_remove_wall
    +        process_input_bfs_remove_wall
           elsif state.user_input == :heuristic_remove_wall
    -        process_input_heuristic_remove_wall                     
    -      elsif state.user_input == :bfs_add_wall     
    -        process_input_bfs_add_wall                        
    -      elsif state.user_input == :heuristic_add_wall     
    -        process_input_heuristic_add_wall                        
    +        process_input_heuristic_remove_wall
    +      elsif state.user_input == :bfs_add_wall
    +        process_input_bfs_add_wall
    +      elsif state.user_input == :heuristic_add_wall
    +        process_input_heuristic_add_wall
           end
         end
       
    @@ -18923,7 +19683,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
           # The horizontal grid lines
           for y in 0..grid.height
    -        outputs.lines << bfs_horizontal_line(y) 
    +        outputs.lines << bfs_horizontal_line(y)
           end
         end
       
    @@ -18938,10 +19698,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
           # The horizontal grid lines
           for y in 0..grid.height
    -        outputs.lines << heuristic_horizontal_line(y) 
    +        outputs.lines << heuristic_horizontal_line(y)
           end
         end
    -      
    +  
         # Returns a vertical line for a column of the first grid
         def bfs_vertical_line column
           bfs_scale_up([column, 0, column, grid.height])
    @@ -18976,7 +19736,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def render_bfs_target
           outputs.sprites << [bfs_scale_up(grid.target), 'target.png']
         end
    -    
    +  
         # Renders the target on the second grid
         def render_heuristic_target
           outputs.sprites << [heuristic_scale_up(grid.target), 'target.png']
    @@ -18984,14 +19744,14 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # Renders the walls on the first grid
         def render_bfs_walls
    -      grid.walls.each_key do | wall | 
    +      grid.walls.each_key do | wall |
             outputs.solids << [bfs_scale_up(wall), wall_color]
           end
         end
       
         # Renders the walls on the second grid
         def render_heuristic_walls
    -      grid.walls.each_key do | wall | 
    +      grid.walls.each_key do | wall |
             outputs.solids << [heuristic_scale_up(wall), wall_color]
           end
         end
    @@ -19012,14 +19772,14 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # Renders the frontier cells on the first grid
         def render_bfs_frontier
    -      bfs.frontier.each do | frontier_cell | 
    +      bfs.frontier.each do | frontier_cell |
             outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200]
           end
         end
       
         # Renders the frontier cells on the second grid
         def render_heuristic_frontier
    -      heuristic.frontier.each do | frontier_cell | 
    +      heuristic.frontier.each do | frontier_cell |
             outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200]
           end
         end
    @@ -19103,14 +19863,14 @@ Follows is a source code listing for all files that have been open sourced. This
         # Checks and handles input for the buttons
         # Called when the mouse is lifted
         def input_buttons
    -      input_left_button 
    -      input_center_button          
    -      input_right_button     
    +      input_left_button
    +      input_center_button
    +      input_right_button
         end
       
         # Checks if the previous step button is clicked
         # If it is, it pauses the animation and moves the search one step backward
    -    def input_left_button 
    +    def input_left_button
           if left_button_clicked?
             state.play = false
             state.current_step -= 1
    @@ -19122,7 +19882,7 @@ Follows is a source code listing for all files that have been open sourced. This
         # Inverses whether the animation is playing or not when clicked
         def input_center_button
           if center_button_clicked? || inputs.keyboard.key_down.space
    -        state.play = !state.play         
    +        state.play = !state.play
           end
         end
       
    @@ -19130,8 +19890,8 @@ Follows is a source code listing for all files that have been open sourced. This
         # If it is, it pauses the animation and moves the search one step forward
         def input_right_button
           if right_button_clicked?
    -        state.play = false              
    -        state.current_step += 1           
    +        state.play = false
    +        state.current_step += 1
             move_searches_one_step_forward
           end
         end
    @@ -19212,12 +19972,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # on the slider
         # Changes the step of the search to be animated
         def process_input_slider
    -      state.play = false 
    +      state.play = false
           mouse_x = inputs.mouse.point.x
       
           # Bounds the mouse_x to the closest x value on the slider line
    -      mouse_x = slider.x if mouse_x < slider.x 
    -      mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w 
    +      mouse_x = slider.x if mouse_x < slider.x
    +      mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w
       
           # Sets the current search step to the one represented by the mouse x value
           # The slider's circle moves due to the render_slider method using anim_steps
    @@ -19230,12 +19990,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only resets the search if the star changes position
         # Called whenever the user is editing the star (puts mouse down on star)
         def process_input_bfs_star
    -      old_star = grid.star.clone 
    +      old_star = grid.star.clone
           unless bfs_cell_closest_to_mouse == grid.target
    -        grid.star = bfs_cell_closest_to_mouse 
    +        grid.star = bfs_cell_closest_to_mouse
           end
    -      unless old_star == grid.star 
    -        recalculate_searches 
    +      unless old_star == grid.star
    +        recalculate_searches
           end
         end
       
    @@ -19243,12 +20003,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only resets the search if the star changes position
         # Called whenever the user is editing the star (puts mouse down on star)
         def process_input_heuristic_star
    -      old_star = grid.star.clone 
    +      old_star = grid.star.clone
           unless heuristic_cell_closest_to_mouse == grid.target
             grid.star = heuristic_cell_closest_to_mouse
           end
    -      unless old_star == grid.star 
    -        recalculate_searches 
    +      unless old_star == grid.star
    +        recalculate_searches
           end
         end
       
    @@ -19256,12 +20016,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only recalculate_searchess the search if the target changes position
         # Called whenever the user is editing the target (puts mouse down on target)
         def process_input_bfs_target
    -      old_target = grid.target.clone 
    +      old_target = grid.target.clone
           unless bfs_cell_closest_to_mouse == grid.star
             grid.target = bfs_cell_closest_to_mouse
           end
    -      unless old_target == grid.target 
    -        recalculate_searches 
    +      unless old_target == grid.target
    +        recalculate_searches
           end
         end
       
    @@ -19269,12 +20029,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only recalculate_searchess the search if the target changes position
         # Called whenever the user is editing the target (puts mouse down on target)
         def process_input_heuristic_target
    -      old_target = grid.target.clone 
    +      old_target = grid.target.clone
           unless heuristic_cell_closest_to_mouse == grid.star
             grid.target = heuristic_cell_closest_to_mouse
           end
    -      unless old_target == grid.target 
    -        recalculate_searches 
    +      unless old_target == grid.target
    +        recalculate_searches
           end
         end
       
    @@ -19283,10 +20043,10 @@ Follows is a source code listing for all files that have been open sourced. This
           # The mouse needs to be inside the grid, because we only want to remove walls
           # the cursor is directly over
           # Recalculations should only occur when a wall is actually deleted
    -      if bfs_mouse_over_grid? 
    +      if bfs_mouse_over_grid?
             if grid.walls.has_key?(bfs_cell_closest_to_mouse)
    -          grid.walls.delete(bfs_cell_closest_to_mouse) 
    -          recalculate_searches 
    +          grid.walls.delete(bfs_cell_closest_to_mouse)
    +          recalculate_searches
             end
           end
         end
    @@ -19296,29 +20056,29 @@ Follows is a source code listing for all files that have been open sourced. This
           # The mouse needs to be inside the grid, because we only want to remove walls
           # the cursor is directly over
           # Recalculations should only occur when a wall is actually deleted
    -      if heuristic_mouse_over_grid? 
    +      if heuristic_mouse_over_grid?
             if grid.walls.has_key?(heuristic_cell_closest_to_mouse)
    -          grid.walls.delete(heuristic_cell_closest_to_mouse) 
    -          recalculate_searches 
    +          grid.walls.delete(heuristic_cell_closest_to_mouse)
    +          recalculate_searches
             end
           end
         end
         # Adds a wall in the first grid in the cell the mouse is over
         def process_input_bfs_add_wall
    -      if bfs_mouse_over_grid? 
    +      if bfs_mouse_over_grid?
             unless grid.walls.has_key?(bfs_cell_closest_to_mouse)
    -          grid.walls[bfs_cell_closest_to_mouse] = true 
    -          recalculate_searches 
    +          grid.walls[bfs_cell_closest_to_mouse] = true
    +          recalculate_searches
             end
           end
         end
       
         # Adds a wall in the second grid in the cell the mouse is over
         def process_input_heuristic_add_wall
    -      if heuristic_mouse_over_grid? 
    +      if heuristic_mouse_over_grid?
             unless grid.walls.has_key?(heuristic_cell_closest_to_mouse)
    -          grid.walls[heuristic_cell_closest_to_mouse] = true 
    -          recalculate_searches 
    +          grid.walls[heuristic_cell_closest_to_mouse] = true
    +          recalculate_searches
             end
           end
         end
    @@ -19328,13 +20088,13 @@ Follows is a source code listing for all files that have been open sourced. This
         # Finding the cell closest to the mouse helps with this
         def bfs_cell_closest_to_mouse
           # Closest cell to the mouse in the first grid
    -      x = (inputs.mouse.point.x / grid.cell_size).to_i 
    -      y = (inputs.mouse.point.y / grid.cell_size).to_i 
    +      x = (inputs.mouse.point.x / grid.cell_size).to_i
    +      y = (inputs.mouse.point.y / grid.cell_size).to_i
           # Bound x and y to the grid
    -      x = grid.width - 1 if x > grid.width - 1 
    -      y = grid.height - 1 if y > grid.height - 1 
    +      x = grid.width - 1 if x > grid.width - 1
    +      y = grid.height - 1 if y > grid.height - 1
           # Return closest cell
    -      [x, y] 
    +      [x, y]
         end
       
         # When the user grabs the star and puts their cursor to the far right
    @@ -19342,17 +20102,17 @@ Follows is a source code listing for all files that have been open sourced. This
         # Finding the cell closest to the mouse in the second grid helps with this
         def heuristic_cell_closest_to_mouse
           # Closest cell grid to the mouse in the second
    -      x = (inputs.mouse.point.x / grid.cell_size).to_i 
    -      y = (inputs.mouse.point.y / grid.cell_size).to_i 
    +      x = (inputs.mouse.point.x / grid.cell_size).to_i
    +      y = (inputs.mouse.point.y / grid.cell_size).to_i
           # Translate the cell to the first grid
           x -= grid.width + 1
           # Bound x and y to the first grid
           x = 0 if x < 0
           y = 0 if y < 0
    -      x = grid.width - 1 if x > grid.width - 1 
    -      y = grid.height - 1 if y > grid.height - 1 
    +      x = grid.width - 1 if x > grid.width - 1
    +      y = grid.height - 1 if y > grid.height - 1
           # Return closest cell
    -      [x, y] 
    +      [x, y]
         end
       
         def recalculate_searches
    @@ -19377,22 +20137,22 @@ Follows is a source code listing for all files that have been open sourced. This
           return if bfs.came_from.has_key?(grid.target)
       
           # Only runs at the beginning of the search as setup.
    -      if bfs.came_from.empty?  
    -        bfs.frontier << grid.star                   
    -        bfs.came_from[grid.star] = nil              
    +      if bfs.came_from.empty?
    +        bfs.frontier << grid.star
    +        bfs.came_from[grid.star] = nil
           end
       
           # A step in the search
    -      unless bfs.frontier.empty? 
    +      unless bfs.frontier.empty?
             # Takes the next frontier cell
    -        new_frontier = bfs.frontier.shift 
    +        new_frontier = bfs.frontier.shift
             # For each of its neighbors
    -        adjacent_neighbors(new_frontier).each do |neighbor| 
    +        adjacent_neighbors(new_frontier).each do |neighbor|
               # That have not been visited and are not walls
    -          unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) 
    +          unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)
                 # Add them to the frontier and mark them as visited
    -            bfs.frontier << neighbor 
    -            bfs.came_from[neighbor] = new_frontier 
    +            bfs.frontier << neighbor
    +            bfs.came_from[neighbor] = new_frontier
               end
             end
           end
    @@ -19447,12 +20207,12 @@ Follows is a source code listing for all files that have been open sourced. This
             # Get the next cell to explore from
             new_frontier = heuristic.frontier.shift
             # For each of its neighbors
    -        adjacent_neighbors(new_frontier).each do |neighbor| 
    +        adjacent_neighbors(new_frontier).each do |neighbor|
               # That have not been visited and are not walls
    -          unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) 
    +          unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)
                 # Add them to the frontier and mark them as visited
    -            heuristic.frontier << neighbor 
    -            heuristic.came_from[neighbor] = new_frontier 
    +            heuristic.frontier << neighbor
    +            heuristic.came_from[neighbor] = new_frontier
               end
             end
           end
    @@ -19496,16 +20256,16 @@ Follows is a source code listing for all files that have been open sourced. This
         # Returns a list of adjacent cells
         # Used to determine what the next cells to be added to the frontier are
         def adjacent_neighbors(cell)
    -      neighbors = [] 
    +      neighbors = []
       
           # Gets all the valid neighbors into the array
           # From southern neighbor, clockwise
    -      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0 
    -      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0 
    -      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1 
    -      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1 
    +      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0
    +      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0
    +      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1
    +      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1
       
    -      neighbors 
    +      neighbors
         end
       
         # Finds the vertical and horizontal distance of a cell from the star
    @@ -19554,7 +20314,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def wall_color
           [134, 134, 120] # Camo Green
         end
    -    
    +  
         def visited_color
           [204, 191, 179] # Dark Brown
         end
    @@ -19562,7 +20322,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def frontier_color
           [103, 136, 204] # Blue
         end
    -    
    +  
         def path_color
           [231, 230, 228] # Pastel White
         end
    @@ -19610,13 +20370,13 @@ Follows is a source code listing for all files that have been open sourced. This
       
         def tick
           defaults
    -      render 
    -      input  
    +      render
    +      input
           # If animation is playing, and max steps have not been reached
           # Move the search a step forward
           if state.play && state.current_step < state.max_steps
             # Variable that tells the program what step to recalculate up to
    -        state.current_step += 1 
    +        state.current_step += 1
             move_searches_one_step_forward
           end
         end
    @@ -19671,7 +20431,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # We store this value, because we want to remember the value even when
           # the user's cursor is no longer over what they're interacting with, but
           # they are still clicking down on the mouse.
    -      state.user_input ||= :none 
    +      state.user_input ||= :none
       
           # These variables allow the breadth first search to take place
           # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key.
    @@ -19696,7 +20456,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # Unless the current step has a value
           unless state.current_step
             # Set the current step to 10
    -        state.current_step = 10 
    +        state.current_step = 10
             # And calculate the searches up to step 10
             recalculate_searches
           end
    @@ -19706,7 +20466,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # This step is roughly the grid's width * height
           # When anim_steps equals max_steps no more calculations will occur
           # and the slider will be at the end
    -      state.max_steps = grid.width * grid.height 
    +      state.max_steps = grid.width * grid.height
       
           # Whether the animation should play or not
           # If true, every tick moves anim_steps forward one
    @@ -19799,7 +20559,7 @@ Follows is a source code listing for all files that have been open sourced. This
           # If the mouse was clicked this tick
           if inputs.mouse.down
             # Determine what the user is editing and appropriately edit the state.user_input variable
    -        determine_input          
    +        determine_input
           end
       
           # Process user input based on user_input variable and current mouse position
    @@ -19812,35 +20572,35 @@ Follows is a source code listing for all files that have been open sourced. This
           if mouse_over_slider?
             state.user_input = :slider
           # If the mouse is over the star in the first grid
    -      elsif bfs_mouse_over_star?                 
    +      elsif bfs_mouse_over_star?
             # The user is editing the star from the first grid
    -        state.user_input = :bfs_star          
    +        state.user_input = :bfs_star
           # If the mouse is over the star in the second grid
    -      elsif heuristic_mouse_over_star?                 
    +      elsif heuristic_mouse_over_star?
             # The user is editing the star from the second grid
    -        state.user_input = :heuristic_star          
    +        state.user_input = :heuristic_star
           # If the mouse is over the target in the first grid
    -      elsif bfs_mouse_over_target?                 
    +      elsif bfs_mouse_over_target?
             # The user is editing the target from the first grid
    -        state.user_input = :bfs_target          
    +        state.user_input = :bfs_target
           # If the mouse is over the target in the second grid
    -      elsif heuristic_mouse_over_target?                 
    +      elsif heuristic_mouse_over_target?
             # The user is editing the target from the second grid
    -        state.user_input = :heuristic_target 
    +        state.user_input = :heuristic_target
           # If the mouse is over a wall in the first grid
    -      elsif bfs_mouse_over_wall?                 
    +      elsif bfs_mouse_over_wall?
             # The user is removing a wall from the first grid
    -        state.user_input = :bfs_remove_wall   
    +        state.user_input = :bfs_remove_wall
           # If the mouse is over a wall in the second grid
    -      elsif heuristic_mouse_over_wall?                 
    +      elsif heuristic_mouse_over_wall?
             # The user is removing a wall from the second grid
             state.user_input = :heuristic_remove_wall
           # If the mouse is over the first grid
    -      elsif bfs_mouse_over_grid?                 
    +      elsif bfs_mouse_over_grid?
             # The user is adding a wall from the first grid
             state.user_input = :bfs_add_wall
           # If the mouse is over the second grid
    -      elsif heuristic_mouse_over_grid?                 
    +      elsif heuristic_mouse_over_grid?
             # The user is adding a wall from the second grid
             state.user_input = :heuristic_add_wall
           end
    @@ -19850,22 +20610,22 @@ Follows is a source code listing for all files that have been open sourced. This
         def process_input
           if state.user_input == :slider
             process_input_slider
    -      elsif state.user_input == :bfs_star         
    -        process_input_bfs_star                            
    +      elsif state.user_input == :bfs_star
    +        process_input_bfs_star
           elsif state.user_input == :heuristic_star
    -        process_input_heuristic_star                            
    -      elsif state.user_input == :bfs_target         
    -        process_input_bfs_target                            
    -      elsif state.user_input == :heuristic_target         
    -        process_input_heuristic_target                            
    -      elsif state.user_input == :bfs_remove_wall  
    -        process_input_bfs_remove_wall                     
    +        process_input_heuristic_star
    +      elsif state.user_input == :bfs_target
    +        process_input_bfs_target
    +      elsif state.user_input == :heuristic_target
    +        process_input_heuristic_target
    +      elsif state.user_input == :bfs_remove_wall
    +        process_input_bfs_remove_wall
           elsif state.user_input == :heuristic_remove_wall
    -        process_input_heuristic_remove_wall                     
    -      elsif state.user_input == :bfs_add_wall     
    -        process_input_bfs_add_wall                        
    -      elsif state.user_input == :heuristic_add_wall     
    -        process_input_heuristic_add_wall                        
    +        process_input_heuristic_remove_wall
    +      elsif state.user_input == :bfs_add_wall
    +        process_input_bfs_add_wall
    +      elsif state.user_input == :heuristic_add_wall
    +        process_input_heuristic_add_wall
           end
         end
       
    @@ -19942,7 +20702,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
           # The horizontal grid lines
           for y in 0..grid.height
    -        outputs.lines << bfs_horizontal_line(y) 
    +        outputs.lines << bfs_horizontal_line(y)
           end
         end
       
    @@ -19957,10 +20717,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
           # The horizontal grid lines
           for y in 0..grid.height
    -        outputs.lines << heuristic_horizontal_line(y) 
    +        outputs.lines << heuristic_horizontal_line(y)
           end
         end
    -      
    +  
         # Returns a vertical line for a column of the first grid
         def bfs_vertical_line column
           bfs_scale_up([column, 0, column, grid.height])
    @@ -19995,7 +20755,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def render_bfs_target
           outputs.sprites << [bfs_scale_up(grid.target), 'target.png']
         end
    -    
    +  
         # Renders the target on the second grid
         def render_heuristic_target
           outputs.sprites << [heuristic_scale_up(grid.target), 'target.png']
    @@ -20003,14 +20763,14 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # Renders the walls on the first grid
         def render_bfs_walls
    -      grid.walls.each_key do | wall | 
    +      grid.walls.each_key do | wall |
             outputs.solids << [bfs_scale_up(wall), wall_color]
           end
         end
       
         # Renders the walls on the second grid
         def render_heuristic_walls
    -      grid.walls.each_key do | wall | 
    +      grid.walls.each_key do | wall |
             outputs.solids << [heuristic_scale_up(wall), wall_color]
           end
         end
    @@ -20031,14 +20791,14 @@ Follows is a source code listing for all files that have been open sourced. This
       
         # Renders the frontier cells on the first grid
         def render_bfs_frontier
    -      bfs.frontier.each do | frontier_cell | 
    +      bfs.frontier.each do | frontier_cell |
             outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200]
           end
         end
       
         # Renders the frontier cells on the second grid
         def render_heuristic_frontier
    -      heuristic.frontier.each do | frontier_cell | 
    +      heuristic.frontier.each do | frontier_cell |
             outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200]
           end
         end
    @@ -20122,14 +20882,14 @@ Follows is a source code listing for all files that have been open sourced. This
         # Checks and handles input for the buttons
         # Called when the mouse is lifted
         def input_buttons
    -      input_left_button 
    -      input_center_button          
    -      input_right_button     
    +      input_left_button
    +      input_center_button
    +      input_right_button
         end
       
         # Checks if the previous step button is clicked
         # If it is, it pauses the animation and moves the search one step backward
    -    def input_left_button 
    +    def input_left_button
           if left_button_clicked?
             state.play = false
             state.current_step -= 1
    @@ -20141,7 +20901,7 @@ Follows is a source code listing for all files that have been open sourced. This
         # Inverses whether the animation is playing or not when clicked
         def input_center_button
           if center_button_clicked? || inputs.keyboard.key_down.space
    -        state.play = !state.play         
    +        state.play = !state.play
           end
         end
       
    @@ -20149,8 +20909,8 @@ Follows is a source code listing for all files that have been open sourced. This
         # If it is, it pauses the animation and moves the search one step forward
         def input_right_button
           if right_button_clicked?
    -        state.play = false              
    -        state.current_step += 1           
    +        state.play = false
    +        state.current_step += 1
             move_searches_one_step_forward
           end
         end
    @@ -20231,12 +20991,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # on the slider
         # Changes the step of the search to be animated
         def process_input_slider
    -      state.play = false 
    +      state.play = false
           mouse_x = inputs.mouse.point.x
       
           # Bounds the mouse_x to the closest x value on the slider line
    -      mouse_x = slider.x if mouse_x < slider.x 
    -      mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w 
    +      mouse_x = slider.x if mouse_x < slider.x
    +      mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w
       
           # Sets the current search step to the one represented by the mouse x value
           # The slider's circle moves due to the render_slider method using anim_steps
    @@ -20249,12 +21009,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only resets the search if the star changes position
         # Called whenever the user is editing the star (puts mouse down on star)
         def process_input_bfs_star
    -      old_star = grid.star.clone 
    +      old_star = grid.star.clone
           unless bfs_cell_closest_to_mouse == grid.target
    -        grid.star = bfs_cell_closest_to_mouse 
    +        grid.star = bfs_cell_closest_to_mouse
           end
    -      unless old_star == grid.star 
    -        recalculate_searches 
    +      unless old_star == grid.star
    +        recalculate_searches
           end
         end
       
    @@ -20262,12 +21022,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only resets the search if the star changes position
         # Called whenever the user is editing the star (puts mouse down on star)
         def process_input_heuristic_star
    -      old_star = grid.star.clone 
    +      old_star = grid.star.clone
           unless heuristic_cell_closest_to_mouse == grid.target
             grid.star = heuristic_cell_closest_to_mouse
           end
    -      unless old_star == grid.star 
    -        recalculate_searches 
    +      unless old_star == grid.star
    +        recalculate_searches
           end
         end
       
    @@ -20275,12 +21035,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only recalculate_searchess the search if the target changes position
         # Called whenever the user is editing the target (puts mouse down on target)
         def process_input_bfs_target
    -      old_target = grid.target.clone 
    +      old_target = grid.target.clone
           unless bfs_cell_closest_to_mouse == grid.star
             grid.target = bfs_cell_closest_to_mouse
           end
    -      unless old_target == grid.target 
    -        recalculate_searches 
    +      unless old_target == grid.target
    +        recalculate_searches
           end
         end
       
    @@ -20288,12 +21048,12 @@ Follows is a source code listing for all files that have been open sourced. This
         # Only recalculate_searchess the search if the target changes position
         # Called whenever the user is editing the target (puts mouse down on target)
         def process_input_heuristic_target
    -      old_target = grid.target.clone 
    +      old_target = grid.target.clone
           unless heuristic_cell_closest_to_mouse == grid.star
             grid.target = heuristic_cell_closest_to_mouse
           end
    -      unless old_target == grid.target 
    -        recalculate_searches 
    +      unless old_target == grid.target
    +        recalculate_searches
           end
         end
       
    @@ -20302,10 +21062,10 @@ Follows is a source code listing for all files that have been open sourced. This
           # The mouse needs to be inside the grid, because we only want to remove walls
           # the cursor is directly over
           # Recalculations should only occur when a wall is actually deleted
    -      if bfs_mouse_over_grid? 
    +      if bfs_mouse_over_grid?
             if grid.walls.has_key?(bfs_cell_closest_to_mouse)
    -          grid.walls.delete(bfs_cell_closest_to_mouse) 
    -          recalculate_searches 
    +          grid.walls.delete(bfs_cell_closest_to_mouse)
    +          recalculate_searches
             end
           end
         end
    @@ -20315,29 +21075,29 @@ Follows is a source code listing for all files that have been open sourced. This
           # The mouse needs to be inside the grid, because we only want to remove walls
           # the cursor is directly over
           # Recalculations should only occur when a wall is actually deleted
    -      if heuristic_mouse_over_grid? 
    +      if heuristic_mouse_over_grid?
             if grid.walls.has_key?(heuristic_cell_closest_to_mouse)
    -          grid.walls.delete(heuristic_cell_closest_to_mouse) 
    -          recalculate_searches 
    +          grid.walls.delete(heuristic_cell_closest_to_mouse)
    +          recalculate_searches
             end
           end
         end
         # Adds a wall in the first grid in the cell the mouse is over
         def process_input_bfs_add_wall
    -      if bfs_mouse_over_grid? 
    +      if bfs_mouse_over_grid?
             unless grid.walls.has_key?(bfs_cell_closest_to_mouse)
    -          grid.walls[bfs_cell_closest_to_mouse] = true 
    -          recalculate_searches 
    +          grid.walls[bfs_cell_closest_to_mouse] = true
    +          recalculate_searches
             end
           end
         end
       
         # Adds a wall in the second grid in the cell the mouse is over
         def process_input_heuristic_add_wall
    -      if heuristic_mouse_over_grid? 
    +      if heuristic_mouse_over_grid?
             unless grid.walls.has_key?(heuristic_cell_closest_to_mouse)
    -          grid.walls[heuristic_cell_closest_to_mouse] = true 
    -          recalculate_searches 
    +          grid.walls[heuristic_cell_closest_to_mouse] = true
    +          recalculate_searches
             end
           end
         end
    @@ -20347,13 +21107,13 @@ Follows is a source code listing for all files that have been open sourced. This
         # Finding the cell closest to the mouse helps with this
         def bfs_cell_closest_to_mouse
           # Closest cell to the mouse in the first grid
    -      x = (inputs.mouse.point.x / grid.cell_size).to_i 
    -      y = (inputs.mouse.point.y / grid.cell_size).to_i 
    +      x = (inputs.mouse.point.x / grid.cell_size).to_i
    +      y = (inputs.mouse.point.y / grid.cell_size).to_i
           # Bound x and y to the grid
    -      x = grid.width - 1 if x > grid.width - 1 
    -      y = grid.height - 1 if y > grid.height - 1 
    +      x = grid.width - 1 if x > grid.width - 1
    +      y = grid.height - 1 if y > grid.height - 1
           # Return closest cell
    -      [x, y] 
    +      [x, y]
         end
       
         # When the user grabs the star and puts their cursor to the far right
    @@ -20361,17 +21121,17 @@ Follows is a source code listing for all files that have been open sourced. This
         # Finding the cell closest to the mouse in the second grid helps with this
         def heuristic_cell_closest_to_mouse
           # Closest cell grid to the mouse in the second
    -      x = (inputs.mouse.point.x / grid.cell_size).to_i 
    -      y = (inputs.mouse.point.y / grid.cell_size).to_i 
    +      x = (inputs.mouse.point.x / grid.cell_size).to_i
    +      y = (inputs.mouse.point.y / grid.cell_size).to_i
           # Translate the cell to the first grid
           x -= grid.width + 1
           # Bound x and y to the first grid
           x = 0 if x < 0
           y = 0 if y < 0
    -      x = grid.width - 1 if x > grid.width - 1 
    -      y = grid.height - 1 if y > grid.height - 1 
    +      x = grid.width - 1 if x > grid.width - 1
    +      y = grid.height - 1 if y > grid.height - 1
           # Return closest cell
    -      [x, y] 
    +      [x, y]
         end
       
         def recalculate_searches
    @@ -20396,22 +21156,22 @@ Follows is a source code listing for all files that have been open sourced. This
           return if bfs.came_from.has_key?(grid.target)
       
           # Only runs at the beginning of the search as setup.
    -      if bfs.came_from.empty?  
    -        bfs.frontier << grid.star                   
    -        bfs.came_from[grid.star] = nil              
    +      if bfs.came_from.empty?
    +        bfs.frontier << grid.star
    +        bfs.came_from[grid.star] = nil
           end
       
           # A step in the search
    -      unless bfs.frontier.empty? 
    +      unless bfs.frontier.empty?
             # Takes the next frontier cell
    -        new_frontier = bfs.frontier.shift 
    +        new_frontier = bfs.frontier.shift
             # For each of its neighbors
    -        adjacent_neighbors(new_frontier).each do |neighbor| 
    +        adjacent_neighbors(new_frontier).each do |neighbor|
               # That have not been visited and are not walls
    -          unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) 
    +          unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)
                 # Add them to the frontier and mark them as visited
    -            bfs.frontier << neighbor 
    -            bfs.came_from[neighbor] = new_frontier 
    +            bfs.frontier << neighbor
    +            bfs.came_from[neighbor] = new_frontier
               end
             end
           end
    @@ -20466,12 +21226,12 @@ Follows is a source code listing for all files that have been open sourced. This
             # Get the next cell to explore from
             new_frontier = heuristic.frontier.shift
             # For each of its neighbors
    -        adjacent_neighbors(new_frontier).each do |neighbor| 
    +        adjacent_neighbors(new_frontier).each do |neighbor|
               # That have not been visited and are not walls
    -          unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) 
    +          unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)
                 # Add them to the frontier and mark them as visited
    -            heuristic.frontier << neighbor 
    -            heuristic.came_from[neighbor] = new_frontier 
    +            heuristic.frontier << neighbor
    +            heuristic.came_from[neighbor] = new_frontier
               end
             end
           end
    @@ -20515,16 +21275,16 @@ Follows is a source code listing for all files that have been open sourced. This
         # Returns a list of adjacent cells
         # Used to determine what the next cells to be added to the frontier are
         def adjacent_neighbors(cell)
    -      neighbors = [] 
    +      neighbors = []
       
           # Gets all the valid neighbors into the array
           # From southern neighbor, clockwise
    -      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0 
    -      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0 
    -      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1 
    -      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1 
    +      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0
    +      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0
    +      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1
    +      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1
       
    -      neighbors 
    +      neighbors
         end
       
         # Finds the vertical and horizontal distance of a cell from the star
    @@ -20573,7 +21333,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def wall_color
           [134, 134, 120] # Camo Green
         end
    -    
    +  
         def visited_color
           [204, 191, 179] # Dark Brown
         end
    @@ -20581,7 +21341,7 @@ Follows is a source code listing for all files that have been open sourced. This
         def frontier_color
           [103, 136, 204] # Blue
         end
    -    
    +  
         def path_color
           [231, 230, 228] # Pastel White
         end
    @@ -24345,6 +25105,444 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Crafting - Farming Game Starting Point - main.rb
    +#+begin_src ruby
    +  # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb
    +  def tick args
    +    args.state.tile_size     = 80
    +    args.state.player_speed  = 4
    +    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
    +    generate_map args
    +    #press j to plant a green onion
    +    if args.inputs.keyboard.j
    +    #change this part you can change what you want to plant
    +     args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)
    +     args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)
    +    end
    +    # Adds walls, background, and player to args.outputs.solids so they appear on screen
    +    args.outputs.solids << [0,0,1280,720, 237,189,101]
    +    args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
    +    args.outputs.solids << args.state.walls
    +    args.outputs.solids << args.state.player
    +    args.outputs.solids << args.state.plants
    +    args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]
    +  
    +    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed
    +    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed
    +    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed
    +    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed
    +  end
    +  
    +  # Sets position, size, and color of the tile
    +  def tile args, x, y, *color
    +    [x * args.state.tile_size, # sets definition for array using method parameters
    +     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
    +     args.state.tile_size,
    +     args.state.tile_size,
    +     *color]
    +  end
    +  
    +  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
    +  def generate_map args
    +    return if args.state.area
    +  
    +    # Creates the area of the map. There are 9 rows running horizontally across the screen
    +    # and 16 columns running vertically on the screen. Any spot with a "1" is not
    +    # open for the player to move into (and is green), and any spot with a "0" is available
    +    # for the player to move in.
    +    args.state.area = [
    +      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
    +      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
    +      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
    +    ].reverse # reverses the order of the area collection
    +  
    +    # By reversing the order, the way that the area appears above is how it appears
    +    # on the screen in the game. If we did not reverse, the map would appear inverted.
    +  
    +    #The wall starts off with no tiles.
    +    args.state.walls = []
    +    args.state.plants = []
    +  
    +    # If v is 1, a green tile is added to args.state.walls.
    +    # If v is 2, a black tile is created as the goal.
    +    args.state.area.map_2d do |y, x, v|
    +      if    v == 1
    +        args.state.walls << tile(args, x, y, 255, 160, 156) # green tile
    +      end
    +    end
    +  end
    +  
    +  # Allows the player to move their box around the screen
    +  def move_player args, *vector
    +    box = args.state.player.shift_rect(vector) # box is able to move at an angle
    +  
    +    # If the player's box hits a wall, it is not able to move further in that direction
    +    return if args.state.walls
    +                  .any_intersect_rect?(box)
    +  
    +    # Player's box is able to move at angles (not just the four general directions) fast
    +    args.state.player =
    +      args.state.player
    +          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then
    +                      vector.y * args.state.player_speed) # the box will move extremely slow
    +  end
    +
    +#+end_src
    +
    +*** Crafting - Farming Game Starting Point - repl.rb
    +#+begin_src ruby
    +  # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb
    +  # ===============================================================
    +  # Welcome to repl.rb
    +  # ===============================================================
    +  # You can experiement with code within this file. Code in this
    +  # file is only executed when you save (and only excecuted ONCE).
    +  # ===============================================================
    +  
    +  # ===============================================================
    +  # REMOVE the "x" from the word "xrepl" and save the file to RUN
    +  # the code in between the do/end block delimiters.
    +  # ===============================================================
    +  
    +  # ===============================================================
    +  # ADD the "x" to the word "repl" (make it xrepl) and save the
    +  # file to IGNORE the code in between the do/end block delimiters.
    +  # ===============================================================
    +  
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "The result of 1 + 2 is: #{1 + 2}"
    +  end
    +  
    +  # ====================================================================================
    +  # Ruby Crash Course:
    +  # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays
    +  # ====================================================================================
    +  
    +  # ====================================================================================
    +  #  Strings
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    message = "Hello World"
    +    puts "The value of message is: " + message
    +    puts "Any value can be interpolated within a string using \#{}."
    +    puts "Interpolated message: #{message}."
    +    puts 'This #{message} is not interpolated because the string uses single quotes.'
    +  end
    +  
    +  # ====================================================================================
    +  #  Numerics
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    a = 10
    +    puts "The value of a is: #{a}"
    +    puts "a + 1 is: #{a + 1}"
    +    puts "a / 3 is: #{a / 3}"
    +  end
    +  
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    b = 10.12
    +    puts "The value of b is: #{b}"
    +    puts "b + 1 is: #{b + 1}"
    +    puts "b as an integer is: #{b.to_i}"
    +    puts ''
    +  end
    +  
    +  # ====================================================================================
    +  #  Booleans
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    c = 30
    +    puts "The value of c is #{c}."
    +  
    +    if c
    +      puts "This if statement ran because c is truthy."
    +    end
    +  end
    +  
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    d = false
    +    puts "The value of d is #{d}."
    +  
    +    if !d
    +      puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."
    +    end
    +  
    +    e = nil
    +    puts "Nil is also considered falsey. The value of e is: #{e}."
    +  
    +    if !e
    +      puts "This if statement ran because e is nil (a falsey value)."
    +    end
    +  end
    +  
    +  # ====================================================================================
    +  #  Conditionals
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    i_am_true  = true
    +    i_am_nil   = nil
    +    i_am_false = false
    +    i_am_hi    = "hi"
    +  
    +    puts "======== if statement"
    +    i_am_one = 1
    +    if i_am_one
    +      puts "This was printed because i_am_one is truthy."
    +    end
    +  
    +    puts "======== if/else statement"
    +    if i_am_false
    +      puts "This will NOT get printed because i_am_false is false."
    +    else
    +      puts "This was printed because i_am_false is false."
    +    end
    +  
    +    puts "======== if/elsif/else statement"
    +    if i_am_false
    +      puts "This will NOT get printed because i_am_false is false."
    +    elsif i_am_true
    +      puts "This was printed because i_am_true is true."
    +    else
    +      puts "This will NOT get printed i_am_true was true."
    +    end
    +  
    +    puts "======== case statement "
    +    i_am_one = 1
    +    case i_am_one
    +    when 10
    +      puts "case equaled: 10"
    +    when 9
    +      puts "case equaled: 9"
    +    when 5
    +      puts "case equaled: 5"
    +    when 1
    +      puts "case equaled: 1"
    +    else
    +      puts "Value wasn't cased."
    +    end
    +  
    +    puts "======== different types of comparisons"
    +    if 4 == 4
    +      puts "equal (4 == 4)"
    +    end
    +  
    +    if 4 != 3
    +      puts "not equal (4 != 3)"
    +    end
    +  
    +    if 3 < 4
    +      puts "less than (3 < 4)"
    +    end
    +  
    +    if 4 > 3
    +      puts "greater than (4 > 3)"
    +    end
    +  
    +    if ((4 > 3) || (3 < 4) || false)
    +      puts "or statement ((4 > 3) || (3 < 4) || false)"
    +    end
    +  
    +    if ((4 > 3) && (3 < 4))
    +      puts "and statement ((4 > 3) && (3 < 4))"
    +    end
    +  end
    +  
    +  # ====================================================================================
    +  # Looping
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "======== times block"
    +    3.times do |i|
    +      puts i
    +    end
    +    puts "======== range block exclusive"
    +    (0...3).each do |i|
    +      puts i
    +    end
    +    puts "======== range block inclusive"
    +    (0..3).each do |i|
    +      puts i
    +    end
    +  end
    +  
    +  # ====================================================================================
    +  #  Enumerables
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "======== array each"
    +    colors = ["red", "blue", "yellow"]
    +    colors.each do |color|
    +      puts color
    +    end
    +  
    +    puts '======== array each_with_index'
    +    colors = ["red", "blue", "yellow"]
    +    colors.each_with_index do |color, i|
    +      puts "#{color} at index #{i}"
    +    end
    +  end
    +  
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "======== single parameter function"
    +    def add_one_to n
    +      n + 5
    +    end
    +  
    +    puts add_one_to(3)
    +  
    +    puts "======== function with default value"
    +    def function_with_default_value v = 10
    +      v * 10
    +    end
    +  
    +    puts "passing three: #{function_with_default_value(3)}"
    +    puts "passing nil: #{function_with_default_value}"
    +  
    +    puts "======== Or Equal (||=) operator for nil values"
    +    def function_with_nil_default_with_local a = nil
    +      result   = a
    +      result ||= "or equal operator was exected and set a default value"
    +    end
    +  
    +    puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"
    +    puts "passing nil: #{function_with_nil_default_with_local}"
    +  end
    +  
    +  # ====================================================================================
    +  #  Arrays
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "======== Create an array with the numbers 1 to 10."
    +    one_to_ten = (1..10).to_a
    +    puts one_to_ten
    +  
    +    puts "======== Create a new array that only contains even numbers from the previous array."
    +    one_to_ten = (1..10).to_a
    +    evens = one_to_ten.find_all do |number|
    +      number % 2 == 0
    +    end
    +    puts evens
    +  
    +    puts "======== Create a new array that rejects odd numbers."
    +    one_to_ten = (1..10).to_a
    +    also_even = one_to_ten.reject do |number|
    +      number % 2 != 0
    +    end
    +    puts also_even
    +  
    +    puts "======== Create an array that doubles every number."
    +    one_to_ten = (1..10).to_a
    +    doubled = one_to_ten.map do |number|
    +      number * 2
    +    end
    +    puts doubled
    +  
    +    puts "======== Create an array that selects only odd numbers and then multiply those by 10."
    +    one_to_ten = (1..10).to_a
    +    odd_doubled = one_to_ten.find_all do |number|
    +      number % 2 != 0
    +    end.map do |odd_number|
    +      odd_number * 10
    +    end
    +    puts odd_doubled
    +  
    +    puts "======== All combination of numbers 1 to 10."
    +    one_to_ten = (1..10).to_a
    +    all_combinations = one_to_ten.product(one_to_ten)
    +    puts all_combinations
    +  
    +    puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."
    +    one_to_ten = (1..10).to_a
    +    uniq_combinations =
    +      one_to_ten.product(one_to_ten)
    +        .map do |unsorted_number|
    +      unsorted_number.sort
    +    end.uniq
    +    puts uniq_combinations
    +  end
    +  
    +  # ====================================================================================
    +  #  Advanced Arrays
    +  # ====================================================================================
    +  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
    +  xrepl do
    +    puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."
    +  
    +    one_to_hundred = (1..40).to_a
    +    triples =
    +      one_to_hundred.product(one_to_hundred).map do |width, height|
    +      [width, height, Math.sqrt(width ** 2 + height ** 2)]
    +    end.find_all do |_, _, hypotenuse|
    +      hypotenuse.to_i == hypotenuse
    +    end.map do |triangle|
    +      triangle.map(&:to_i)
    +    end.uniq do |triangle|
    +      triangle.sort
    +    end.map do |width, height, hypotenuse|
    +      [width, height, hypotenuse, (width * height) / 2]
    +    end.sort_by do |_, _, _, area|
    +      area
    +    end
    +  
    +    triples.each do |width, height, hypotenuse, area|
    +      puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"
    +    end
    +  end
    +
    +#+end_src
    +
    +*** Crafting - Farming Game Starting Point - tests.rb
    +#+begin_src ruby
    +  # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb
    +  # For advanced users:
    +  # You can put some quick verification tests here, any method
    +  # that starts with the `test_` will be run when you save this file.
    +  
    +  # Here is an example test and game
    +  
    +  # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick
    +  
    +  class MySuperHappyFunGame
    +    attr_gtk
    +  
    +    def tick
    +      outputs.solids << [100, 100, 300, 300]
    +    end
    +  end
    +  
    +  def test_universe args, assert
    +    game = MySuperHappyFunGame.new
    +    game.args = args
    +    game.tick
    +    assert.true!  args.outputs.solids.length == 1, "failure: a solid was not added after tick"
    +    assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"
    +    puts "test_universe completed successfully"
    +  end
    +  
    +  puts "running tests"
    +  $gtk.reset 100
    +  $gtk.log_level = :off
    +  $gtk.tests.start
    +
    +#+end_src
    +
     *** Dev Tools - Add Buttons To Console - main.rb
     #+begin_src ruby
       # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb
    @@ -24515,12 +25713,12 @@ Follows is a source code listing for all files that have been open sourced. This
             label = { x: b.x + state.buttons_frame_selection.size.half,
                       y: b.y,
                       text: "#{i + 1}", r: 180, g: 180, b: 180,
    -                  size_enum: -4, alignment_enum: 1 }.label
    +                  size_enum: -4, alignment_enum: 1 }.label!
       
    -        selection_border = b.merge(r: 40, g: 40, b: 40).border
    +        selection_border = b.merge(r: 40, g: 40, b: 40).border!
       
             if i == state.animation_frames_selected_index
    -          selection_border = b.merge(r: 40, g: 230, b: 200).border
    +          selection_border = b.merge(r: 40, g: 230, b: 200).border!
             end
       
             [selection_border, label]
    @@ -25257,6 +26455,528 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** Dungeon Crawl - Classics Jam - main.rb
    +#+begin_src ruby
    +  # ./samples/99_genre_dungeon_crawl/classics_jam/app/main.rb
    +  class Game
    +    attr_gtk
    +  
    +    def tick
    +      defaults
    +      render
    +      input
    +      calc
    +    end
    +  
    +    def defaults
    +      player.x              ||= 640
    +      player.y              ||= 360
    +      player.w              ||= 16
    +      player.h              ||= 16
    +      player.attacked_at    ||= -1
    +      player.angle          ||= 0
    +      player.future_player  ||= future_player_position 0, 0
    +      player.projectiles    ||= []
    +      player.damage         ||= 0
    +      state.level           ||= create_level level_one_template
    +    end
    +  
    +    def render
    +      outputs.sprites << level.walls.map do |w|
    +        w.merge(path: 'sprites/square/gray.png')
    +      end
    +  
    +      outputs.sprites << level.spawn_locations.map do |s|
    +        s.merge(path: 'sprites/square/blue.png')
    +      end
    +  
    +      outputs.sprites << player.projectiles.map do |p|
    +        p.merge(path: 'sprites/square/blue.png')
    +      end
    +  
    +      outputs.sprites << level.enemies.map do |e|
    +        e.merge(path: 'sprites/square/red.png')
    +      end
    +  
    +      outputs.sprites << player.merge(path: 'sprites/circle/green.png', angle: player.angle)
    +  
    +      outputs.labels << { x: 30, y: 30.from_top, text: "damage: #{player.damage || 0}" }
    +    end
    +  
    +    def input
    +      player.angle = inputs.directional_angle || player.angle
    +      if inputs.controller_one.key_down.a || inputs.keyboard.key_down.space
    +        player.attacked_at = state.tick_count
    +      end
    +    end
    +  
    +    def calc
    +      calc_player
    +      calc_projectiles
    +      calc_enemies
    +      calc_spawn_locations
    +    end
    +  
    +    def calc_player
    +      if player.attacked_at == state.tick_count
    +        player.projectiles << { at: state.tick_count,
    +                                x: player.x,
    +                                y: player.y,
    +                                angle: player.angle,
    +                                w: 4,
    +                                h: 4 }.center_inside_rect(player)
    +      end
    +  
    +      if player.attacked_at.elapsed_time > 5
    +        future_player = future_player_position inputs.left_right * 2, inputs.up_down * 2
    +        future_player_collision = future_collision player, future_player, level.walls
    +        player.x = future_player_collision.x if !future_player_collision.dx_collision
    +        player.y = future_player_collision.y if !future_player_collision.dy_collision
    +      end
    +    end
    +  
    +    def calc_projectile_collisions entities
    +      entities.each do |e|
    +        e.damage ||= 0
    +        player.projectiles.each do |p|
    +          if !p.collided && (p.intersect_rect? e)
    +            p.collided = true
    +            e.damage  += 1
    +          end
    +        end
    +      end
    +    end
    +  
    +    def calc_projectiles
    +      player.projectiles.map! do |p|
    +        dx, dy = p.angle.vector 10
    +        p.merge(x: p.x + dx, y: p.y + dy)
    +      end
    +  
    +      calc_projectile_collisions level.walls + level.enemies + level.spawn_locations
    +      player.projectiles.reject! { |p| p.at.elapsed_time > 10000 }
    +      player.projectiles.reject! { |p| p.collided }
    +      level.enemies.reject! { |e| e.damage > e.hp }
    +      level.spawn_locations.reject! { |s| s.damage > s.hp }
    +    end
    +  
    +    def calc_enemies
    +      level.enemies.map! do |e|
    +        dx =  0
    +        dx =  1 if e.x < player.x
    +        dx = -1 if e.x > player.x
    +        dy =  0
    +        dy =  1 if e.y < player.y
    +        dy = -1 if e.y > player.y
    +        future_e           = future_entity_position dx, dy, e
    +        future_e_collision = future_collision e, future_e, level.enemies + level.walls
    +        e.next_x = e.x
    +        e.next_y = e.y
    +        e.next_x = future_e_collision.x if !future_e_collision.dx_collision
    +        e.next_y = future_e_collision.y if !future_e_collision.dy_collision
    +        e
    +      end
    +  
    +      level.enemies.map! do |e|
    +        e.x = e.next_x
    +        e.y = e.next_y
    +        e
    +      end
    +  
    +      level.enemies.each do |e|
    +        player.damage += 1 if e.intersect_rect? player
    +      end
    +    end
    +  
    +    def calc_spawn_locations
    +      level.spawn_locations.map! do |s|
    +        s.merge(countdown: s.countdown - 1)
    +      end
    +      level.spawn_locations
    +           .find_all { |s| s.countdown.neg? }
    +           .each do |s|
    +        s.countdown = s.rate
    +        s.merge(countdown: s.rate)
    +        new_enemy = create_enemy s
    +        if !(level.enemies.find { |e| e.intersect_rect? new_enemy })
    +          level.enemies << new_enemy
    +        end
    +      end
    +    end
    +  
    +    def create_enemy spawn_location
    +      to_cell(spawn_location.ordinal_x, spawn_location.ordinal_y).merge hp: 2
    +    end
    +  
    +    def create_level level_template
    +      {
    +        walls:           level_template.walls.map { |w| to_cell(w.ordinal_x, w.ordinal_y).merge(w) },
    +        enemies:         [],
    +        spawn_locations: level_template.spawn_locations.map { |s| to_cell(s.ordinal_x, s.ordinal_y).merge(s) }
    +      }
    +    end
    +  
    +    def level_one_template
    +      {
    +        walls:           [{ ordinal_x: 25, ordinal_y: 20},
    +                          { ordinal_x: 25, ordinal_y: 21},
    +                          { ordinal_x: 25, ordinal_y: 22},
    +                          { ordinal_x: 25, ordinal_y: 23}],
    +        spawn_locations: [{ ordinal_x: 10, ordinal_y: 10, rate: 120, countdown: 0, hp: 5 }]
    +      }
    +    end
    +  
    +    def player
    +      state.player ||= {}
    +    end
    +  
    +    def level
    +      state.level  ||= {}
    +    end
    +  
    +    def future_collision entity, future_entity, others
    +      dx_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dx) }
    +      dy_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dy) }
    +  
    +      {
    +        dx_collision: dx_collision,
    +        x: future_entity.dx.x,
    +        dy_collision: dy_collision,
    +        y: future_entity.dy.y
    +      }
    +    end
    +  
    +    def future_entity_position dx, dy, entity
    +      {
    +        dx:   entity.merge(x: entity.x + dx),
    +        dy:   entity.merge(y: entity.y + dy),
    +        both: entity.merge(x: entity.x + dx, y: entity.y + dy)
    +      }
    +    end
    +  
    +    def future_player_position  dx, dy
    +      future_entity_position dx, dy, player
    +    end
    +  
    +    def to_cell ordinal_x, ordinal_y
    +      { x: ordinal_x * 16, y: ordinal_y * 16, w: 16, h: 16 }
    +    end
    +  end
    +  
    +  def tick args
    +    $game ||= Game.new
    +    $game.args = args
    +    $game.tick
    +  end
    +  
    +  $gtk.reset
    +  $game = nil
    +
    +#+end_src
    +
    +*** Fighting - Special Move Inputs - main.rb
    +#+begin_src ruby
    +  # ./samples/99_genre_fighting/01_special_move_inputs/app/main.rb
    +  def tick args
    +    #tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    +    defaults args
    +    render args
    +    input args
    +    calc args
    +  end
    +  
    +  # sets default values and creates empty collections
    +  # initialization only happens in the first frame
    +  def defaults args
    +    fiddle args
    +  
    +    args.state.tick_count = args.state.tick_count
    +    args.state.bridge_top = 128
    +    args.state.player.x  ||= 0                        # initializes player's properties
    +    args.state.player.y  ||= args.state.bridge_top
    +    args.state.player.w  ||= 64
    +    args.state.player.h  ||= 64
    +    args.state.player.dy ||= 0
    +    args.state.player.dx ||= 0
    +    args.state.player.r  ||= 0
    +    args.state.game_over_at ||= 0
    +    args.state.animation_time ||=0
    +  
    +    args.state.timeleft ||=0
    +    args.state.timeright ||=0
    +    args.state.lastpush ||=0
    +  
    +    args.state.inputlist ||=  ["j","k","l"]
    +  end
    +  
    +  # sets enemy, player, hammer values
    +  def fiddle args
    +    args.state.gravity                     = -0.5
    +    args.state.player_jump_power           = 10      # sets player values
    +    args.state.player_jump_power_duration  = 5
    +    args.state.player_max_run_speed        = 20
    +    args.state.player_speed_slowdown_rate  = 0.9
    +    args.state.player_acceleration         = 0.9
    +  end
    +  
    +  # outputs objects onto the screen
    +  def render args
    +    if (args.state.player.dx < 0.01) && (args.state.player.dx > -0.01)
    +      args.state.player.dx = 0
    +    end
    +  
    +    #move list
    +    (args.layout.rect_group row: 0, col_from_right: 8, drow: 0.3,
    +                            merge: { vertical_alignment_enum: 0, size_enum: -2 },
    +                            group: [
    +                              { text: "move:             WASD" },
    +                              { text: "jump:             Space" },
    +                              { text: "attack forwards:  J (while on ground" },
    +                              { text: "attack upwards:   K (while on groud)" },
    +                              { text: "attack backwards: J (while on ground and holding A)" },
    +                              { text: "attack downwards: K (while in air)" },
    +                              { text: "dash attack:      J, K in quick succession." },
    +                              { text: "shield: hold      J, K at the same time." },
    +                              { text: "dash backwards:   A, A in quick succession." },
    +                            ]).into args.outputs.labels
    +  
    +    # registered moves
    +    args.outputs.labels << { x: 0.to_layout_col,
    +                             y: 0.to_layout_row,
    +                             text: "input history",
    +                             size_enum: -2,
    +                             vertical_alignment_enum: 0 }
    +  
    +    (args.state.inputlist.take(5)).map do |s|
    +      { text: s, size_enum: -2, vertical_alignment_enum: 0 }
    +    end.yield_self do |group|
    +      (args.layout.rect_group row: 0.3, col: 0, drow: 0.3, group: group).into args.outputs.labels
    +    end
    +  
    +  
    +    #sprites
    +    player = [args.state.player.x, args.state.player.y,
    +              args.state.player.w, args.state.player.h,
    +              "sprites/square/white.png",
    +              args.state.player.r]
    +  
    +    playershield = [args.state.player.x - 20, args.state.player.y - 10,
    +                    args.state.player.w + 20, args.state.player.h + 20,
    +                    "sprites/square/blue.png",
    +                    args.state.player.r,
    +                    0]
    +  
    +    playerjab = [args.state.player.x + 32, args.state.player.y,
    +                 args.state.player.w, args.state.player.h,
    +                 "sprites/isometric/indigo.png",
    +                 args.state.player.r,
    +                 0]
    +  
    +    playerupper = [args.state.player.x, args.state.player.y + 32,
    +                   args.state.player.w, args.state.player.h,
    +                   "sprites/isometric/indigo.png",
    +                   args.state.player.r+90,
    +                   0]
    +  
    +    if ((args.state.tick_count - args.state.lastpush) <= 15)
    +      if (args.state.inputlist[0] == "<<")
    +        player = [args.state.player.x, args.state.player.y,
    +                  args.state.player.w, args.state.player.h,
    +                  "sprites/square/yellow.png", args.state.player.r]
    +      end
    +  
    +      if (args.state.inputlist[0] == "shield")
    +        player = [args.state.player.x, args.state.player.y,
    +                  args.state.player.w, args.state.player.h,
    +                  "sprites/square/indigo.png", args.state.player.r]
    +  
    +        playershield = [args.state.player.x - 10, args.state.player.y - 10,
    +                        args.state.player.w + 20, args.state.player.h + 20,
    +                        "sprites/square/blue.png", args.state.player.r, 50]
    +      end
    +  
    +      if (args.state.inputlist[0] == "back-attack")
    +        playerjab = [args.state.player.x - 20, args.state.player.y,
    +                     args.state.player.w - 10, args.state.player.h,
    +                     "sprites/isometric/indigo.png", args.state.player.r, 255]
    +      end
    +  
    +      if (args.state.inputlist[0] == "forward-attack")
    +        playerjab = [args.state.player.x + 32, args.state.player.y,
    +                     args.state.player.w, args.state.player.h,
    +                     "sprites/isometric/indigo.png", args.state.player.r, 255]
    +      end
    +  
    +      if (args.state.inputlist[0] == "up-attack")
    +        playerupper = [args.state.player.x, args.state.player.y + 32,
    +                       args.state.player.w, args.state.player.h,
    +                       "sprites/isometric/indigo.png", args.state.player.r + 90, 255]
    +      end
    +  
    +      if (args.state.inputlist[0] == "dair")
    +        playerupper = [args.state.player.x, args.state.player.y - 32,
    +                       args.state.player.w, args.state.player.h,
    +                       "sprites/isometric/indigo.png", args.state.player.r + 90, 255]
    +      end
    +  
    +      if (args.state.inputlist[0] == "dash-attack")
    +        playerupper = [args.state.player.x, args.state.player.y + 32,
    +                       args.state.player.w, args.state.player.h,
    +                       "sprites/isometric/violet.png", args.state.player.r + 90, 255]
    +  
    +        playerjab = [args.state.player.x + 32, args.state.player.y,
    +                     args.state.player.w, args.state.player.h,
    +                     "sprites/isometric/violet.png", args.state.player.r, 255]
    +      end
    +    end
    +  
    +    args.outputs.sprites << playerjab
    +    args.outputs.sprites << playerupper
    +    args.outputs.sprites << player
    +    args.outputs.sprites << playershield
    +  
    +    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    +      [i * 64, args.state.bridge_top - 64, 64, 64]
    +    end
    +  end
    +  
    +  # Performs calculations to move objects on the screen
    +  def calc args
    +    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    +    args.state.player.x  += args.state.player.dx
    +    args.state.player.y  += args.state.player.dy
    +  
    +    # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    +    args.state.player.dy += args.state.gravity
    +  
    +    # player's y position is either current y position or y position of top of
    +    # bridge, whichever has a greater value
    +    # ensures that the player never goes below the bridge
    +    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
    +  
    +    # player's x position is either the current x position or 0, whichever has a greater value
    +    # ensures that the player doesn't go too far left (out of the screen's scope)
    +    args.state.player.x  = args.state.player.x.greater(0)
    +  
    +    # player is not falling if it is located on the top of the bridge
    +    args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    +    #args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
    +  end
    +  
    +  # Resets the player by changing its properties back to the values they had at initialization
    +  def reset_player args
    +    args.state.player.x = 0
    +    args.state.player.y = args.state.bridge_top
    +    args.state.player.dy = 0
    +    args.state.player.dx = 0
    +    args.state.enemy.hammers.clear # empties hammer collection
    +    args.state.enemy.hammer_queue.clear # empties hammer_queue
    +    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    +  end
    +  
    +  # Processes input from the user to move the player
    +  def input args
    +    if args.state.inputlist.length > 5
    +      args.state.inputlist.pop
    +    end
    +  
    +    should_process_special_move = (args.inputs.keyboard.key_down.j)           ||
    +                                  (args.inputs.keyboard.key_down.k)           ||
    +                                  (args.inputs.keyboard.key_down.a)           ||
    +                                  (args.inputs.keyboard.key_down.d)           ||
    +                                  (args.inputs.controller_one.key_down.y)     ||
    +                                  (args.inputs.controller_one.key_down.x)     ||
    +                                  (args.inputs.controller_one.key_down.left)  ||
    +                                  (args.inputs.controller_one.key_down.right)
    +  
    +    if (should_process_special_move)
    +      if (args.inputs.keyboard.key_down.j && args.inputs.keyboard.key_down.k) ||
    +         (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.y)
    +        args.state.inputlist.unshift("shield")
    +      elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&
    +            (args.state.inputlist[0] == "forward-attack") && ((args.state.tick_count - args.state.lastpush) <= 15)
    +        args.state.inputlist.unshift("dash-attack")
    +        args.state.player.dx = 20
    +      elsif (args.inputs.keyboard.key_down.j && args.inputs.keyboard.a) ||
    +            (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.left)
    +        args.state.inputlist.unshift("back-attack")
    +      elsif ( args.inputs.controller_one.key_down.x || args.inputs.keyboard.key_down.j)
    +        args.state.inputlist.unshift("forward-attack")
    +      elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&
    +            (args.state.player.y > 128)
    +        args.state.inputlist.unshift("dair")
    +      elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y)
    +        args.state.inputlist.unshift("up-attack")
    +      elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) &&
    +            (args.state.inputlist[0] == "<") &&
    +            ((args.state.tick_count - args.state.lastpush) <= 10)
    +        args.state.inputlist.unshift("<<")
    +        args.state.player.dx = -15
    +      elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a)
    +        args.state.inputlist.unshift("<")
    +        args.state.timeleft = args.state.tick_count
    +      elsif (args.inputs.controller_one.key_down.right || args.inputs.keyboard.key_down.d)
    +        args.state.inputlist.unshift(">")
    +      end
    +  
    +      args.state.lastpush = args.state.tick_count
    +    end
    +  
    +    if args.inputs.keyboard.space || args.inputs.controller_one.r2   # if the user presses the space bar
    +      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
    +  
    +      # if the time that has passed since the jump is less than the player's jump duration and
    +      # the player is not falling
    +      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    +        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
    +      end
    +    end
    +  
    +    # if the space bar is in the "up" state (or not being pressed down)
    +    if args.inputs.keyboard.key_up.space || args.inputs.controller_one.key_up.r2
    +      args.state.player.jumped_at = nil # jumped_at is empty
    +      args.state.player.falling = true # the player is falling
    +    end
    +  
    +    if args.inputs.left # if left key is pressed
    +      if args.state.player.dx < -5
    +        args.state.player.dx = args.state.player.dx
    +      else
    +        args.state.player.dx = -5
    +      end
    +  
    +    elsif args.inputs.right # if right key is pressed
    +      if args.state.player.dx > 5
    +        args.state.player.dx = args.state.player.dx
    +      else
    +        args.state.player.dx = 5
    +      end
    +    else
    +      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
    +    end
    +  
    +    if ((args.state.player.dx).abs > 5) #&& ((args.state.tick_count - args.state.lastpush) <= 10)
    +      args.state.player.dx *= 0.95
    +    end
    +  end
    +  
    +  def tick_instructions args, text, y = 715
    +    return if args.state.key_event_occurred
    +    if args.inputs.mouse.click ||
    +       args.inputs.keyboard.directional_vector ||
    +       args.inputs.keyboard.key_down.enter ||
    +       args.inputs.keyboard.key_down.space ||
    +       args.inputs.keyboard.key_down.escape
    +      args.state.key_event_occurred = true
    +    end
    +  
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +  end
    +
    +#+end_src
    +
     *** Lowrez - Nokia 3310 - main.rb
     #+begin_src ruby
       # ./samples/99_genre_lowrez/nokia_3310/app/main.rb
    @@ -25867,7 +27587,7 @@ Follows is a source code listing for all files that have been open sourced. This
             text: text,
             size_enum: -1.5,
             r: 255, g: 255, b: 255
    -      }.label
    +      }.label!
         end
       
         args.outputs.debug << {
    @@ -25877,7 +27597,7 @@ Follows is a source code listing for all files that have been open sourced. This
           size_enum: -0.5,
           alignment_enum: 1,
           r: 255, g: 255, b: 255
    -    }.label
    +    }.label!
       end
       
       def snake_demo args
    @@ -26129,7 +27849,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 240,
                   b: 216,
                   a: 100
    -            }.line
    +            }.line!
               end
       
               (NOKIA_WIDTH + 1).map_with_index do |i|
    @@ -26142,7 +27862,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 240,
                   b: 216,
                   a: 100
    -            }.line
    +            }.line!
               end
       
               @args.state.overlay_rendered = true
    @@ -26894,7 +28614,7 @@ Follows is a source code listing for all files that have been open sourced. This
               g: 128,
               b: 128,
               a: 80
    -        }.line
    +        }.line!
       
             args.outputs.static_debug << {
               x:  LOWREZ_X_OFFSET + (i * 10),
    @@ -26905,7 +28625,7 @@ Follows is a source code listing for all files that have been open sourced. This
               g: 128,
               b: 128,
               a: 80
    -        }.line
    +        }.line!
           end
         end
       
    @@ -26932,7 +28652,7 @@ Follows is a source code listing for all files that have been open sourced. This
             y: 720 - (i * 20),
             text: text,
             size_enum: -1.5
    -      }.label
    +      }.label!
         end
       
         args.outputs.debug << {
    @@ -26941,7 +28661,7 @@ Follows is a source code listing for all files that have been open sourced. This
           text: "INFO: dev mode is currently enabled. Comment out the invocation of ~render_debug~ within the ~tick~ method to hide the debug layer.",
           size_enum: -0.5,
           alignment_enum: 1
    -    }.label
    +    }.label!
       end
       
       $gtk.reset
    @@ -35432,58 +37152,21 @@ Follows is a source code listing for all files that have been open sourced. This
         class Args
           include ArgsDeprecated
           include Serialize
    -  
    -      # Contains information related to input devices and input events.
    -      #
    -      # @return [Inputs]
           attr_accessor :inputs
    -  
    -      # Contains the means to interact with output devices such as the screen.
    -      #
    -      # @return [Outputs]
           attr_accessor :outputs
    -  
    -      # Contains the means to interact with the audio mixer.
    -      #
    -      # @return [Hash]
           attr_accessor :audio
    -  
    -      # Contains display size information to assist in positioning things on the screen.
    -      #
    -      # @return [Grid]
           attr_accessor :grid
    -  
    -      # Provides access to game play recording facilities within Game Toolkit.
    -      #
    -      # @return [Recording]
           attr_accessor :recording
    -  
    -      # Gives you access to geometry related functions.
    -      #
    -      # @return [Geometry]
           attr_accessor :geometry
    -  
           attr_accessor :fn
    -  
    -      # This is where you'll put state associated with your video game.
    -      #
    -      # @return [OpenEntity]
           attr_accessor :state
    -  
    -      # Gives you access to the top level DragonRuby runtime.
    -      #
    -      # @return [Runtime]
    +      attr_accessor :temp_state
           attr_accessor :runtime
           alias_method :gtk, :runtime
    -  
           attr_accessor :passes
    -  
           attr_accessor :wizards
    -  
           attr_accessor :layout
    -  
           attr_accessor :easing
    -  
           attr_accessor :string
       
           def initialize runtime, recording
    @@ -35492,6 +37175,7 @@ Follows is a source code listing for all files that have been open sourced. This
             @audio = {}
             @passes = []
             @state = OpenEntity.new
    +        @temp_state = OpenEntity.new
             @state.tick_count = -1
             @runtime = runtime
             @recording = recording
    @@ -35521,11 +37205,12 @@ Follows is a source code listing for all files that have been open sourced. This
       
           def serialize
             {
    -          state: state.as_hash,
    -          inputs: inputs.serialize,
    -          passes: passes.serialize,
    -          outputs: outputs.serialize,
    -          grid: grid.serialize
    +          state:      state.as_hash,
    +          temp_state: temp_state.as_hash,
    +          inputs:     inputs.serialize,
    +          passes:     passes.serialize,
    +          outputs:    outputs.serialize,
    +          grid:       grid.serialize
             }
           end
       
    @@ -35691,10 +37376,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
       class Assert
         def custom_assertion actual, expected, message = nil
    -      # this tell Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).
    +      # this tells Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).
           @assertion_performed = true
       
    -      # perform your custom logic here and rais an exception to denote a failure.
    +      # perform your custom logic here and raise an exception to denote a failure.
       
           raise "Some Error. #{message}."
         end
    @@ -35704,14 +37389,14 @@ Follows is a source code listing for all files that have been open sourced. This
           attr :assertion_performed
       
       =begin
    -  Us this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).
    +  Use this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).
       =end
           def ok!
             @assertion_performed = true
           end
       
       =begin
    -  Assert if a value is a thruthy value. All assert method take an optional final parameter that is the message to display to the user.
    +  Assert if a value is a truthy value. All assert methods take an optional final parameter that is the message to display to the user.
       
       @example
       
    @@ -35765,7 +37450,7 @@ Follows is a source code listing for all files that have been open sourced. This
             @assertion_performed = true
             if actual != expected
               actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip
    -          message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}.\n#{message}"
    +          message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}\n#{message}"
               raise message
             end
             nil
    @@ -35775,7 +37460,7 @@ Follows is a source code listing for all files that have been open sourced. This
             @assertion_performed = true
             if actual == expected
               actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip
    -          message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}.\n#{message}"
    +          message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}\n#{message}"
               raise message
             end
             nil
    @@ -35830,6 +37515,10 @@ Follows is a source code listing for all files that have been open sourced. This
           args.state
         end
       
    +    def temp_state
    +      args.temp_state
    +    end
    +  
         def inputs
           args.inputs
         end
    @@ -35857,6 +37546,14 @@ Follows is a source code listing for all files that have been open sourced. This
         def layout
           args.layout
         end
    +  
    +    def new_entity entity_type, init_hash = nil, &block
    +      args.state.new_entity entity_type, init_hash, &block
    +    end
    +  
    +    def new_entity_strict entity_type, init_hash = nil, &block
    +      args.state.new_entity_strict entity_type, init_hash, &block
    +    end
       end
     
     #+end_src
    @@ -35903,7 +37600,7 @@ Follows is a source code listing for all files that have been open sourced. This
         attr_accessor :x, :y, :w, :h, :path, :angle, :a, :r, :g, :b, :tile_x,
                       :tile_y, :tile_w, :tile_h, :flip_horizontally,
                       :flip_vertically, :angle_anchor_x, :angle_anchor_y, :id,
    -                  :source_x, :source_y, :source_w, :source_h
    +                  :source_x, :source_y, :source_w, :source_h, :blendmode_enum
       
         def primitive_marker
           :sprite
    @@ -35948,7 +37645,7 @@ Follows is a source code listing for all files that have been open sourced. This
                         :font_style, :menu
       
           def initialize
    -        @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1, line_height: 1.1)
    +        @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)
             @menu = Menu.new self
             @disabled = false
             @log_offset = 0
    @@ -35968,6 +37665,8 @@ Follows is a source code listing for all files that have been open sourced. This
             @text_color = Color.new [255, 255, 255]
             @error_color = Color.new [200, 50, 50]
             @header_color = Color.new [100, 200, 220]
    +        @code_color = Color.new [210, 168, 255]
    +        @comment_color    = Color.new [0, 200, 100]
             @animation_duration = 1.seconds
             @shown_at = -1
             load_history
    @@ -36242,6 +37941,8 @@ Follows is a source code listing for all files that have been open sourced. This
       
               if cmd == 'quit' || cmd == ':wq' || cmd == ':q!' || cmd == ':q' || cmd == ':wqa'
                 $gtk.request_quit
    +          elsif cmd.start_with? ':'
    +            send ((cmd.gsub '-', '_').gsub ':', '')
               else
                 puts "-> #{cmd}"
                 begin
    @@ -36250,13 +37951,19 @@ Follows is a source code listing for all files that have been open sourced. This
                   if $results.nil?
                     puts "=> nil"
                   elsif $results == :console_silent_eval
    +                # do nothing since the console is silent
                   else
                     puts "=> #{$results}"
                   end
                   @last_command_errored = false
                 rescue Exception => e
                   try_search_docs e
    -              puts  "* EXCEPTION: #{e}"
    +              # if an exception is thrown and the bactrace includes something helpful, then show it
    +              if (e.backtrace || []).first && (e.backtrace.first.include? "(eval)")
    +                puts  "* EXCEPTION: #{e}"
    +              else
    +                puts  "* EXCEPTION: #{e}\n#{e.__backtrace_to_org__}"
    +              end
                 end
               end
             end
    @@ -36483,6 +38190,11 @@ Follows is a source code listing for all files that have been open sourced. This
             end
       
             render_log_offset args
    +  
    +        args.outputs.reserved << { x: 10.from_right, y: @bottom + 10,
    +                                   text: "Press CTRL+g or ESCAPE to clear the prompt.",
    +                                   vertical_alignment_enum: 0,
    +                                   alignment_enum: 2, r: 80, g: 80, b: 80 }.label!
           end
       
           def render_log_offset args
    @@ -36505,7 +38217,7 @@ Follows is a source code listing for all files that have been open sourced. This
           end
       
           def include_subdued_markers? text
    -        include_any_words? text, subdued_markers
    +        (text.start_with? "* INFO: ") && (include_any_words? text, subdued_markers)
           end
       
           def include_any_words? text, words
    @@ -36651,8 +38363,32 @@ Follows is a source code listing for all files that have been open sourced. This
             (log_entry.start_with? "**** ")
           end
       
    +      def code? log_entry
    +        (just_symbol? log_entry) || (codeblock_marker? log_entry)
    +      end
    +  
    +      def just_symbol? log_entry
    +        scrubbed = log_entry.gsub("*", "").strip
    +        (scrubbed.start_with? ":") && (!scrubbed.include? " ") && (!scrubbed.include? "=>")
    +      end
    +  
    +      def code_comment? log_entry
    +        return true  if log_entry.strip.start_with?("# ")
    +        return false
    +      end
    +  
    +      def codeblock_marker? log_entry
    +        return true if log_entry.strip.start_with?("#+begin_src")
    +        return true if log_entry.strip.start_with?("#+end_src")
    +        return false
    +      end
    +  
           def color_for_log_entry(log_entry)
    -        if include_row_marker? log_entry
    +        if code? log_entry
    +          @code_color
    +        elsif code_comment? log_entry
    +          @comment_color
    +        elsif include_row_marker? log_entry
               @text_color
             elsif include_error_marker? log_entry
               @error_color
    @@ -36727,6 +38463,10 @@ Follows is a source code listing for all files that have been open sourced. This
               @color
             end
       
    +        def to_s
    +          "GTK::Console::Color #{to_h}"
    +        end
    +  
             def to_h
               { r: @color[0], g: @color[1], b: @color[2], a: @color[3] }
             end
    @@ -36774,7 +38514,7 @@ Follows is a source code listing for all files that have been open sourced. This
                 size_enum: size_enum,
                 alignment_enum: alignment_enum,
                 **color.to_h,
    -          }.label
    +          }.label!
             end
           end
         end
    @@ -36838,7 +38578,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
             def itch_wizard_clicked
               @console.scroll_to_bottom
    -          $wizards.itch.start
    +          $wizards.itch.restart
             end
       
             def docs_clicked
    @@ -36863,6 +38603,7 @@ Follows is a source code listing for all files that have been open sourced. This
                 @buttons = [
                   (button id: :record,      row: 0, col:   9, text: "record gameplay",       method: :record_clicked),
                   (button id: :replay,      row: 0, col:  10, text: "start replay",          method: :replay_clicked),
    +              *custom_buttons
                 ]
               elsif @menu_shown == :hidden
                 @buttons = [
    @@ -36921,8 +38662,8 @@ Follows is a source code listing for all files that have been open sourced. This
                 method: method
               }.let do |entity|
                 primitives = []
    -            primitives << entity[:rect].merge(a: 164).solid
    -            primitives << entity[:rect].merge(r: 255, g: 255, b: 255).border
    +            primitives << entity[:rect].solid!(a: 164)
    +            primitives << entity[:rect].border!(r: 255, g: 255, b: 255)
                 primitives << text.wrapped_lines(5)
                                   .map_with_index do |l, i|
                                     [
    @@ -37023,14 +38764,14 @@ Follows is a source code listing for all files that have been open sourced. This
               return if @cursor_position.zero?
       
               new_pos = @cursor_position - 1
    -          (is_word_boundary? @current_input_str[new_pos]) ? 
    +          (is_word_boundary? @current_input_str[new_pos]) ?
                   (new_pos -= 1 until !(is_word_boundary? @current_input_str[new_pos - 1]) || new_pos.zero?):
                   (new_pos -= 1 until (is_word_boundary? @current_input_str[new_pos - 1]) || new_pos.zero?)
       
               @cursor_position = new_pos
               update_cursor_position_px
             end
    -          
    +  
             def move_cursor_right
               @cursor_position += 1 if @cursor_position < current_input_str.length
               update_cursor_position_px
    @@ -37043,7 +38784,7 @@ Follows is a source code listing for all files that have been open sourced. This
               (is_word_boundary? @current_input_str[new_pos]) ?
                   (new_pos += 1 until !(is_word_boundary? @current_input_str[new_pos]) || (new_pos.equal? str_len)):
                   (new_pos += 1 until (is_word_boundary? @current_input_str[new_pos]) || (new_pos.equal? str_len))
    -          
    +  
               @cursor_position = new_pos
               update_cursor_position_px
             end
    @@ -37126,17 +38867,17 @@ Follows is a source code listing for all files that have been open sourced. This
                 "#{" " * (string_width.length - c.length) } #{c} |"
               end.join
       
    -          # remove seperators between empty values
    +          # remove separators between empty values
               formated_row = formated_row.gsub("  |  ", "     ")
       
               puts formated_row
             end
       
    -        def pretty_print_row_seperator string_width, cell_width, column_width, columns
    +        def pretty_print_row_separator string_width, cell_width, column_width, columns
               # this is a joint: +--------
               column_joint = "+#{"-" * cell_width}"
       
    -          # multiple joints create a row seperator: +----+----+
    +          # multiple joints create a row separator: +----+----+
               puts (column_joint * columns) + "+"
             end
       
    @@ -37145,12 +38886,12 @@ Follows is a source code listing for all files that have been open sourced. This
               args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 0.5,
                                                                  y: y + 5,
                                                                  x2: x + @cursor_position_px + 0.5,
    -                                                             y2: y + @font_style.letter_size.y + 5)
    +                                                             y2: y + @font_style.letter_size.y + 4)
       
               args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 1,
                                                                  y: y + 5,
                                                                  x2: x + @cursor_position_px + 1,
    -                                                             y2: y + @font_style.letter_size.y + 5)
    +                                                             y2: y + @font_style.letter_size.y + 4)
       
               # debugging rectangle for string
               # args.outputs.reserved << (@cursor_color.to_h.merge x: x,
    @@ -37778,7 +39519,7 @@ Follows is a source code listing for all files that have been open sourced. This
               :l1, :r1,
               :l2, :r2,
               :l3, :r3,
    -          :start, :select,
    +          :start, :select, :home,
               :directional_up, :directional_down, :directional_left, :directional_right
             ].freeze
       
    @@ -37786,6 +39527,22 @@ Follows is a source code listing for all files that have been open sourced. This
               attr label
             end
       
    +        def back
    +          @select
    +        end
    +  
    +        def back= value
    +          @select = value
    +        end
    +  
    +        def guide
    +          @home
    +        end
    +  
    +        def guide= value
    +          @home = value
    +        end
    +  
             # Activate a key.
             #
             # @return [void]
    @@ -37834,7 +39591,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
             error_message = <<-S
       * ERROR
    -  The GTK::DirectionalKeys module should only be included in objects that respond to the following api heirarchy:
    +  The GTK::DirectionalKeys module should only be included in objects that respond to the following api hierarchy:
       
       - (#{ directional_methods.join("|") })
       - key_held.(#{ directional_methods.join("|") })
    @@ -37891,6 +39648,12 @@ Follows is a source code listing for all files that have been open sourced. This
             end
           end
       
    +      def directional_angle
    +        return nil unless directional_vector
    +  
    +        Math.atan2(up_down, left_right).to_degrees
    +      end
    +  
           def method_missing m, *args
             # combine the key with ctrl_
             if m.to_s.start_with?("ctrl_")
    @@ -38123,6 +39886,22 @@ Follows is a source code listing for all files that have been open sourced. This
       
       module GTK
         module Geometry
    +      def self.rotate_point point, angle, around = nil
    +        s = Math.sin a.to_radians
    +        c = Math.cos a.to_radians
    +        px = point.x
    +        py = point.y
    +        cx = 0
    +        cy = 0
    +        if around
    +          cx = around.x
    +          cy = around.y
    +        end
    +  
    +        point.merge(x: ((px - cx) * c - (py - cy) * s) + cx,
    +                    y: ((px - cx) * s + (py - cy) * c) + cy)
    +      end
    +  
           # Returns f(t) for a cubic Bezier curve.
           def self.cubic_bezier t, a, b, c, d
             s  = 1 - t
    @@ -38204,7 +39983,7 @@ Follows is a source code listing for all files that have been open sourced. This
           rescue Exception => e
             raise e, <<-S
       * ERROR:
    -  center_inside_rect for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +  center_inside_rect for self #{self} and other_rect #{other_rect}.\n#{e}.
       S
           end
       
    @@ -38221,7 +40000,7 @@ Follows is a source code listing for all files that have been open sourced. This
           rescue Exception => e
             raise e, <<-S
       * ERROR:
    -  center_inside_rect_x for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +  center_inside_rect_x for self #{self} and other_rect #{other_rect}.\n#{e}.
       S
           end
       
    @@ -38238,7 +40017,7 @@ Follows is a source code listing for all files that have been open sourced. This
           rescue Exception => e
             raise e, <<-S
       * ERROR:
    -  center_inside_rect_y for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.
    +  center_inside_rect_y for self #{self} and other_rect #{other_rect}.\n#{e}.
       S
           end
       
    @@ -38247,7 +40026,7 @@ Follows is a source code listing for all files that have been open sourced. This
           end
       
       
    -      # Returns a primitive that is anchored/repositioned based off its retangle.
    +      # Returns a primitive that is anchored/repositioned based off its rectangle.
           # @gtk
           def anchor_rect anchor_x, anchor_y
             current_w = self.w
    @@ -38383,10 +40162,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
           # @gtk
           def self.intersect_rect? rect_one, rect_two, tolerance = 0.1
    -        return false if rect_one.right - tolerance < rect_two.left + tolerance
    -        return false if rect_one.left + tolerance > rect_two.right - tolerance
    -        return false if rect_one.top - tolerance < rect_two.bottom + tolerance
    -        return false if rect_one.bottom + tolerance > rect_two.top - tolerance
    +        return false if ((rect_one.x + rect_one.w) - tolerance) < (rect_two.x + tolerance)
    +        return false if (rect_one.x + tolerance) > ((rect_two.x + rect_two.w) - tolerance)
    +        return false if ((rect_one.y + rect_one.h) - tolerance) < (rect_two.y + tolerance)
    +        return false if (rect_one.y + tolerance) > ((rect_two.y + rect_two.h) - tolerance)
             return true
           rescue Exception => e
             context_help_rect_one = (rect_one.__help_contract_implementation contract_intersect_rect?)[:not_implemented_methods]
    @@ -38414,6 +40193,7 @@ Follows is a source code listing for all files that have been open sourced. This
       - rect_one: #{rect_one}
       - rect_two: #{rect_two}
       #{context_help}
    +  \n#{e}
       S
           end
       
    @@ -38424,14 +40204,14 @@ Follows is a source code listing for all files that have been open sourced. This
             y = y.shift_down(size * anchor_y)
             [x, y, size, size]
           rescue Exception => e
    -        raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}."
    +        raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"
           end
       
           # @gtk
           def self.distance point_one, point_two
             Math.sqrt((point_two.x - point_one.x)**2 + (point_two.y - point_one.y)**2)
           rescue Exception => e
    -        raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}."
    +        raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}.\n#{e}"
           end
       
           # @gtk
    @@ -38440,31 +40220,34 @@ Follows is a source code listing for all files that have been open sourced. This
             d_x = end_point.x - start_point.x
             Math::PI.+(Math.atan2(d_y, d_x)).to_degrees
           rescue Exception => e
    -        raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}."
    +        raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"
           end
       
           # @gtk
           def self.angle_to start_point, end_point
             angle_from end_point, start_point
           rescue Exception => e
    -        raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}."
    +        raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"
           end
       
           # @gtk
           def self.point_inside_circle? point, circle_center_point, radius
             (point.x - circle_center_point.x) ** 2 + (point.y - circle_center_point.y) ** 2 < radius ** 2
           rescue Exception => e
    -        raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}"
    +        raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}.\n#{e}"
           end
       
           # @gtk
           def self.inside_rect? inner_rect, outer_rect, tolerance = 0.0
    +        return nil if !inner_rect
    +        return nil if !outer_rect
    +  
             inner_rect.x     + tolerance >= outer_rect.x     - tolerance &&
    -        inner_rect.right - tolerance <= outer_rect.right + tolerance &&
    +        (inner_rect.x + inner_rect.w) - tolerance <= (outer_rect.x + outer_rect.w) + tolerance &&
             inner_rect.y     + tolerance >= outer_rect.y     - tolerance &&
    -        inner_rect.top   - tolerance <= outer_rect.top   + tolerance
    +        (inner_rect.y + inner_rect.h) - tolerance <= (outer_rect.y + outer_rect.h) + tolerance
           rescue Exception => e
    -        raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}."
    +        raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}.\n#{e}"
           end
       
           # @gtk
    @@ -38499,7 +40282,7 @@ Follows is a source code listing for all files that have been open sourced. This
               return rect
             end
           rescue Exception => e
    -        raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}."
    +        raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"
           end
       
           # @gtk
    @@ -38513,7 +40296,21 @@ Follows is a source code listing for all files that have been open sourced. This
                                          anchor_x: anchor_x,
                                          anchor_y: anchor_y
           rescue Exception => e
    -        raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)]."
    +        raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)].\n#{e}"
    +      end
    +  
    +      def self.rect_to_line rect
    +        l = rect.to_hash.line
    +        l.merge(x2: l.x + l.w - 1,
    +                y2: l.y + l.h)
    +      end
    +  
    +      def self.rect_center_point rect
    +        { x: rect.x + rect.w.half, y: rect.y + rect.h.half }
    +      end
    +  
    +      def rect_center_point
    +        Geometry.rect_center_point self
           end
         end # module Geometry
       end # module GTK
    @@ -38710,6 +40507,14 @@ Follows is a source code listing for all files that have been open sourced. This
           def bottom_right
             [@right, @bottom].point
           end
    +  
    +      def x
    +        0
    +      end
    +  
    +      def y
    +        0
    +      end
         end
       end
     
    @@ -38911,6 +40716,30 @@ Follows is a source code listing for all files that have been open sourced. This
             }
           end
       
    +      def self.method_to_key_hash
    +        return @method_to_key_hash if @method_to_key_hash
    +        @method_to_key_hash = {}
    +        string_representation_overrides ||= {
    +          backspace: '\b'
    +        }
    +        char_to_method_hash.each do |k, v|
    +          v.each do |vi|
    +            t = { char_or_raw_key: k }
    +  
    +            if k.is_a? Numeric
    +              t[:raw_key] = k
    +              t[:string_representation] = "raw_key == #{k}"
    +            else
    +              t[:char] = k
    +              t[:string_representation] = "\"#{k.strip}\""
    +            end
    +  
    +            @method_to_key_hash[vi] = t
    +          end
    +        end
    +        @method_to_key_hash
    +      end
    +  
           def self.char_to_method char, int = nil
             methods = char_to_method_hash[char] || char_to_method_hash[int]
             methods ? methods.dup : [char.to_sym || int]
    @@ -39025,24 +40854,32 @@ Follows is a source code listing for all files that have been open sourced. This
           end
       
           def method_missing m, *args
    -        begin
    -          define_singleton_method(m) do
    -            r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)
    -            clear_key m
    -            return r
    -          end
    +        if KeyboardKeys.method_to_key_hash[m.without_ending_bang]
    +          begin
    +            define_singleton_method(m) do
    +              r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)
    +              clear_key m
    +              return r
    +            end
       
    -          return self.send m
    -        rescue Exception => e
    -          log_important "#{e}"
    +            return self.send m
    +          rescue Exception => e
    +            log_important "#{e}"
    +          end
             end
       
    +        did_you_mean = KeyboardKeys.method_to_key_hash.find_all do |k, v|
    +          k.to_s[0..1] == m.to_s[0..1]
    +        end.map {|k, v| ":#{k} (#{v[:string_representation]})" }
    +        did_you_mean_string = ""
    +        did_you_mean_string = ". Did you mean #{did_you_mean.join ", "}?"
    +  
             raise <<-S
       * ERROR:
    -  There is no member on the keyboard called #{m}. Here is a to_s representation of what's available:
    -  
    -  #{KeyboardKeys.char_to_method_hash.map { |k, v| "[#{k} => #{v.join(",")}]" }.join("  ")}
    +  #{KeyboardKeys.method_to_key_hash.map { |k, v| "** :#{k} #{v.string_representation}" }.join("\n")}
       
    +  There is no key on the keyboard called :#{m}#{did_you_mean_string}.
    +  Full list of available keys =:points_up:=.
       S
           end
       
    @@ -39426,6 +41263,10 @@ Follows is a source code listing for all files that have been open sourced. This
               (controller_one && controller_one.directional_vector)
           end
       
    +      def directional_angle
    +        keyboard.directional_angle || (controller_one && controller_one.directional_angle)
    +      end
    +  
           # Returns a signal indicating right (`1`), left (`-1`), or neither ('0').
           #
           # @return [Integer]
    @@ -39497,19 +41338,12 @@ 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
       # Copyright 2019 DragonRuby LLC
       # MIT License
       # ios_wizard.rb has been released under MIT (*only this file*).
       
    -  class WizardException < Exception
    -    attr_accessor :console_primitives
    -  
    -    def initialize *console_primitives
    -      @console_primitives = console_primitives
    -    end
    -  end
    -  
    -  class IOSWizard
    +  class IOSWizard < Wizard
         def initialize
           @doctor_executed_at = 0
         end
    @@ -39522,23 +41356,45 @@ Follows is a source code listing for all files that have been open sourced. This
           @steps ||= []
         end
       
    -    def steps_development_build
    +    def prerequisite_steps
           [
             :check_for_xcode,
             :check_for_brew,
             :check_for_certs,
    -        :check_for_device,
    -        :check_for_dev_profile,
    +      ]
    +    end
    +  
    +    def app_metadata_retrieval_steps
    +      [
             :determine_team_identifier,
             :determine_app_name,
             :determine_app_id,
    -        :blow_away_temp,
    +      ]
    +    end
    +  
    +    def steps_development_build
    +      [
    +        *prerequisite_steps,
    +  
    +        :check_for_device,
    +        :check_for_dev_profile,
    +  
    +        *app_metadata_retrieval_steps,
    +  
    +        :clear_tmp_directory,
             :stage_app,
    +  
             :development_write_info_plist,
    +  
             :write_entitlements_plist,
             :compile_icons,
    -        :create_payload_directory,
    +        :clear_payload_directory,
    +  
    +        :create_payload_directory_dev,
    +  
    +        :create_payload,
             :code_sign_payload,
    +  
             :create_ipa,
             :deploy
           ]
    @@ -39546,20 +41402,27 @@ Follows is a source code listing for all files that have been open sourced. This
       
         def steps_production_build
           [
    -        :check_for_xcode,
    -        :check_for_brew,
    -        :check_for_certs,
    +        *prerequisite_steps,
    +  
             :check_for_distribution_profile,
    -        :determine_team_identifier,
    -        :determine_app_name,
    -        :determine_app_id,
    -        :blow_away_temp,
    +        :determine_app_version,
    +  
    +        *app_metadata_retrieval_steps,
    +  
    +        :clear_tmp_directory,
             :stage_app,
    +  
             :production_write_info_plist,
    +  
             :write_entitlements_plist,
             :compile_icons,
    -        :create_payload_directory,
    +        :clear_payload_directory,
    +  
    +        :create_payload_directory_prod,
    +  
    +        :create_payload,
             :code_sign_payload,
    +  
             :create_ipa,
             :print_publish_help
           ]
    @@ -39595,6 +41458,8 @@ Follows is a source code listing for all files that have been open sourced. This
           @steps = steps_development_build
           @steps = steps_production_build if @production_build
           @certificate_name = nil
    +      @app_version = opts[:version]
    +      @app_version = "1.0" if @opts[:env] == :dev && !@app_version
           init_wizard_status
           log_info "Starting iOS Wizard so we can deploy to your device."
           @start_at = Kernel.global_tick_count
    @@ -39616,8 +41481,10 @@ Follows is a source code listing for all files that have been open sourced. This
             log "=" * $console.console_text_width
           else
             log_error e.to_s
    +        log e.__backtrace_to_org__
           end
       
    +      init_wizard_status
           $console.set_command "$wizards.ios.start env: :#{@opts[:env]}"
         end
       
    @@ -39724,13 +41591,66 @@ Follows is a source code listing for all files that have been open sourced. This
           return "profiles/development.mobileprovision"
         end
       
    +    def ios_metadata_template
    +      <<-S
    +  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
    +  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
    +  
    +  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
    +  teamid=
    +  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
    +  appid=
    +  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
    +  appname=
    +  S
    +    end
    +  
    +    def ios_metadata
    +      contents = $gtk.read_file 'metadata/ios_metadata.txt'
    +  
    +      if !contents
    +        $gtk.write_file 'metadata/ios_metadata.txt', ios_metadata_template
    +        contents = $gtk.read_file 'metadata/ios_metadata.txt'
    +      end
    +  
    +      kvps = contents.each_line
    +                     .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }
    +                     .map do |l|
    +                       key, value = l.split("=")
    +                       [key.strip.to_sym, value.strip]
    +                     end.flatten
    +      Hash[*kvps]
    +    end
    +  
    +    def game_metadata
    +      contents = $gtk.read_file 'metadata/game_metadata.txt'
    +  
    +      kvps = contents.each_line
    +                     .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }
    +                     .map do |l|
    +                       key, value = l.split("=")
    +                       [key.strip.to_sym, value.strip]
    +                     end.flatten
    +      Hash[*kvps]
    +    end
    +  
    +    def raise_ios_metadata_required
    +      raise WizardException.new(
    +              "* mygame/metadata/ios_metadata.txt needs to be filled out.",
    +              "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",
    +              "Instructions for where the values should come from are within metadata/ios_metadata.txt."
    +            )
    +    end
    +  
         def determine_team_identifier
    -      @team_name = (team_identifier_from_provisioning_profile @opts[:env])
    -      log_info "Team Identifer is: #{@team_name}"
    +      @team_id = (ios_metadata.teamid || "")
    +      raise_ios_metadata_required if @team_id.strip.length == 0
    +      log_info "Team Identifer is: #{@team_id}"
         end
       
         def determine_app_name
    -      @app_name = (provisioning_profile_xml @opts[:env])[:children].first[:children].first[:children][1][:children].first[:data]
    +      @app_name = (ios_metadata.appname || "")
    +      raise_ios_metadata_required if @app_name.strip.length == 0
           log_info "App name is: #{@app_name}."
         end
       
    @@ -39754,36 +41674,9 @@ Follows is a source code listing for all files that have been open sourced. This
           $gtk.parse_xml scrubbed
         end
       
    -    def app_id_from_provisioning_profile environment
    -      application_identifier_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]
    -      (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|
    -        if node[:children] && node[:children][0] && node[:children][0][:data] == "application-identifier"
    -          application_identifier_index = i
    -          break
    -        end
    -      end
    -  
    -      app_id_with_team_identifier = (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][application_identifier_index + 1][:children].first[:data]
    -      team_identifer = team_identifier_from_provisioning_profile environment
    -      app_id_with_team_identifier.gsub "#{team_identifer}.", ""
    -    end
    -  
    -    def team_identifier_from_provisioning_profile environment
    -      team_identifer_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]
    -  
    -      (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|
    -        if node[:children] && node[:children][0] && node[:children][0][:data] == "com.apple.developer.team-identifier"
    -          team_identifer_index = i
    -          break
    -        end
    -      end
    -  
    -      (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][team_identifer_index + 1][:children].first[:data]
    -    end
    -  
         def determine_app_id
    -      @app_id = app_id_from_provisioning_profile @opts[:env]
    -  
    +      @app_id = ios_metadata.appid
    +      raise_ios_metadata_required if @app_id.strip.length == 0
           log_info "App Identifier is set to : #{@app_id}"
         end
       
    @@ -39802,7 +41695,7 @@ Follows is a source code listing for all files that have been open sourced. This
           end
         end
       
    -    def blow_away_temp
    +    def clear_tmp_directory
           sh "rm -rf #{tmp_directory}"
         end
       
    @@ -39943,7 +41836,8 @@ Follows is a source code listing for all files that have been open sourced. This
       
           log_info "Creating Entitlements.plist"
       
    -      $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_name}.#{@app_id}").strip
    +      $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip
    +      $gtk.write_file_root "tmp/ios/Entitlements.txt", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip
       
           sh "/usr/bin/plutil -convert binary1 \"#{tmp_directory}/Entitlements.plist\""
           sh "/usr/bin/plutil -convert xml1 \"#{tmp_directory}/Entitlements.plist\""
    @@ -39981,15 +41875,15 @@ Follows is a source code listing for all files that have been open sourced. This
               CFBundleExecutable
               :app_name
               CFBundleInfoDictionaryVersion
    -          6.0
    +          :app_version
               CFBundlePackageType
               APPL
               CFBundleShortVersionString
    -          5.6
    +          :app_version
               CFBundleSignature
               ????
               CFBundleVersion
    -          5.6
    +          :app_version
               CFBundleIcons
               
                   CFBundlePrimaryIcon
    @@ -40138,13 +42032,13 @@ Follows is a source code listing for all files that have been open sourced. This
               CFBundleIdentifier
               :app_id
               CFBundleInfoDictionaryVersion
    -          6.0
    +          :app_version
               CFBundleName
               :app_name
               CFBundlePackageType
               APPL
               CFBundleShortVersionString
    -          5.2
    +          :app_version
               CFBundleSignature
               ????
               CFBundleSupportedPlatforms
    @@ -40152,7 +42046,7 @@ Follows is a source code listing for all files that have been open sourced. This
                       iPhoneOS
               
               CFBundleVersion
    -          5.2
    +          :app_version
               DTCompiler
               com.apple.compilers.llvm.clang.1_0
               DTPlatformBuild
    @@ -40238,6 +42132,7 @@ Follows is a source code listing for all files that have been open sourced. This
           info_plist_string.gsub!(":app_id", @app_id)
       
           $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip
    +      $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip
       
           @info_plist_written = true
         end
    @@ -40291,13 +42186,13 @@ Follows is a source code listing for all files that have been open sourced. This
               CFBundleIdentifier
               :app_id
               CFBundleInfoDictionaryVersion
    -          6.0
    +          :app_version
               CFBundleName
               :app_name
               CFBundlePackageType
               APPL
               CFBundleShortVersionString
    -          5.2
    +          :app_version
               CFBundleSignature
               ????
               CFBundleSupportedPlatforms
    @@ -40305,7 +42200,7 @@ Follows is a source code listing for all files that have been open sourced. This
                       iPhoneOS
               
               CFBundleVersion
    -          5.2
    +          :app_version
               DTCompiler
               com.apple.compilers.llvm.clang.1_0
               DTPlatformBuild
    @@ -40389,8 +42284,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
           info_plist_string.gsub!(":app_name", @app_name)
           info_plist_string.gsub!(":app_id", @app_id)
    +      info_plist_string.gsub!(":app_version", @app_version)
       
           $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip
    +      $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip
       
           @info_plist_written = true
         end
    @@ -40412,28 +42309,53 @@ Follows is a source code listing for all files that have been open sourced. This
           "#{relative_path}/#{$gtk.cli_arguments[:dragonruby]}"
         end
       
    -    def write_ip_address
    +    def embed_mobileprovision
    +      sh %Q[cp #{@provisioning_profile_path} "#{app_path}/embedded.mobileprovision"]
    +      sh %Q[/usr/bin/plutil -convert binary1 "#{app_path}/Info.plist"]
    +    end
    +  
    +    def clear_payload_directory
    +      sh %Q[rm "#{@app_name}".ipa]
    +      sh %Q[rm -rf "#{app_path}/app"]
    +      sh %Q[rm -rf "#{app_path}/sounds"]
    +      sh %Q[rm -rf "#{app_path}/sprites"]
    +      sh %Q[rm -rf "#{app_path}/data"]
    +      sh %Q[rm -rf "#{app_path}/fonts"]
    +    end
    +  
    +    def stage_app
    +      sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]
    +      sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]
    +      sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]
    +      sh %Q[cp -r "#{root_folder}/data/" "#{app_path}/data/"]
    +      sh %Q[cp -r "#{root_folder}/fonts/" "#{app_path}/fonts/"]
    +    end
    +  
    +    def create_payload
    +      sh %Q[mkdir -p #{tmp_directory}/ipa_root/Payload]
    +      sh %Q[cp -r "#{app_path}" "#{tmp_directory}/ipa_root/Payload"]
    +      sh %Q[chmod -R 755 "#{tmp_directory}/ipa_root/Payload"]
    +    end
    +  
    +    def create_payload_directory_dev
    +      # write dev machine's ip address for hotloading
           $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip
    +  
    +      embed_mobileprovision
    +      clear_payload_directory
    +      stage_app
         end
       
    -    def create_payload_directory
    -      sh "cp #{@provisioning_profile_path} \"#{app_path}/embedded.mobileprovision\""
    -      sh "/usr/bin/plutil -convert binary1 \"#{app_path}/Info.plist\""
    -      write_ip_address
    -      sh "rm \"#{@app_name}\".ipa"
    -      sh "rm -rf \"#{app_path}/app\""
    -      sh "rm -rf \"#{app_path}/sounds\""
    -      sh "rm -rf \"#{app_path}/sprites\""
    -      sh "rm -rf \"#{app_path}/data\""
    -      sh "rm -rf \"#{app_path}/fonts\""
    -      sh "cp -r \"#{root_folder}/app/\" \"#{app_path}/app/\""
    -      sh "cp -r \"#{root_folder}/sounds/\" \"#{app_path}/sounds/\""
    -      sh "cp -r \"#{root_folder}/sprites/\" \"#{app_path}/sprites/\""
    -      sh "cp -r \"#{root_folder}/data/\" \"#{app_path}/data/\""
    -      sh "cp -r \"#{root_folder}/fonts/\" \"#{app_path}/fonts/\""
    -      sh "mkdir -p #{tmp_directory}/ipa_root/Payload"
    -      sh "cp -r \"#{app_path}\" \"#{tmp_directory}/ipa_root/Payload\""
    -      sh "chmod -R 755 \"#{tmp_directory}/ipa_root/Payload\""
    +    def create_payload_directory_prod
    +      # production builds does not hotload ip address
    +      sh %Q[rm "#{root_folder}/app/server_ip_address.txt"]
    +  
    +      embed_mobileprovision
    +      stage_app
    +  
    +      # production build marker
    +      sh %Q[mkdir -p "#{app_path}/metadata/"]
    +      sh %Q[touch metadata/DRAGONRUBY_PRODUCTION_BUILD]
         end
       
         def create_ipa
    @@ -40466,10 +42388,22 @@ Follows is a source code listing for all files that have been open sourced. This
         end
       
         def print_publish_help
    -        log_info "Go to https://appstoreconnect.apple.com/apps and create an App if you haven't already done so."
    -        log_info "Go to https://appleid.apple.com and create a 'Application Specific Password'."
    -        log_info "To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."
    -        log_info "Your app is located at ./tmp/ios/#{@app_name}.ipa"
    +      has_transporter = (sh "ls /Applications/Transporter.app").include? "Contents"
    +      if !has_transporter
    +        $gtk.openurl "https://apps.apple.com/us/app/transporter/id1450874784?mt=12"
    +        $console.set_command "$wizards.ios.start env: :#{@opts[:env]}, version: \"#{@opts[:version]}\""
    +        raise WizardException.new(
    +          "* To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."
    +        )
    +      else
    +        sh "mkdir ./tmp/ios/intermediary_artifacts"
    +        sh "mv \"#{tmp_directory}/#{@app_name}.app\" #{tmp_directory}/intermediary_artifacts/"
    +        sh "mv \"#{tmp_directory}/do_zip.sh\" #{tmp_directory}/intermediary_artifacts"
    +        sh "mv \"#{tmp_directory}/Entitlements.plist\" #{tmp_directory}/intermediary_artifacts"
    +        sh "mv \"#{tmp_directory}/ipa_root\" #{tmp_directory}/intermediary_artifacts/"
    +        sh "open /Applications/Transporter.app"
    +        sh "open ./tmp/ios/"
    +      end
         end
       
         def compile_icons
    @@ -40490,6 +42424,26 @@ Follows is a source code listing for all files that have been open sourced. This
           sh "cp -r \"#{root_folder}/native/\" \"#{app_path}/native/\""
           sh "CODESIGN_ALLOCATE=\"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate\" /usr/bin/codesign -f -s \"#{@certificate_name}\" --entitlements #{tmp_directory}/Entitlements.plist \"#{tmp_directory}/#{@app_name}.app/native/ios-device/ext.dylib\""
         end
    +  
    +    def set_version version
    +      @app_version = version
    +      start env: @opts[:env], version: version
    +    end
    +  
    +    def app_version
    +      log_info "Attempting to retrieve App Version from metadata/ios_metadata.txt."
    +      ios_version_number = (ios_metadata.version || "").strip
    +      if ios_version_number.length == 0
    +        log_info "Not found. Attempting to retrieve App Version from metadata/game_metadata.txt."
    +        ios_version_number = (game_metadata.version || "").strip
    +      end
    +      ios_version_number
    +    end
    +  
    +    def determine_app_version
    +      @app_version = app_version
    +      return if @app_version
    +    end
       end
     
     #+end_src
    @@ -40501,38 +42455,14 @@ Follows is a source code listing for all files that have been open sourced. This
       # MIT License
       # itch_wizard.rb has been released under MIT (*only this file*).
       
    -  class ItchWizard
    +  class ItchWizard < Wizard
         def steps
           [
             :check_metadata,
    -        :deploy
    +        :deploy,
           ]
         end
       
    -    def metadata_file_path
    -      "metadata/game_metadata.txt"
    -    end
    -  
    -    def get_metadata
    -      metadata = $gtk.read_file metadata_file_path
    -  
    -      if !metadata
    -        write_blank_metadata
    -        metadata = $gtk.read_file metadata_file_path
    -      end
    -  
    -      dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    -  
    -      {
    -        dev_id: dev_id.strip,
    -        dev_title: dev_title.strip,
    -        game_id: game_id.strip,
    -        game_title: game_title.strip,
    -        version: version.strip,
    -        icon: icon.strip
    -      }
    -    end
    -  
         def write_blank_metadata
             $gtk.write_file metadata_file_path, <<-S.strip
       #devid=myname
    @@ -40550,7 +42480,7 @@ Follows is a source code listing for all files that have been open sourced. This
             write_blank_metadata
           end
       
    -      if metadata_text.each_line.to_a.length != 6
    +      if metadata_text.strip.each_line.to_a.length < 6
             write_blank_metadata
           end
       
    @@ -40562,70 +42492,67 @@ Follows is a source code listing for all files that have been open sourced. This
       
           if metadata[:dev_id].start_with?("#") || !@dev_id
             log "* PROMPT: Please provide your username for Itch."
    -        $console.set_command "$wizards.itch.set_dev_id \"your-itch-username\""
    +        $console.set_command "$wizards.itch.set_dev_id \"#{metadata[:dev_id]}\""
             return :need_dev_id
           end
       
           if metadata[:dev_title].start_with?("#") || !@dev_title
             log "* PROMPT: Please provide developer's/company's name that you want displayed."
    -        $console.set_command "$wizards.itch.set_dev_title \"Your Name\""
    +        $console.set_command "$wizards.itch.set_dev_title \"#{metadata[:dev_title]}\""
             return :need_dev_title
           end
       
           if metadata[:game_id].start_with?("#") || !@game_id
             log "* PROMPT: Please provide the id for you game. This is the id you specified when you set up a new game page on Itch."
    -        $console.set_command "$wizards.itch.set_game_id \"your-game-id\""
    +        $console.set_command "$wizards.itch.set_game_id \"#{metadata[:game_id]}\""
             return :need_game_id
           end
       
           if metadata[:game_title].start_with?("#") || !@game_title
             log "* PROMPT: Please provide the display name for your game. (This can include spaces)"
    -        $console.set_command "$wizards.itch.set_game_title \"Your Game\""
    +        $console.set_command "$wizards.itch.set_game_title \"#{metadata[:game_title]}\""
             return :need_game_title
           end
       
           if metadata[:version].start_with?("#") || !@version
             log "* PROMPT: Please provide the version for your game."
    -        $console.set_command "$wizards.itch.set_version \"1.0\""
    +        $console.set_command "$wizards.itch.set_version \"#{metadata[:version]}\""
             return :need_version
           end
       
           if metadata[:icon].start_with?("#") || !@icon
             log "* PROMPT: Please provide icon path for your game."
    -        $console.set_command "$wizards.itch.set_icon \"icon.png\""
    +        $console.set_command "$wizards.itch.set_icon \"#{metadata[:icon]}\""
             return :need_icon
           end
       
    +      puts "here!! success!!!"
    +  
           return :success
         end
       
         def set_dev_id value
           @dev_id = value
    -      write_metadata
           start
         end
       
         def set_dev_title value
           @dev_title = value
    -      write_metadata
           start
         end
       
         def set_game_id value
           @game_id = value
    -      write_metadata
           start
         end
       
         def set_game_title value
           @game_title = value
    -      write_metadata
           start
         end
       
         def set_version value
           @version = value
    -      write_metadata
           start
         end
       
    @@ -40668,7 +42595,7 @@ Follows is a source code listing for all files that have been open sourced. This
           end
       
           if @icon
    -        text += "icon=metadata/#{@icon}\n"
    +        text += "icon=#{@icon}\n"
           else
             text += "#icon=metadata/icon.png\n"
           end
    @@ -40686,10 +42613,25 @@ Follows is a source code listing for all files that have been open sourced. This
       
         def deploy
           log_info "* Running dragonruby-publish: #{package_command}"
    -      results = $gtk.exec package_command
    +      $gtk.openurl "http://itch.io/dashboard" if $gtk.platform == "Mac OS X"
    +      if $gtk.platform? :mac
    +        $gtk.exec "rm -rf ./builds"
    +      end
    +      results = $gtk.exec "#{package_command} --only-package"
    +      puts File.expand_path("./builds")
    +  
           log "#+begin_src"
           log results
           log "#+end_src"
    +  
    +      if $gtk.platform? :mac
    +        $gtk.exec "open ./builds/"
    +      elsif $gtk.platform? :windows
    +        $gtk.exec "powershell \"ii .\""
    +      end
    +  
    +      $gtk.openurl "https://itch.io/dashboard"
    +  
           :success
         end
       
    @@ -40700,7 +42642,7 @@ Follows is a source code listing for all files that have been open sourced. This
           steps.each do |m|
             begin
               log_info "Running Itch Wizard Step: ~$wizards.itch.#{m}~"
    -          result = (send m) || :success if @wizard_status[m][:result] != :success
    +          result = (send m) || :success
               @wizard_status[m][:result] = result
               if result != :success
                 log_info "Exiting wizard. :#{result}"
    @@ -41049,10 +42991,18 @@ Follows is a source code listing for all files that have been open sourced. This
             device.grid_area.row_count
           end
       
    +      def row_max_index
    +        row_count - 1
    +      end
    +  
           def col_count
             device.grid_area.col_count
           end
       
    +      def col_max_index
    +        col_count - 1
    +      end
    +  
           def gutter_height
             device.grid_area.gutter
           end
    @@ -41075,18 +43025,124 @@ Follows is a source code listing for all files that have been open sourced. This
       
           def rect_defaults
             {
    -          row: nil,
    -          col: nil,
    -          h:   1,
    -          w:   1,
    -          dx:  0,
    -          dy:  0,
    -          rect: :control_rect
    +          row:      nil,
    +          col:      nil,
    +          h:        1,
    +          w:        1,
    +          dx:       0,
    +          dx_ratio: 1,
    +          dy:       0,
    +          dy_ratio: 1,
    +          dh_ratio: 1,
    +          dw_ratio: 1,
    +          merge:    nil,
    +          rect:     :control_rect
             }
           end
       
    -      def rect opts
    +      def row n
    +        (rect row: n, col: 0, w: 0, h: 0).x
    +      end
    +  
    +      def row_from_bottom n
    +        (rect row: row_count - n, col: 0, w: 0, h: 0).x
    +      end
    +  
    +      def col n
    +        (rect row: 0, col: n, w: 0, h: 0).y
    +      end
    +  
    +      def col_from_right n
    +        (rect row: 0, col: col_max_index - n, w: 0, h: 0).y
    +      end
    +  
    +      def w n
    +        (rect row: 0, col: 0, w: n, h: 1).w
    +      end
    +  
    +      def h n
    +        (rect row: 0, col: 0, w: 1, h: n).h
    +      end
    +  
    +      def rect_group opts
    +        group = opts.group
    +        r     = opts.row || 0
    +        r     = row_max_index - opts.row_from_bottom if opts.row_from_bottom
    +        c     = opts.col || 0
    +        c     = col_max_index - opts.col_from_right  if opts.col_from_right
    +        drow  = opts.drow || 0
    +        dcol  = opts.dcol || 0
    +        w     = opts.w    || 0
    +        h     = opts.h    || 0
    +        merge = opts[:merge]
    +  
    +        running_row = r
    +        running_col = c
    +  
    +        running_col = calc_col_offset(opts.col_offset) if opts.col_offset
    +        running_row = calc_row_offset(opts.row_offset) if opts.row_offset
    +  
    +        group.map do |i|
    +          group_layout_opts = i.layout || {}
    +          group_layout_opts = group_layout_opts.merge row: running_row,
    +                                                      col: running_col,
    +                                                      merge: merge,
    +                                                      w: w, h: h
    +          result = (rect group_layout_opts).merge i
    +  
    +          if (i.is_a? Hash) && (i.primitive_marker == :label)
    +            if    i.alignment_enum == 1
    +              result.x += result.w.half
    +            elsif i.alignment_enum == 2
    +              result.x += result.w
    +            end
    +          end
    +  
    +          running_row += drow
    +          running_col += dcol
    +          result
    +        end
    +      end
    +  
    +      def calc_row_offset opts = {}
    +        count = opts[:count] || opts[:length] || 0
    +        h     = opts.h || 1
    +        (row_count - (count * h)) / 2.0
    +      end
    +  
    +      def calc_col_offset opts = {}
    +        count = opts[:count] || opts[:length] || 0
    +        w     = opts.w || 1
    +        (col_count - (count * w)) / 2.0
    +      end
    +  
    +      def point opts = {}
    +        opts.w = 1
    +        opts.h = 1
    +        opts.row ||= 0
    +        opts.col ||= 0
    +        r = rect opts
    +        r.x  += r.w * opts.col_anchor if opts.col_anchor
    +        r.y  += r.h * opts.row_anchor if opts.row_anchor
    +        r
    +      end
    +  
    +      def rect *all_opts
    +        if all_opts.length == 1
    +          opts = all_opts.first
    +        else
    +          opts = {}
    +          all_opts.each do |o|
    +            opts.merge! o
    +          end
    +        end
    +  
    +        opts.row = row_max_index - opts.row_from_bottom if opts.row_from_bottom
    +        opts.col = col_max_index - opts.col_from_right if opts.col_from_right
             opts = rect_defaults.merge opts
    +        opts.row ||= 0
    +        opts.col ||= 0
    +  
             result = send opts[:rect]
             if opts[:row] && opts[:col] && opts[:w] && opts[:h]
               col = rect_col opts[:col], opts[:w]
    @@ -41094,7 +43150,9 @@ Follows is a source code listing for all files that have been open sourced. This
               result = control_rect.merge x: col.x,
                                           y: row.y,
                                           w: col.w,
    -                                      h: row.h
    +                                      h: row.h,
    +                                      center_x: col.center_x,
    +                                      center_y: row.center_y
             elsif opts[:row] && !opts[:col]
               result = rect_row opts[:row], opts[:h]
             elsif !opts[:row] && opts[:col]
    @@ -41132,13 +43190,21 @@ Follows is a source code listing for all files that have been open sourced. This
               result[:h] += device.grid_area.gutter * 2
             end
       
    -        result[:x] += opts[:dx] if opts[:dx]
    -        result[:y] += opts[:dy] if opts[:dy]
    -        result[:w] += opts[:dw] if opts[:dw]
    -        result[:h] += opts[:dh] if opts[:dh]
    +        result[:x] += opts[:dx]       if opts[:dx]
    +        result[:x] *= opts[:dx_ratio] if opts[:dx_ratio]
    +        result[:y] += opts[:dy]       if opts[:dy]
    +        result[:y] *= opts[:dy_ratio] if opts[:dy_ratio]
    +        result[:w] += opts[:dw]       if opts[:dw]
    +        result[:w] *= opts[:dw_ratio] if opts[:dw_ratio]
    +        result[:h] += opts[:dh]       if opts[:dh]
    +        result[:h] *= opts[:dh_ratio] if opts[:dh_ratio]
    +        result.merge! opts[:merge]    if opts[:merge]
             result[:row] = opts[:row]
             result[:col] = opts[:col]
       
    +        result[:h] = result[:h].clamp 0
    +        result[:w] = result[:w].clamp 0
    +  
             if $gtk.args.grid.name == :center
               result[:x] -= 640
               result[:y] -= 360
    @@ -41173,7 +43239,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
             row_y = device.h - row_y - row_h
       
    -        result = control_rect.merge y: row_y, h: row_h
    +        result = control_rect.merge y: row_y, h: row_h, center_y: (row_y + row_h.half)
             @rect_cache[:row][index][h] = result
             @rect_cache[:row][index][h]
           end
    @@ -41196,7 +43262,7 @@ Follows is a source code listing for all files that have been open sourced. This
             col_w = col_w.to_i
             col_w -= 1 if col_w.odd?
       
    -        result = control_rect.merge x: col_x, w: col_w
    +        result = control_rect.merge x: col_x, w: col_w, center_x: (col_x + col_w.half)
             @rect_cache[:col][index][w] = result
             @rect_cache[:col][index][w]
           end
    @@ -41247,6 +43313,26 @@ Follows is a source code listing for all files that have been open sourced. This
             @device
           end
       
    +      def debug_primitives opts = {}
    +        @primitives ||= col_count.map_with_index do |col|
    +                          row_count.map_with_index do |row|
    +                            cell   = rect row: row, col: col
    +                            center = Geometry.rect_center_point cell
    +                            [
    +                              cell.merge(opts).border,
    +                              cell.merge(opts)
    +                                  .label!(x: center.x,
    +                                          y: center.y,
    +                                          text: "#{row},#{col}",
    +                                          size_enum: -3,
    +                                          vertical_alignment_enum: 1,
    +                                          alignment_enum: 1)
    +                            ]
    +                          end
    +                        end
    +                        @primitives
    +      end
    +  
           def serialize
             {
               device: @device.serialize,
    @@ -41260,6 +43346,13 @@ Follows is a source code listing for all files that have been open sourced. This
           def to_s
             serialize.to_s
           end
    +  
    +      def reset
    +        @primitives = nil
    +        @rect_cache ||= {}
    +        @rect_cache.clear
    +      end
    +  
         end
       end
     
    @@ -41399,6 +43492,11 @@ Follows is a source code listing for all files that have been open sourced. This
             self.puts message
           end
       
    +      def self.reset
    +        @once = {}
    +        nil
    +      end
    +  
           def self.puts_once *ids, message
             id = "#{ids}"
             @once ||= {}
    @@ -41535,6 +43633,53 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    +*** metadata.rb
    +#+begin_src ruby
    +  # ./dragon/metadata.rb
    +  # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
    +  # Copyright 2021 DragonRuby LLC
    +  # MIT License
    +  # metadata.rb has been released under MIT (*only this file*).
    +  
    +  module Metadata
    +    def metadata_file_path
    +      "metadata/game_metadata.txt"
    +    end
    +  
    +    def get_metadata
    +      metadata = $gtk.read_file metadata_file_path
    +  
    +      if !metadata
    +        write_blank_metadata
    +        metadata = $gtk.read_file metadata_file_path
    +      end
    +  
    +      dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    +  
    +      {
    +        dev_id: dev_id.strip,
    +        dev_title: dev_title.strip,
    +        game_id: game_id.strip,
    +        game_title: game_title.strip,
    +        version: version.strip,
    +        icon: icon.strip
    +      }
    +    end
    +  
    +    def write_blank_metadata
    +        $gtk.write_file metadata_file_path, <<-S.strip
    +  #devid=myname
    +  #devtitle=My Name
    +  #gameid=mygame
    +  #gametitle=My Game
    +  #version=0.1
    +  #icon=metadata/icon.png
    +  S
    +    end
    +  end
    +
    +#+end_src
    +
     *** numeric.rb
     #+begin_src ruby
       # ./dragon/numeric.rb
    @@ -41553,6 +43698,35 @@ Follows is a source code listing for all files that have been open sourced. This
         alias_method :lte, :<=
         alias_method :__original_eq_eq__, :== unless Numeric.instance_methods.include? :__original_eq_eq__
       
    +    def to_layout_row opts = {}
    +      $layout.rect(row: self,
    +                   col: opts.col || 0,
    +                   w:   opts.w || 0,
    +                   h:   opts.h || 0).y
    +    end
    +  
    +    def to_layout_col opts = {}
    +      $layout.rect(row: 0,
    +                   col: self,
    +                   w:   opts.w || 0,
    +                   h:   opts.h || 0).x
    +    end
    +  
    +    def to_layout_w
    +      $layout.rect(row: 0, col: 0, w: self, h: 1).w
    +    end
    +  
    +    def to_layout_h
    +      $layout.rect(row: 0, col: 0, w: 1, h: self).h
    +    end
    +  
    +    def to_layout_row_from_bottom opts = {}
    +      ($layout.row_max_index - self).to_layout_row opts
    +    end
    +  
    +    def to_layout_col_from_right opts = {}
    +      ($layout.col_max_index - self).to_layout_col opts
    +    end
       
         # Converts a numeric value representing seconds into frames.
         #
    @@ -41568,10 +43742,26 @@ Follows is a source code listing for all files that have been open sourced. This
           self / 2.0
         end
       
    +    def third
    +      self / 3.0
    +    end
    +  
    +    def quarter
    +      self / 4.0
    +    end
    +  
         def to_byte
           clamp(0, 255).to_i
         end
       
    +    def clamp *opts
    +      min = (opts.at 0)
    +      max = (opts.at 1)
    +      return min if min && self < min
    +      return max if max && self > max
    +      return self
    +    end
    +  
         def clamp_wrap min, max
           max, min = min, max if min > max
           return self if self >= min && self <= max
    @@ -41796,7 +43986,7 @@ Follows is a source code listing for all files that have been open sourced. This
           self * Math::PI.fdiv(180)
         end
       
    -    # Converts a number representing an angle in radians to degress.
    +    # Converts a number representing an angle in radians to degrees.
         #
         # @gtk
         def to_degrees
    @@ -41813,21 +44003,21 @@ Follows is a source code listing for all files that have been open sourced. This
           GTK::Geometry.to_square(self, x, y, anchor_x, anchor_y)
         end
       
    -    # Returns a normal vector for a number that represents an angle in degress.
    +    # Returns a normal vector for a number that represents an angle in degrees.
         #
         # @gtk
         def vector max_value = 1
           [vector_x(max_value), vector_y(max_value)]
         end
       
    -    # Returns the y component of a normal vector for a number that represents an angle in degress.
    +    # Returns the y component of a normal vector for a number that represents an angle in degrees.
         #
         # @gtk
         def vector_y max_value = 1
           max_value * Math.sin(self.to_radians)
         end
       
    -    # Returns the x component of a normal vector for a number that represents an angle in degress.
    +    # Returns the x component of a normal vector for a number that represents an angle in degrees.
         #
         # @gtk
         def vector_x max_value = 1
    @@ -41854,6 +44044,18 @@ Follows is a source code listing for all files that have been open sourced. This
           (self % n) == 0
         end
       
    +    def multiply n
    +      self * n
    +    end
    +  
    +    def fmult n
    +      self * n.to_f
    +    end
    +  
    +    def imult n
    +      (self * n).to_i
    +    end
    +  
         def mult n
           self * n
         end
    @@ -41975,12 +44177,6 @@ Follows is a source code listing for all files that have been open sourced. This
           return gt other
         end
       
    -    def == other
    -      return true if __original_eq_eq__ other
    -      return __original_eq_eq__ other.entity_id if other.is_a? OpenEntity
    -      return false
    -    end
    -  
         # @gtk
         def map
           unless block_given?
    @@ -42067,29 +44263,29 @@ Follows is a source code listing for all files that have been open sourced. This
         end
       
         def - other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self - other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :-, e
         end
       
         def + other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self + other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :+, e
         end
       
         def * other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self * other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :*, e
         end
       
         def / other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self / other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :/, e
         end
    @@ -42119,6 +44315,10 @@ Follows is a source code listing for all files that have been open sourced. This
         def self.clamp n, min, max
           n.clamp min, max
         end
    +  
    +    def mid? l, r
    +      (between? l, r) || (between? r, l)
    +    end
       end
       
       class Fixnum
    @@ -42145,39 +44345,33 @@ Follows is a source code listing for all files that have been open sourced. This
         end
       
         def + other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self + other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :+, e
         end
       
         def * other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self * other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :*, e
         end
       
         def / other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self / other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :/, e
         end
       
         def - other
    -      return nil unless other
    -      super
    +      return self unless other
    +      self - other
         rescue Exception => e
           __raise_arithmetic_exception__ other, :-, e
         end
       
    -    def == other
    -      return true if __original_eq_eq__ other
    -      return __original_eq_eq__ other.entity_id if other.is_a? GTK::OpenEntity
    -      return false
    -    end
    -  
         # Returns `-1` if the number is less than `0`. `+1` if the number
         # is greater than `0`. Returns `0` if the number is equal to `0`.
         #
    @@ -42234,28 +44428,28 @@ Follows is a source code listing for all files that have been open sourced. This
         alias_method :__original_divide__,   :- unless Float.instance_methods.include? :__original_divide__
       
         def - other
    -      return nil unless other
    +      return self unless other
           super
         rescue Exception => e
           __raise_arithmetic_exception__ other, :-, e
         end
       
         def + other
    -      return nil unless other
    +      return self unless other
           super
         rescue Exception => e
           __raise_arithmetic_exception__ other, :+, e
         end
       
         def * other
    -      return nil unless other
    +      return self unless other
           super
         rescue Exception => e
           __raise_arithmetic_exception__ other, :*, e
         end
       
         def / other
    -      return nil unless other
    +      return self unless other
           super
         rescue Exception => e
           __raise_arithmetic_exception__ other, :/, e
    @@ -42302,6 +44496,10 @@ Follows is a source code listing for all files that have been open sourced. This
         def nan?
           false
         end
    +  
    +    def center other
    +      (self - other).abs.fdiv(2)
    +    end
       end
     
     #+end_src
    @@ -42358,7 +44556,7 @@ Follows is a source code listing for all files that have been open sourced. This
           def local_state
             @local_state ||= OpenEntity.new
             @local_state.hotload_client ||= @local_state.new_entity(:hotload_client,
    -                                                                notes: "This enitity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",
    +                                                                notes: "This entity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",
                                                                     changes: { },
                                                                     changes_queue: [],
                                                                     reloaded_files_times: [])
    @@ -42534,7 +44732,7 @@ Follows is a source code listing for all files that have been open sourced. This
                 sub_index       = index - previous_line[:sum]
                 word            = (cursor_line[:line][0..sub_index - 1]).strip
                 token           = (word.split " ")[-1]
    -            dots            = (token.split ".")
    +            dots            = (token.split ".").flat_map { |s| s.split "[" }.flat_map { |s| s.split "]" }.flat_map { |s| s.split "(" }.flat_map { |s| s.split ")" }
                 dot             = dots[-1]
               end
       
    @@ -42555,6 +44753,10 @@ Follows is a source code listing for all files that have been open sourced. This
               ignores ||= []
               ignores   = [ignores].flatten
               keys   = keys.map { |k| k.to_s }
    +          keys   = keys.reject { |k| k.include? '"' }
    +                       .reject { |k| k.start_with? "'" }
    +                       .reject { |k| k.include? "," }
    +                       .reject { |k| k.start_with? "#" }
               others = ["def", "end"] +
                        [ :entity_keys_by_ref,
                          :entity_name,
    @@ -42612,6 +44814,10 @@ Follows is a source code listing for all files that have been open sourced. This
       
                 return autocomplete_filter_methods lookup_result.call if lookup_result
       
    +            if dot[0].upcase == dot[0] && (Object.const_defined? dot.to_sym)
    +              return (Object.const_get dot.to_sym).autocomplete_methods
    +            end
    +  
                 start_collecting = false
                 dots_after_state = dots.find_all do |s|
                   if s == "state"
    @@ -42627,10 +44833,16 @@ Follows is a source code listing for all files that have been open sourced. This
                   target = target.as_hash[k.to_sym] if target.respond_to? :as_hash
                 end
       
    -            return autocomplete_filter_methods target.as_hash.keys
    +            if target.respond_to? :as_hash
    +              return autocomplete_filter_methods target.as_hash.keys
    +            else
    +              return autocomplete_filter_methods target.autocomplete_methods
    +            end
               end
       
       
    +          text = text.each_line.reject { |l| l.strip.start_with? "#" }.join "\n"
    +          text = text.each_line.map { |l| l.split("#").first }.join "\n"
               text.gsub!("[", " ")
               text.gsub!("]", " ")
               text.gsub!("(", " ")
    @@ -42647,154 +44859,158 @@ Follows is a source code listing for all files that have been open sourced. This
     
     #+end_src
     
    -*** runtime/draw.rb
    +*** runtime/benchmark.rb
     #+begin_src ruby
    -  # ./dragon/runtime/draw.rb
    +  # ./dragon/runtime/benchmark.rb
       # Copyright 2019 DragonRuby LLC
       # MIT License
    -  # draw.rb has been released under MIT (*only this file*).
    +  # benchmark.rb has been released under MIT (*only this file*).
       
       module GTK
         class Runtime
    -      module Draw
    -        def primitives pass
    -          if $top_level.respond_to? :primitives_override
    -            return $top_level.tick_render @args, pass
    -          end
    -  
    -          # Don't change this draw order unless you understand
    -          # the implications.
    -  
    -          # pass.solids.each            { |s| draw_solid s }
    -          # while loops are faster than each with block
    -          idx = 0
    -          length = pass.solids.length
    -          while idx < pass.solids.length
    -            draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster
    -            idx += 1
    -          end
    -  
    -          # pass.static_solids.each     { |s| draw_solid s }
    +      module Benchmark
    +        def benchmark_single iterations, name, proc
    +          log <<-S
    +  ** Invoking :#{name}...
    +  S
    +          time_start = Time.now
               idx = 0
    -          length = pass.static_solids.length
    -          while idx < length
    -            draw_solid (pass.static_solids.at idx)
    +          r = nil
    +          while idx < iterations
    +            r = proc.call
                 idx += 1
               end
       
    -          # pass.sprites.each           { |s| draw_sprite s }
    -          idx = 0
    -          length = pass.sprites.length
    -          while idx < length
    -            draw_sprite (pass.sprites.at idx)
    -            idx += 1
    -          end
    +          result = (Time.now - time_start).round 3
       
    -          # pass.static_sprites.each    { |s| draw_sprite s }
    -          idx = 0
    -          length = pass.static_sprites.length
    -          while idx < length
    -            draw_sprite (pass.static_sprites.at idx)
    -            idx += 1
    -          end
    +          { name: name,
    +            time: result,
    +            time_ms: (result * 1000).to_i }
    +        end
       
    -          # pass.primitives.each        { |p| draw_primitive p }
    -          idx = 0
    -          length = pass.primitives.length
    -          while idx < length
    -            draw_primitive (pass.primitives.at idx)
    -            idx += 1
    -          end
    +        def benchmark opts = {}
    +          iterations = opts.iterations
       
    -          # pass.static_primitives.each { |p| draw_primitive p }
    -          idx = 0
    -          length = pass.static_primitives.length
    -          while idx < length
    -            draw_primitive (pass.static_primitives.at idx)
    -            idx += 1
    -          end
    +          log <<-S
    +  * BENCHMARK: Started
    +  ** Caller: #{(caller || []).first}
    +  ** Iterations: #{iterations}
    +  S
    +          procs = opts.find_all { |k, v| v.respond_to? :call }
    +  
    +          times = procs.map do |(name, proc)|
    +            benchmark_single iterations, name, proc
    +          end.sort_by { |r| r.time }
    +  
    +          first_place = times.first
    +          second_place = times.second || first_place
    +  
    +          times = times.map do |candidate|
    +            average_time = first_place.time
    +                             .add(candidate.time)
    +                             .abs
    +                             .fdiv(2)
    +  
    +            difference_percentage = 0
    +            if average_time == 0
    +              difference_percentage = 0
    +            else
    +              difference_percentage = first_place.time
    +                                        .subtract(candidate.time)
    +                                        .abs
    +                                        .fdiv(average_time)
    +                                        .imult(100)
    +            end
       
    -          # pass.labels.each            { |l| draw_label l }
    -          idx = 0
    -          length = pass.labels.length
    -          while idx < length
    -            draw_label (pass.labels.at idx)
    -            idx += 1
    +            difference_time = ((first_place.time - candidate.time) * 1000).round
    +            candidate.merge(difference_percentage: difference_percentage,
    +                            difference_time: difference_time)
               end
       
    -          # pass.static_labels.each     { |l| draw_label l }
    -          idx = 0
    -          length = pass.static_labels.length
    -          while idx < length
    -            draw_label (pass.static_labels.at idx)
    -            idx += 1
    +          too_small_to_measure = false
    +          if (first_place.time + second_place.time) == 0
    +            too_small_to_measure = true
    +            difference_percentage = 0
    +            log <<-S
    +  * BENCHMARK: Average time for experiments were too small. Increase the number of iterations.
    +  S
    +          else
    +            difference_percentage = (((first_place.time - second_place.time).abs.fdiv((first_place.time + second_place.time).abs.fdiv(2))) * 100).round
               end
       
    -          # pass.lines.each             { |l| draw_line l }
    -          idx = 0
    -          length = pass.lines.length
    -          while idx < length
    -            draw_line (pass.lines.at idx)
    -            idx += 1
    -          end
    +          difference_time = first_place.time.-(second_place.time).*(1000).abs.round
       
    -          # pass.static_lines.each      { |l| draw_line l }
    -          idx = 0
    -          length = pass.static_lines.length
    -          while idx < pass.static_lines.length
    -            draw_line (pass.static_lines.at idx)
    -            idx += 1
    -          end
    +          r = {
    +            iterations: iterations,
    +            first_place: first_place,
    +            second_place: second_place,
    +            difference_time: difference_time,
    +            difference_percentage: difference_percentage,
    +            times: times,
    +            too_small_to_measure: too_small_to_measure
    +          }
       
    -          # pass.borders.each           { |b| draw_border b }
    -          idx = 0
    -          length = pass.borders.length
    -          while idx < length
    -            draw_border (pass.borders.at idx)
    -            idx += 1
    -          end
    +          log_message = []
    +          only_one_result = first_place.name == second_place.name
       
    -          # pass.static_borders.each    { |b| draw_border b }
    -          idx = 0
    -          length = pass.static_borders.length
    -          while idx < length
    -            draw_border (pass.static_borders.at idx)
    -            idx += 1
    +          if only_one_result
    +            log <<-S
    +  * BENCHMARK: #{r.first_place.name} completed in #{r.first_place.time_ms}ms."
    +  S
    +          else
    +            log <<-S
    +  * BENCHMARK: #{r.message}
    +  ** Fastest: #{r.first_place.name.inspect}
    +  ** Second:  #{r.second_place.name.inspect}
    +  ** Margin:  #{r.difference_percentage}% (#{r.difference_time.abs}ms) #{r.first_place.time_ms}ms vs #{r.second_place.time_ms}ms.
    +  ** Times:
    +  #{r.times.map { |t| "*** #{t.name}: #{t.time_ms}ms (#{t.difference_percentage}% #{t.difference_time.abs}ms)." }.join("\n")}
    +  S
               end
       
    -          if !$gtk.production
    -            # pass.debug.each        { |r| draw_primitive r }
    -            idx = 0
    -            length = pass.debug.length
    -            while idx < length
    -              draw_primitive (pass.debug.at idx)
    -              idx += 1
    -            end
    +          r
    +        end
    +      end
    +    end
    +  end
    +
    +#+end_src
    +
    +*** runtime/draw.rb
    +#+begin_src ruby
    +  # ./dragon/runtime/draw.rb
    +  # Copyright 2019 DragonRuby LLC
    +  # MIT License
    +  # draw.rb has been released under MIT (*only this file*).
       
    -            # pass.static_debug.each { |r| draw_primitive r }
    -            idx = 0
    -            length = pass.static_debug.length
    -            while idx < length
    -              draw_primitive (pass.static_debug.at idx)
    -              idx += 1
    -            end
    +  module GTK
    +    class Runtime
    +      module Draw
    +        def primitives pass
    +          if $top_level.respond_to? :primitives_override
    +            return $top_level.tick_render @args, pass
               end
       
    -          # pass.reserved.each          { |r| draw_primitive r }
    -          idx = 0
    -          length = pass.reserved.length
    -          while idx < length
    -            draw_primitive (pass.reserved.at idx)
    -            idx += 1
    -          end
    +          fn.each_send pass.solids,            self, :draw_solid
    +          fn.each_send pass.static_solids,     self, :draw_solid
    +          fn.each_send pass.sprites,           self, :draw_sprite
    +          fn.each_send pass.static_sprites,    self, :draw_sprite
    +          fn.each_send pass.primitives,        self, :draw_primitive
    +          fn.each_send pass.static_primitives, self, :draw_primitive
    +          fn.each_send pass.labels,            self, :draw_label
    +          fn.each_send pass.static_labels,     self, :draw_label
    +          fn.each_send pass.lines,             self, :draw_line
    +          fn.each_send pass.static_lines,      self, :draw_line
    +          fn.each_send pass.borders,           self, :draw_border
    +          fn.each_send pass.static_borders,    self, :draw_border
       
    -          # pass.static_reserved.each   { |r| draw_primitive r }
    -          idx = 0
    -          length = pass.static_reserved.length
    -          while idx < length
    -            draw_primitive (pass.static_reserved.at idx)
    -            idx += 1
    +          if !$gtk.production
    +            fn.each_send pass.debug,           self, :draw_primitive
    +            fn.each_send pass.static_debug,    self, :draw_primitive
               end
    +  
    +          fn.each_send pass.reserved,          self, :draw_primitive
    +          fn.each_send pass.static_reserved,   self, :draw_primitive
             rescue Exception => e
               pause!
               pretty_print_exception_and_export! e
    @@ -42805,7 +45021,9 @@ Follows is a source code listing for all files that have been open sourced. This
               if s.respond_to? :draw_override
                 s.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a
    +            @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,
    +                                   s.r, s.g, s.b, s.a,
    +                                   (s.blendmode_enum || 1)
               end
             rescue Exception => e
               raise_conversion_for_rendering_failed s, e, :solid
    @@ -42816,14 +45034,15 @@ Follows is a source code listing for all files that have been open sourced. This
               if s.respond_to? :draw_override
                 s.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h,
    -                                    s.path.s_or_default,
    +            @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,
    +                                    (s.path || '').to_s,
                                         s.angle,
                                         s.a, s.r, s.g, s.b,
                                         s.tile_x, s.tile_y, s.tile_w, s.tile_h,
                                         !!s.flip_horizontally, !!s.flip_vertically,
                                         s.angle_anchor_x, s.angle_anchor_y,
    -                                    s.source_x, s.source_y, s.source_w, s.source_h
    +                                    s.source_x, s.source_y, s.source_w, s.source_h,
    +                                    (s.blendmode_enum || 1)
               end
             rescue Exception => e
               raise_conversion_for_rendering_failed s, e, :sprite
    @@ -42834,7 +45053,7 @@ Follows is a source code listing for all files that have been open sourced. This
               if s.respond_to? :draw_override
                 s.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_screenshot s.path.s_or_default,
    +            @ffi_draw.draw_screenshot (s.path || '').to_s,
                                           s.x, s.y, s.w, s.h,
                                           s.angle,
                                           s.a, s.r, s.g, s.b,
    @@ -42852,10 +45071,13 @@ Follows is a source code listing for all files that have been open sourced. This
               if l.respond_to? :draw_override
                 l.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_label l.x, l.y, l.text.s_or_default,
    -                                 l.size_enum, l.alignment_enum,
    -                                 l.r, l.g, l.b, l.a,
    -                                 l.font.s_or_default(nil)
    +            @ffi_draw.draw_label_3 l.x, l.y,
    +                                   (l.text || '').to_s,
    +                                   l.size_enum, l.alignment_enum,
    +                                   l.r, l.g, l.b, l.a,
    +                                   l.font,
    +                                   (l.vertical_alignment_enum || 2),
    +                                   (l.blendmode_enum || 1)
               end
             rescue Exception => e
               raise_conversion_for_rendering_failed l, e, :label
    @@ -42866,7 +45088,21 @@ Follows is a source code listing for all files that have been open sourced. This
               if l.respond_to? :draw_override
                 l.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a
    +            if l.x2
    +              @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,
    +                                    l.r, l.g, l.b, l.a,
    +                                    (l.blendmode_enum || 1)
    +            else
    +              w = l.w || 0
    +              w = 1 if w == 0
    +              h = l.h || 0
    +              h = 1 if h == 0
    +              @ffi_draw.draw_line_2 l.x, l.y,
    +                                    l.x + w - 1,
    +                                    l.y + h - 1,
    +                                    l.r, l.g, l.b, l.a,
    +                                    (l.blendmode_enum || 1)
    +            end
               end
             rescue Exception => e
               raise_conversion_for_rendering_failed l, e, :line
    @@ -42877,7 +45113,9 @@ Follows is a source code listing for all files that have been open sourced. This
               if s.respond_to? :draw_override
                 s.draw_override @ffi_draw
               else
    -            @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a
    +            @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,
    +                                    s.r, s.g, s.b, s.a,
    +                                    (s.blendmode_enum || 1)
               end
             rescue Exception => e
               raise_conversion_for_rendering_failed s, e, :border
    @@ -42897,7 +45135,6 @@ Follows is a source code listing for all files that have been open sourced. This
               pause!
               pretty_print_exception_and_export! e
             end
    -  
           end
         end
       end
    @@ -43113,7 +45350,7 @@ Follows is a source code listing for all files that have been open sourced. This
       
             def framerate_diagnostics_primitives
               [
    -            { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid,
    +            { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid!,
                 {
                   x: 5,
                   y: 5.from_top,
    @@ -43122,7 +45359,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 255,
                   b: 255,
                   size_enum: -2
    -            }.label,
    +            }.label!,
                 {
                   x: 5,
                   y: 20.from_top,
    @@ -43131,7 +45368,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 255,
                   b: 255,
                   size_enum: -2
    -            }.label,
    +            }.label!,
                 {
                   x: 5,
                   y: 35.from_top,
    @@ -43140,7 +45377,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 255,
                   b: 255,
                   size_enum: -2
    -            }.label,
    +            }.label!,
                 {
                   x: 5,
                   y: 50.from_top,
    @@ -43149,7 +45386,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 255,
                   b: 255,
                   size_enum: -2
    -            }.label,
    +            }.label!,
                 {
                   x: 5,
                   y: 65.from_top,
    @@ -43158,7 +45395,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   g: 255,
                   b: 255,
                   size_enum: -2
    -            }.label,
    +            }.label!,
               ]
             end
       
    @@ -43183,7 +45420,14 @@ Follows is a source code listing for all files that have been open sourced. This
             def hotload_init
               @hotload_if_needed = 0
               @mailbox_if_needed = 0
    +  
    +          # schema for file_mtimes
    +          # { FILE_PATH: { current: (Time as Fixnum),
    +          #                last:    (Time as Fixnum) },
    +          #   FILE_PATH: { current: (Time as Fixnum),
    +          #                last:    (Time as Fixnum) } }
               @file_mtimes = { }
    +  
               @suppress_mailbox = true
               files_to_reload.each { |f| init_mtimes f }
               init_mtimes 'app/mailbox.rb'
    @@ -43221,6 +45465,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   'dragon/symbol.rb',
                   'dragon/numeric_deprecated.rb',
                   'dragon/numeric.rb',
    +              'dragon/hash_deprecated.rb',
                   'dragon/hash.rb',
                   'dragon/outputs_deprecated.rb',
                   'dragon/array_docs.rb',
    @@ -43253,6 +45498,7 @@ Follows is a source code listing for all files that have been open sourced. This
                   'dragon/trace.rb',
                   'dragon/readme_docs.rb',
                   'dragon/hotload_client.rb',
    +              'dragon/wizards.rb',
                   'dragon/ios_wizard.rb',
                   'dragon/itch_wizard.rb',
                 ] + core_files_to_reload + @required_files
    @@ -43271,10 +45517,8 @@ Follows is a source code listing for all files that have been open sourced. This
             end
       
             def init_mtimes file
    -          current_key = "current_#{file}".to_sym
    -          last_key = "last_#{file}".to_sym
    -          @file_mtimes[current_key] ||= @ffi_file.mtime(file)
    -          @file_mtimes[last_key] ||= @ffi_file.mtime(file)
    +          @file_mtimes[file] ||= { current: @ffi_file.mtime(file),
    +                                   last: @ffi_file.mtime(file) }
             end
       
             def hotload_source_files
    @@ -43306,25 +45550,36 @@ Follows is a source code listing for all files that have been open sourced. This
             end
       
             def hotload_if_needed
    +          return if Kernel.tick_count < 0
               hotload_source_files
               check_mailbox
             end
       
             def on_load_succeeded file
    -          @rcb_sender.files_reloaded << file
    -          @rcb_sender.reloaded_files << file
    +          self.files_reloaded << file
    +          self.reloaded_files << file
               Trace.untrace_classes!
             end
       
    +        def reset_all_mtimes
    +          @file_mtimes.each do |file, _|
    +            @file_mtimes[file].current = @ffi_file.mtime(file)
    +            @file_mtimes[file].last    = @file_mtimes[file].current
    +          end
    +  
    +          files_to_reload.each do |file, _|
    +            @file_mtimes[file] ||= {}
    +            @file_mtimes[file].current = @ffi_file.mtime(file)
    +            @file_mtimes[file].last    = @file_mtimes[file].current
    +          end
    +        end
    +  
             def reload_if_needed file, force = false
    -          current_key = "current_#{file}".to_sym
    -          last_key = "last_#{file}".to_sym
    -          @file_mtimes[current_key] ||= nil
    -          @file_mtimes[last_key] ||= nil
    -          @file_mtimes[current_key] = @ffi_file.mtime(file)
    -          return if !force && @file_mtimes[last_key] == @file_mtimes[current_key]
    +          @file_mtimes[file] ||= { current: @ffi_file.mtime(file), last: @ffi_file.mtime(file) }
    +          @file_mtimes[file].current = @ffi_file.mtime(file)
    +          return if !force && @file_mtimes[file].current == @file_mtimes[file].last
               on_load_succeeded file if reload_ruby_file file
    -          @file_mtimes[last_key] = @file_mtimes[current_key]
    +          @file_mtimes[file].last = @file_mtimes[file].current
             end
           end
         end
    @@ -43366,6 +45621,30 @@ Follows is a source code listing for all files that have been open sourced. This
           end
         end
       
    +    def char_byte
    +      return nil if self.length == 0
    +      c = self.each_char.first.bytes
    +      c = c.first if c.is_a? Enumerable
    +      c
    +    end
    +  
    +    def insert_character_at index, char
    +      t = each_char.to_a
    +      t = (t.insert index, char)
    +      t.join
    +    end
    +  
    +    def excluding_character_at index
    +      t = each_char.to_a
    +      t.delete_at index
    +      t.join
    +    end
    +  
    +    def excluding_last_character
    +      return "" if self.length <= 1
    +      return excluding_character_at(self.length - 1)
    +    end
    +  
         def end_with_bang?
           self[-1] == "!"
         end
    @@ -43583,7 +45862,7 @@ Follows is a source code listing for all files that have been open sourced. This
             log "#{self.failed.length} test(s) failed."
             self.failed.each do |h|
               log "**** Test name: :#{h[:m]}"
    -          log "#{h[:e].to_s.gsub("* ERROR:", "").strip}"
    +          log "#{h[:e].to_s.gsub("* ERROR:", "").strip}\n#{h[:e].__backtrace_to_org__}"
             end
           end
         end
    @@ -43788,6 +46067,40 @@ Follows is a source code listing for all files that have been open sourced. This
       # MIT License
       # wizards.rb has been released under MIT (*only this file*).
       
    +  class Wizard
    +    def metadata_file_path
    +      "metadata/game_metadata.txt"
    +    end
    +  
    +    def get_metadata
    +      metadata = $gtk.read_file metadata_file_path
    +  
    +      if !metadata
    +        write_blank_metadata
    +        metadata = $gtk.read_file metadata_file_path
    +      end
    +  
    +      dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a
    +  
    +      {
    +        dev_id:     dev_id.strip.gsub("#", "").gsub("devid=", ""),
    +        dev_title:  dev_title.strip.gsub("#", "").gsub("devtitle=", ""),
    +        game_id:    game_id.strip.gsub("#", "").gsub("gameid=", ""),
    +        game_title: game_title.strip.gsub("#", "").gsub("gametitle=", ""),
    +        version:    version.strip.gsub("#", "").gsub("version=", ""),
    +        icon:       icon.strip.gsub("#", "").gsub("icon=", "")
    +      }
    +    end
    +  end
    +  
    +  class WizardException < Exception
    +    attr_accessor :console_primitives
    +  
    +    def initialize *console_primitives
    +      @console_primitives = console_primitives
    +    end
    +  end
    +  
       module GTK
         class Wizards
           attr_accessor :ios, :itch
    diff --git a/docs/parse_log.txt b/docs/parse_log.txt
    index 5f10281..4e43983 100644
    --- a/docs/parse_log.txt
    +++ b/docs/parse_log.txt
    @@ -40,11 +40,6 @@ To search docs you can type ~docs_search "SEARCH TERM"~ or if you want to get fa
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~[[docs_search.gif]]~
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -[[docs_search.gif]]
     ** Processing line: ~* Hello World~
     - Header detected.
     *** True Line Result
    @@ -126,50 +121,91 @@ I am a Dragon Rider.
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~* Watch Some Intro Videos~
    +** Processing line: ~* Intro Videos~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -* Watch Some Intro Videos
    +* Intro Videos
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~Each video is only 20 minutes and all of them will fit into a lunch~
    -** Processing line: ~break. So please watch them:~
    +** Processing line: ~Here are some videos to help you get the lay of the land.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -Each video is only 20 minutes and all of them will fit into a lunch break. So please watch them:
    +Here are some videos to help you get the lay of the land.
    +** Processing line: ~** Quick Api Tour~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Quick Api Tour
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
     ** Processing line: ~1. Beginner Introduction to DragonRuby Game Toolkit: [[https://youtu.be/ixw7TJhU08E]]~
     - Line was identified as a start of a list.
     *** True Line Result
     
    -** Processing line: ~2. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]~
    -- Line was identified as a continuation of a list.
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
     1. Beginner Introduction to DragonRuby Game Toolkit: [[https://youtu.be/ixw7TJhU08E]]
    -** Processing line: ~3. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]~
    +** Processing line: ~** If You Are Completely New to Ruby and Programming~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** If You Are Completely New to Ruby and Programming
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~1. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]~
    +- Line was identified as a start of a list.
    +*** True Line Result
    +
    +** Processing line: ~2. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]~
     - Line was identified as a continuation of a list.
     *** True Line Result
    -2. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]
    +1. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]
    +** Processing line: ~3. You may also want to try this free course provided at [[http://dragonruby.school]].~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +2. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -3. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]
    -** Processing line: ~The second and third videos are not required if you are proficient~
    -** Processing line: ~with Ruby, but *definitely* watch the first one.~
    +3. You may also want to try this free course provided at [[http://dragonruby.school]].
    +** Processing line: ~** If You Have Game Dev Experience~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** If You Have Game Dev Experience
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -The second and third videos are not required if you are proficient with Ruby, but *definitely* watch the first one.
    -** Processing line: ~You may also want to try this free course provided at~
    -** Processing line: ~[[http://dragonruby.school]].~
    +
    +** Processing line: ~1. Building Tetris - Part 1: [[https://youtu.be/xZMwRSbC4rY]]~
    +- Line was identified as a start of a list.
    +*** True Line Result
    +
    +** Processing line: ~2. Building Tetris - Part 2: [[https://youtu.be/C3LLzDUDgz4]]~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +1. Building Tetris - Part 1: [[https://youtu.be/xZMwRSbC4rY]]
    +** Processing line: ~3. Low Res Game Jam Tutorial: [[https://youtu.be/pCI90ukKCME]]~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +2. Building Tetris - Part 2: [[https://youtu.be/C3LLzDUDgz4]]
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -You may also want to try this free course provided at [[http://dragonruby.school]].
    +3. Low Res Game Jam Tutorial: [[https://youtu.be/pCI90ukKCME]]
     ** Processing line: ~* Getting Started Tutorial~
     - Header detected.
     *** True Line Result
    @@ -1115,7 +1151,7 @@ If you have a Pro subscription, you also have the capability to deploy to mobile
     *** True Line Result
     To deploy to iOS, you need to have a Mac running MacOS Catalina, an iOS device, and an active/paid Developer Account with Apple. From the Console type: ~$wizards.ios.start~ and you will be guided through the deployment process.
     ** Processing line: ~To deploy to Android, you need to have an Android emulator/device, and~
    -** Processing line: ~a environment that is able to run Android SDK. ~dragonruby-publish~~
    +** Processing line: ~an environment that is able to run Android SDK. ~dragonruby-publish~~
     ** Processing line: ~will create an APK for you. From there, you can sign the APK and~
     ** Processing line: ~install it to your device. The signing and installation procedure~
     ** Processing line: ~varies from OS to OS. Here's an example of what the command might look~
    @@ -1123,7 +1159,7 @@ To deploy to iOS, you need to have a Mac running MacOS Catalina, an iOS device,
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -To deploy to Android, you need to have an Android emulator/device, and a environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:
    +To deploy to Android, you need to have an Android emulator/device, and an environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:
     ** Processing line: ~#+begin_src~
     - Line was identified as the beginning of a code block.
     *** True Line Result
    @@ -1168,11 +1204,11 @@ To deploy to Android, you need to have an Android emulator/device, and a environ
     ** Processing line: ~game engines. Given that Game Toolkit is a relatively new engine,~
     ** Processing line: ~there are definitely features that are missing. So having a big check~
     ** Processing line: ~list of "all the cool things" is not this engine's forte. This is~
    -** Processing line: ~compensated with a strong commitment to the following principals.~
    +** Processing line: ~compensated with a strong commitment to the following principles.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principals.
    +The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principles.
     ** Processing line: ~** Challenge The Status Quo~
     - Header detected.
     *** True Line Result
    @@ -1238,16 +1274,16 @@ There is a programming idiom in software called "The Pit of Success". The term n
     ** Processing line: ~DragonRuby's philosophy is to provide multiple options across the "make it~
     ** Processing line: ~fast" vs "make it right" spectrum, with incremental/intuitive~
     ** Processing line: ~transitions between the options provided. A concrete example of this philosophy~
    -** Processing line: ~would be render primitives: the spectrum of options allows renderable constructs take~
    -** Processing line: ~the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with),~
    +** Processing line: ~would be render primitives: the spectrum of options allows renderable constructs that~
    +** Processing line: ~take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with),~
     ** Processing line: ~hashes (a little more work, but gives you the ability to add additional properties),~
    -** Processing line: ~open and string entities (more work than hashes, but yields cleaner apis),~
    +** Processing line: ~open and strict entities (more work than hashes, but yields cleaner apis),~
     ** Processing line: ~and finally - if you really need full power/flexibility in rendering - classes~
     ** Processing line: ~(which take the most amount of code and programming knowledge to create).~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and string entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).
    +DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs that take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and strict entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).
     ** Processing line: ~** Release Early and Often~
     - Header detected.
     *** True Line Result
    @@ -1558,11 +1594,11 @@ The elevator pitch is:
     ** Processing line: ~DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels"~
     ** Processing line: ~within the runtime allows us to target platforms no other Ruby can~
     ** Processing line: ~target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo~
    -** Processing line: ~Switch, PS4, Xbox, and Scadia.~
    +** Processing line: ~Switch, PS4, Xbox, and Stadia.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Scadia.
    +DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Stadia.
     ** Processing line: ~**** What does Multilevel Cross-platform mean?~
     - Header detected.
     *** True Line Result
    @@ -1770,14 +1806,14 @@ You can use DragonRuby's Console within the game to inspect object and execute s
     - End of paragraph detected.
     *** True Line Result
     - If you use the `repl` method, the code will be executed and the DragonRuby Console will automatically open so you can see the results (on Mac and Linux, the results will also be printed to the terminal).
    -** Processing line: ~- All ~puts~ statements will also be saved to ~logs/log.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~
    +** Processing line: ~- All ~puts~ statements will also be saved to ~logs/puts.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~
     - Line was identified as a list.
     *** True Line Result
     
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -- All ~puts~ statements will also be saved to ~logs/log.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.
    +- All ~puts~ statements will also be saved to ~logs/puts.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.
     ** Processing line: ~4. To ignore code in ~repl.rb~, instead of commenting it out, prefix ~repl~ with the letter ~x~ and it'll be ignored.~
     ** Processing line: ~~
     - End of paragraph detected.
    @@ -1897,14 +1933,14 @@ You can use DragonRuby's replay capabilities to troubleshoot:
     - Line was identified as a start of a list.
     *** True Line Result
     
    -** Processing line: ~2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recoding by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~
    +** Processing line: ~2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recording by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~
     - Line was identified as a continuation of a list.
     *** True Line Result
     1. DragonRuby is hot loaded which gives you a very fast feedback loop (if the game throws an exception, it's because of the code you just added).
     ** Processing line: ~3. DragonRuby also ships with a unit testing facility. You can invoke the following command to run a test: ~./dragonruby . --eval some_ruby_file.rb --no-tick~.~
     - Line was identified as a continuation of a list.
     *** True Line Result
    -2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recoding by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.
    +2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recording by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.
     ** Processing line: ~4. Get into the habit of adding debugging facilities within the game itself. You can add drawing primitives to ~args.outputs.debug~ that will render on top of your game but will be ignored in a production release.~
     - Line was identified as a continuation of a list.
     *** True Line Result
    @@ -1944,11 +1980,11 @@ You can use DragonRuby's replay capabilities to troubleshoot:
     *** True Line Result
     Let's check the official source for the answer to this question: isrubydead.com: [[https://isrubydead.com/]].
     ** Processing line: ~On a more serious note, Ruby's _quantity_ levels aren't what they used~
    -** Processing line: ~to be. And that's totally fine. Every one chases the new and shiny.~
    +** Processing line: ~to be. And that's totally fine. Everyone chases the new and shiny.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Every one chases the new and shiny.
    +On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Everyone chases the new and shiny.
     ** Processing line: ~What really matters is _quality/maturity_. Here is the latest (StackOverflow~
     ** Processing line: ~Survey sorted by highest paid developers)[https://insights.stackoverflow.com/survey/2019#top-paying-technologies].~
     ** Processing line: ~~
    @@ -2134,16 +2170,14 @@ Just contact Amir at amir.rajan@dragonruby.org with a short explanation of your
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~You can try our [web-based sandbox environment](). But it won't do the~
    -** Processing line: ~runtime justice. Or just come to our [Slack]() or [Discord]() channel~
    -** Processing line: ~and ask questions. We'd be happy to have a one on one video chat with~
    -** Processing line: ~you and show off all the cool stuff we're doing.~
    +** Processing line: ~You can try our web-based sandbox environment at [[http://fiddle.dragonruby.org]]. But it won't do the~
    +** Processing line: ~runtime justice. Or just come to our Discord Channel at [[http://discord.dragonruby.org]] and ask questions.~
    +** Processing line: ~We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -You can try our [web-based sandbox environment](). But it won't do the runtime justice. Or just come to our [Slack]() or [Discord]() channel and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.
    -** Processing line: ~Seriously just buy it. Get a refund if you don't like it. We make it~
    -** Processing line: ~stupid easy to do so.~
    +You can try our web-based sandbox environment at [[http://fiddle.dragonruby.org]]. But it won't do the runtime justice. Or just come to our Discord Channel at [[http://discord.dragonruby.org]] and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.
    +** Processing line: ~Seriously just buy it. Get a refund if you don't like it. We make it stupid easy to do so.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    @@ -2556,10 +2590,14 @@ You can represent a sprite as a ~Hash~:
     - Inside source: true
     *** True Line Result
           angle_anchor_x: 0.5,
    -** Processing line: ~      angle_anchor_y: 1.0~
    +** Processing line: ~      angle_anchor_y: 1.0,~
     - Inside source: true
     *** True Line Result
    -      angle_anchor_y: 1.0
    +      angle_anchor_y: 1.0,
    +** Processing line: ~      blendmode_enum: 1~
    +- Inside source: true
    +*** True Line Result
    +      blendmode_enum: 1
     ** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    @@ -2576,6 +2614,12 @@ You can represent a sprite as a ~Hash~:
     - End of paragraph detected.
     *** True Line Result
     
    +** Processing line: ~The ~blendmode_enum~ value can be set to ~0~ (no blending), ~1~ (alpha blending),~
    +** Processing line: ~~2~ (additive blending), ~3~ (modulo blending), ~4~ (multiply blending).~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +The ~blendmode_enum~ value can be set to ~0~ (no blending), ~1~ (alpha blending), ~2~ (additive blending), ~3~ (modulo blending), ~4~ (multiply blending).
     ** Processing line: ~You can represent a sprite as an ~object~:~
     ** Processing line: ~~
     - End of paragraph detected.
    @@ -2611,10 +2655,10 @@ You can represent a sprite as an ~object~:
     - Inside source: true
     *** True Line Result
                       :flip_horizontally, :flip_vertically,
    -** Processing line: ~                  :angle_anchor_x, :angle_anchor_y~
    +** Processing line: ~                  :angle_anchor_x, :angle_anchor_y, :blendmode_enum~
     - Inside source: true
     *** True Line Result
    -                  :angle_anchor_x, :angle_anchor_y
    +                  :angle_anchor_x, :angle_anchor_y, :blendmode_enum
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -2941,46 +2985,50 @@ You can add additional metadata about your game within a label, which requires y
     - Inside source: true
     *** True Line Result
         args.outputs.labels << {
    -** Processing line: ~      x:              200,~
    +** Processing line: ~      x:                       200,~
     - Inside source: true
     *** True Line Result
    -      x:              200,
    -** Processing line: ~      y:              550,~
    +      x:                       200,
    +** Processing line: ~      y:                       550,~
     - Inside source: true
     *** True Line Result
    -      y:              550,
    -** Processing line: ~      text:           "dragonruby",~
    +      y:                       550,
    +** Processing line: ~      text:                    "dragonruby",~
     - Inside source: true
     *** True Line Result
    -      text:           "dragonruby",
    -** Processing line: ~      size_enum:      2,~
    +      text:                    "dragonruby",
    +** Processing line: ~      size_enum:               2,~
     - Inside source: true
     *** True Line Result
    -      size_enum:      2,
    -** Processing line: ~      alignment_enum: 1,~
    +      size_enum:               2,
    +** Processing line: ~      alignment_enum:          1,~
     - Inside source: true
     *** True Line Result
    -      alignment_enum: 1,
    -** Processing line: ~      r:              155,~
    +      alignment_enum:          1,
    +** Processing line: ~      r:                       155,~
     - Inside source: true
     *** True Line Result
    -      r:              155,
    -** Processing line: ~      g:              50,~
    +      r:                       155,
    +** Processing line: ~      g:                       50,~
     - Inside source: true
     *** True Line Result
    -      g:              50,
    -** Processing line: ~      b:              50,~
    +      g:                       50,
    +** Processing line: ~      b:                       50,~
     - Inside source: true
     *** True Line Result
    -      b:              50,
    -** Processing line: ~      a:              255,~
    +      b:                       50,
    +** Processing line: ~      a:                       255,~
     - Inside source: true
     *** True Line Result
    -      a:              255,
    -** Processing line: ~      font:           "fonts/manaspc.ttf",~
    +      a:                       255,
    +** Processing line: ~      font:                    "fonts/manaspc.ttf",~
     - Inside source: true
     *** True Line Result
    -      font:           "fonts/manaspc.ttf",
    +      font:                    "fonts/manaspc.ttf",
    +** Processing line: ~      vertical_alignment_enum: 0, # 0 is bottom, 1 is middle, 2 is top~
    +- Inside source: true
    +*** True Line Result
    +      vertical_alignment_enum: 0, # 0 is bottom, 1 is middle, 2 is top
     ** Processing line: ~      # You can add any properties you like (this will be ignored/won't cause errors)~
     - Inside source: true
     *** True Line Result
    @@ -3110,6 +3158,67 @@ You can get the render size of any string using ~args.gtk.calcstringbox~.
     - End of paragraph detected.
     *** True Line Result
     
    +** Processing line: ~** Rendering Labels With New Line Characters And Wrapping~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Rendering Labels With New Line Characters And Wrapping
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~You can use a strategy like the following to create multiple labels from a String.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +You can use a strategy like the following to create multiple labels from a String.
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elitteger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim."~
    +- Inside source: true
    +*** True Line Result
    +    long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elitteger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim."
    +** Processing line: ~    max_character_length = 30~
    +- Inside source: true
    +*** True Line Result
    +    max_character_length = 30
    +** Processing line: ~    long_strings_split = args.string.wrapped_lines long_string, max_character_length~
    +- Inside source: true
    +*** True Line Result
    +    long_strings_split = args.string.wrapped_lines long_string, max_character_length
    +** Processing line: ~    args.outputs.labels << long_strings_split.map_with_index do |s, i|~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.labels << long_strings_split.map_with_index do |s, i|
    +** Processing line: ~      { x: 10, y: 600 - (i * 20), text: s }~
    +- Inside source: true
    +*** True Line Result
    +      { x: 10, y: 600 - (i * 20), text: s }
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
     ** Processing line: ~** How To Play A Sound~
     - Header detected.
     *** True Line Result
    @@ -3699,11 +3808,11 @@ Returns ~true~ if: the ~right~ arrow or ~d~ key is pressed or held on the ~keybo
     Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.left~ and ~args.inputs.right~.
     *** True Line Result
     *** ~.up_down~
    -** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.up~ and ~args.inputs.down~.~
    +** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.down~ and ~args.inputs.up~.~
     ** Processing line: ~*** ~.text~ OR ~.history~~
     - Header detected.
     *** True Line Result
    -Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.up~ and ~args.inputs.down~.
    +Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.down~ and ~args.inputs.up~.
     *** True Line Result
     *** ~.text~ OR ~.history~
     ** Processing line: ~Returns a string that represents the last key that was pressed on the keyboard.~
    @@ -3785,13 +3894,23 @@ Returns a bitmask for all buttons on the mouse: ~1~ for a button in the ~down~ s
     **** ~mouse.wheel~
     ** Processing line: ~Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred.~
     ** Processing line: ~***** ~.x~~
    +- Header detected.
    +*** True Line Result
    +Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred.
    +*** True Line Result
    +***** ~.x~
     ** Processing line: ~Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis.~
     ** Processing line: ~***** ~.y~~
    +- Header detected.
    +*** True Line Result
    +Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis.
    +*** True Line Result
    +***** ~.y~
     ** Processing line: ~Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.~
     ** Processing line: ~**** ~.click~ OR ~.down~, ~.previous_click~, ~.up~~
     - Header detected.
     *** True Line Result
    -Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred. ***** ~.x~ Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis. ***** ~.y~ Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.
    +Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.
     *** True Line Result
     **** ~.click~ OR ~.down~, ~.previous_click~, ~.up~
     ** Processing line: ~The properties ~args.inputs.mouse.(click|down|previous_click|up)~ each return ~nil~ if the mouse button event didn't occur. And return an Entity~
    @@ -3803,47 +3922,47 @@ The properties ~args.inputs.mouse.(click|down|previous_click|up)~ each return ~n
     *** True Line Result
     *** ~.controller_one~, ~.controller_two~
     ** Processing line: ~Represents controllers connected to the usb ports.~
    -** Processing line: ~**** ~.up~
    +** Processing line: ~**** ~.up~~
     - Header detected.
     *** True Line Result
     Represents controllers connected to the usb ports.
     *** True Line Result
    -**** ~.up
    +**** ~.up~
     ** Processing line: ~Returns ~true~ if ~up~ is pressed or held on the directional or left analog.~
    -** Processing line: ~**** ~.down~
    +** Processing line: ~**** ~.down~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~up~ is pressed or held on the directional or left analog.
     *** True Line Result
    -**** ~.down
    +**** ~.down~
     ** Processing line: ~Returns ~true~ if ~down~ is pressed or held on the directional or left analog.~
    -** Processing line: ~**** ~.left~
    +** Processing line: ~**** ~.left~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~down~ is pressed or held on the directional or left analog.
     *** True Line Result
    -**** ~.left
    +**** ~.left~
     ** Processing line: ~Returns ~true~ if ~left~ is pressed or held on the directional or left analog.~
    -** Processing line: ~**** ~.right~
    +** Processing line: ~**** ~.right~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~left~ is pressed or held on the directional or left analog.
     *** True Line Result
    -**** ~.right
    +**** ~.right~
     ** Processing line: ~Returns ~true~ if ~right~ is pressed or held on the directional or left analog.~
    -** Processing line: ~**** ~.left_right~
    +** Processing line: ~**** ~.left_right~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~right~ is pressed or held on the directional or left analog.
     *** True Line Result
    -**** ~.left_right
    +**** ~.left_right~
     ** Processing line: ~Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.controller_(one|two).left~ and ~args.inputs.controller_(one|two).right~.~
    -** Processing line: ~**** ~.up_down~
    +** Processing line: ~**** ~.up_down~~
     - Header detected.
     *** True Line Result
     Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.controller_(one|two).left~ and ~args.inputs.controller_(one|two).right~.
     *** True Line Result
    -**** ~.up_down
    +**** ~.up_down~
     ** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.controller_(one|two).up~ and ~args.inputs.controller_(one|two).down~.~
     ** Processing line: ~**** ~.(left_analog_x_raw|right_analog_x_raw)~~
     - Header detected.
    @@ -3873,33 +3992,33 @@ Returns a number between ~-1~ and ~1~ which represents the percentage the analog
     *** True Line Result
     **** ~.left_analog_y_perc|right_analog_y_perc)~
     ** Processing line: ~Returns a number between ~-1~ and ~1~ which represents the percentage the analog is moved vertically as a ratio of the maximum vertical movement.~
    -** Processing line: ~**** ~.directional_up)~~
    +** Processing line: ~**** ~.directional_up~~
     - Header detected.
     *** True Line Result
     Returns a number between ~-1~ and ~1~ which represents the percentage the analog is moved vertically as a ratio of the maximum vertical movement.
     *** True Line Result
    -**** ~.directional_up)~
    +**** ~.directional_up~
     ** Processing line: ~Returns ~true~ if ~up~ is pressed or held on the directional.~
    -** Processing line: ~**** ~.directional_down)~~
    +** Processing line: ~**** ~.directional_down~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~up~ is pressed or held on the directional.
     *** True Line Result
    -**** ~.directional_down)~
    +**** ~.directional_down~
     ** Processing line: ~Returns ~true~ if ~down~ is pressed or held on the directional.~
    -** Processing line: ~**** ~.directional_left)~~
    +** Processing line: ~**** ~.directional_left~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~down~ is pressed or held on the directional.
     *** True Line Result
    -**** ~.directional_left)~
    +**** ~.directional_left~
     ** Processing line: ~Returns ~true~ if ~left~ is pressed or held on the directional.~
    -** Processing line: ~**** ~.directional_right)~~
    +** Processing line: ~**** ~.directional_right~~
     - Header detected.
     *** True Line Result
     Returns ~true~ if ~left~ is pressed or held on the directional.
     *** True Line Result
    -**** ~.directional_right)~
    +**** ~.directional_right~
     ** Processing line: ~Returns ~true~ if ~right~ is pressed or held on the directional.~
     ** Processing line: ~**** ~.(a|b|x|y|l1|r1|l2|r2|l3|r3|start|select)~~
     - Header detected.
    @@ -4491,10 +4610,39 @@ Send any Primitive to this collection which represents things you render to the
     *** True Line Result
     ** ~args.geometry~
     ** Processing line: ~This property contains geometric functions. Functions can be invoked via ~args.geometry.FUNCTION~.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +This property contains geometric functions. Functions can be invoked via ~args.geometry.FUNCTION~.
    +** Processing line: ~Here are some general notes with regards to the arguments these geometric functions accept.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +Here are some general notes with regards to the arguments these geometric functions accept.
    +** Processing line: ~1. ~Rectangles~ can be represented as an ~Array~ with four (or more) values ~[x, y, w, h]~, as a ~Hash~ ~{ x:, y:, w:, h: }~ or an object that responds to ~x~, ~y~, ~w~, and ~h~.~
    +- Line was identified as a start of a list.
    +*** True Line Result
    +
    +** Processing line: ~2. ~Points~ can be represent as an ~Array~ with two (or more) values ~[x, y]~, as a ~Hash~ ~{ x:, y:}~ or an object that responds to ~x~, and ~y~.~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +1. ~Rectangles~ can be represented as an ~Array~ with four (or more) values ~[x, y, w, h]~, as a ~Hash~ ~{ x:, y:, w:, h: }~ or an object that responds to ~x~, ~y~, ~w~, and ~h~.
    +** Processing line: ~3. ~Lines~ can be represented as an ~Array~ with four (or more) values ~[x, y, x2, y2]~, as a ~Hash~ ~{ x:, y:, x2:, y2: }~ or an object that responds to ~x~, ~y~, ~x2~, and ~y2~.~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +2. ~Points~ can be represent as an ~Array~ with two (or more) values ~[x, y]~, as a ~Hash~ ~{ x:, y:}~ or an object that responds to ~x~, and ~y~.
    +** Processing line: ~4. ~Angles~ are represented as degrees (not radians).~
    +- Line was identified as a continuation of a list.
    +*** True Line Result
    +3. ~Lines~ can be represented as an ~Array~ with four (or more) values ~[x, y, x2, y2]~, as a ~Hash~ ~{ x:, y:, x2:, y2: }~ or an object that responds to ~x~, ~y~, ~x2~, and ~y2~.
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +4. ~Angles~ are represented as degrees (not radians).
     ** Processing line: ~*** ~.inside_rect? rect_1, rect_2~~
     - Header detected.
     *** True Line Result
    -This property contains geometric functions. Functions can be invoked via ~args.geometry.FUNCTION~.
    +
     *** True Line Result
     *** ~.inside_rect? rect_1, rect_2~
     ** Processing line: ~Returns ~true~ if ~rect_1~ is inside ~rect_2~.~
    @@ -6575,12 +6723,12 @@ Creates a solid black rectangle located at 100, 100. 160 pixels wide and 90 pixe
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~The value for the color and alpha is an number between ~0~ and ~255~. The~
    +** Processing line: ~The value for the color and alpha is a number between ~0~ and ~255~. The~
     ** Processing line: ~alpha property is optional and will be set to ~255~ if not specified.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -The value for the color and alpha is an number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.
    +The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.
     ** Processing line: ~Creates a green solid rectangle with an opacity of 50%.~
     ** Processing line: ~~
     - End of paragraph detected.
    @@ -6706,12 +6854,12 @@ If you want a more readable invocation. You can use the following hash to create
     *** True Line Result
     
     ** Processing line: ~You can also create a class with solid/border properties and render it as a primitive.~
    -** Processing line: ~ALL properties must on the class. *Additionally*, a method called ~primitive_marker~~
    +** Processing line: ~ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~~
     ** Processing line: ~must be defined on the class.~
     ** Processing line: ~~
     - End of paragraph detected.
     *** True Line Result
    -You can also create a class with solid/border properties and render it as a primitive. ALL properties must on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.
    +You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.
     ** Processing line: ~Here is an example:~
     ** Processing line: ~~
     - End of paragraph detected.
    @@ -6926,6 +7074,385 @@ You have to use ~args.outputs.borders~:
     - End of paragraph detected.
     *** True Line Result
     
    +** Processing line: ~* DOCS: ~GTK::Outputs#sprites~~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +* DOCS: ~GTK::Outputs#sprites~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~Add primitives to this collection to render a sprite to the screen.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +Add primitives to this collection to render a sprite to the screen.
    +** Processing line: ~** Rendering a sprite using an Array~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Rendering a sprite using an Array
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~Creates a sprite of a white circle located at 100, 100. 160 pixels~
    +** Processing line: ~wide and 90 pixels tall.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +Creates a sprite of a white circle located at 100, 100. 160 pixels wide and 90 pixels tall.
    +** Processing line: ~#+begin_src~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    #                         X    Y   WIDTH   HEIGHT                      PATH~
    +- Inside source: true
    +*** True Line Result
    +    #                         X    Y   WIDTH   HEIGHT                      PATH
    +** Processing line: ~    args.outputs.sprites << [100, 100,   160,     90, "sprites/circle/white.png]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [100, 100,   160,     90, "sprites/circle/white.png]
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~** Rendering a sprite using an Array with colors and alpha~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Rendering a sprite using an Array with colors and alpha
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~The value for the color and alpha is a number between ~0~ and ~255~. The~
    +** Processing line: ~alpha property is optional and will be set to ~255~ if not specified.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.
    +** Processing line: ~Creates a green circle sprite with an opacity of 50%.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +Creates a green circle sprite with an opacity of 50%.
    +** Processing line: ~#+begin_src~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    #                         X    Y  WIDTH  HEIGHT           PATH                ANGLE  ALPHA  RED  GREEN  BLUE~
    +- Inside source: true
    +*** True Line Result
    +    #                         X    Y  WIDTH  HEIGHT           PATH                ANGLE  ALPHA  RED  GREEN  BLUE
    +** Processing line: ~    args.outputs.sprites << [100, 100,  160,     90, "sprites/circle/white.png",     0,    128,   0,   255,    0]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [100, 100,  160,     90, "sprites/circle/white.png",     0,    128,   0,   255,    0]
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~** Rendering a sprite using a Hash~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Rendering a sprite using a Hash
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~If you want a more readable invocation. You can use the following hash to create a sprite.~
    +** Processing line: ~Any parameters that are not specified will be given a default value. The keys of the hash can~
    +** Processing line: ~be provided in any order.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +If you want a more readable invocation. You can use the following hash to create a sprite. Any parameters that are not specified will be given a default value. The keys of the hash can be provided in any order.
    +** Processing line: ~#+begin_src~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    args.outputs.sprites << {~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << {
    +** Processing line: ~      x:                             0,~
    +- Inside source: true
    +*** True Line Result
    +      x:                             0,
    +** Processing line: ~      y:                             0,~
    +- Inside source: true
    +*** True Line Result
    +      y:                             0,
    +** Processing line: ~      w:                           100,~
    +- Inside source: true
    +*** True Line Result
    +      w:                           100,
    +** Processing line: ~      h:                           100,~
    +- Inside source: true
    +*** True Line Result
    +      h:                           100,
    +** Processing line: ~      path: "sprites/circle/white.png",~
    +- Inside source: true
    +*** True Line Result
    +      path: "sprites/circle/white.png",
    +** Processing line: ~      angle:                         0,~
    +- Inside source: true
    +*** True Line Result
    +      angle:                         0,
    +** Processing line: ~      a:                           255,~
    +- Inside source: true
    +*** True Line Result
    +      a:                           255,
    +** Processing line: ~      r:                             0,~
    +- Inside source: true
    +*** True Line Result
    +      r:                             0,
    +** Processing line: ~      g:                           255,~
    +- Inside source: true
    +*** True Line Result
    +      g:                           255,
    +** Processing line: ~      b:                             0~
    +- Inside source: true
    +*** True Line Result
    +      b:                             0
    +** Processing line: ~    }~
    +- Inside source: true
    +*** True Line Result
    +    }
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~** Rendering a solid using a Class~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +** Rendering a solid using a Class
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~You can also create a class with solid/border properties and render it as a primitive.~
    +** Processing line: ~ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~~
    +** Processing line: ~must be defined on the class.~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.
    +** Processing line: ~Here is an example:~
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +Here is an example:
    +** Processing line: ~#+begin_src~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src
    +** Processing line: ~  # Create type with ALL sprite properties AND primitive_marker~
    +- Inside source: true
    +*** True Line Result
    +  # Create type with ALL sprite properties AND primitive_marker
    +** Processing line: ~  class Sprite~
    +- Inside source: true
    +*** True Line Result
    +  class Sprite
    +** Processing line: ~    attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y,  :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b~
    +- Inside source: true
    +*** True Line Result
    +    attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y,  :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def primitive_marker~
    +- Inside source: true
    +*** True Line Result
    +    def primitive_marker
    +** Processing line: ~      :sprite~
    +- Inside source: true
    +*** True Line Result
    +      :sprite
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  # Inherit from type~
    +- Inside source: true
    +*** True Line Result
    +  # Inherit from type
    +** Processing line: ~  class Circle < Sprite~
    +- Inside source: true
    +*** True Line Result
    +  class Circle < Sprite
    +** Processing line: ~  # constructor~
    +- Inside source: true
    +*** True Line Result
    +  # constructor
    +** Processing line: ~    def initialize x, y, size, path~
    +- Inside source: true
    +*** True Line Result
    +    def initialize x, y, size, path
    +** Processing line: ~      self.x = x~
    +- Inside source: true
    +*** True Line Result
    +      self.x = x
    +** Processing line: ~      self.y = y~
    +- Inside source: true
    +*** True Line Result
    +      self.y = y
    +** Processing line: ~      self.w = size~
    +- Inside source: true
    +*** True Line Result
    +      self.w = size
    +** Processing line: ~      self.h = size~
    +- Inside source: true
    +*** True Line Result
    +      self.h = size
    +** Processing line: ~      self.path = path~
    +- Inside source: true
    +*** True Line Result
    +      self.path = path
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~    def serlialize~
    +- Inside source: true
    +*** True Line Result
    +    def serlialize
    +** Processing line: ~      {x:self.x, y:self.y, w:self.w, h:self.h, path:self.path}~
    +- Inside source: true
    +*** True Line Result
    +      {x:self.x, y:self.y, w:self.w, h:self.h, path:self.path}
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def inspect~
    +- Inside source: true
    +*** True Line Result
    +    def inspect
    +** Processing line: ~      serlialize.to_s~
    +- Inside source: true
    +*** True Line Result
    +      serlialize.to_s
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def to_s~
    +- Inside source: true
    +*** True Line Result
    +    def to_s
    +** Processing line: ~      serlialize.to_s~
    +- Inside source: true
    +*** True Line Result
    +      serlialize.to_s
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    # render circle sprite~
    +- Inside source: true
    +*** True Line Result
    +    # render circle sprite
    +** Processing line: ~    args.outputs.sprites  << Circle.new(10, 10, 32,"sprites/circle/white.png")~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites  << Circle.new(10, 10, 32,"sprites/circle/white.png")
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
     ** Processing line: ~* DOCS: ~GTK::Outputs#screenshots~~
     - Header detected.
     *** True Line Result
    @@ -7163,34 +7690,34 @@ The ~GTK::MousePoint~ has the following properties.
     - Line was identified as a list.
     *** True Line Result
     - ~y~: Integer representing the mouse's y.
    -** Processing line: ~- ~w~: Width of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +** Processing line: ~- ~w~: Width of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
     - ~point~: Array with the ~x~ and ~y~ values.
    -** Processing line: ~- ~h~: Height of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +** Processing line: ~- ~h~: Height of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
    -- ~w~: Width of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -** Processing line: ~- ~left~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +- ~w~: Width of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +** Processing line: ~- ~left~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
    -- ~h~: Height of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -** Processing line: ~- ~right~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +- ~h~: Height of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +** Processing line: ~- ~right~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
    -- ~left~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -** Processing line: ~- ~top~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +- ~left~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +** Processing line: ~- ~top~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
    -- ~right~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    -** Processing line: ~- ~bottom~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~
    +- ~right~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
    +** Processing line: ~- ~bottom~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~
     - Line was identified as a list.
     *** True Line Result
    -- ~top~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    +- ~top~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
     ** Processing line: ~- ~created_at~: The tick (~args.state.tick_count~) that this structure was created.~
     - Line was identified as a list.
     *** True Line Result
    -- ~bottom~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).
    +- ~bottom~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).
     ** Processing line: ~- ~global_created_at~: The global tick (~Kernel.global_tick_count~) that this structure was created.~
     - Line was identified as a list.
     *** True Line Result
    @@ -12924,10 +13451,10 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
                                      a: 255,
    -** Processing line: ~                                 font: "manaspc.ttf" }.label~
    +** Processing line: ~                                 font: "manaspc.ttf" }.label!~
     - Inside source: true
     *** True Line Result
    -                                 font: "manaspc.ttf" }.label
    +                                 font: "manaspc.ttf" }.label!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -12980,10 +13507,10 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
                                      a: 255,
    -** Processing line: ~                                 font: "manaspc.ttf" }.label~
    +** Processing line: ~                                 font: "manaspc.ttf" }.label!~
     - Inside source: true
     *** True Line Result
    -                                 font: "manaspc.ttf" }.label
    +                                 font: "manaspc.ttf" }.label!
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -13944,502 +14471,506 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Rendering Basics - Audio Mixer - main.rb~
    +** Processing line: ~*** Input Basics - Keyboard - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Rendering Basics - Audio Mixer - main.rb
    +*** Input Basics - Keyboard - 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/01_rendering_basics/06_audio_mixer/app/main.rb~
    +** Processing line: ~  # ./samples/02_input_basics/01_keyboard/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/01_rendering_basics/06_audio_mixer/app/main.rb
    -** Processing line: ~  $gtk.reset~
    +  # ./samples/02_input_basics/01_keyboard/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $boxsize = 30~
    +** Processing line: ~  APIs listing that haven't been encountered in a previous sample apps:~
     - Inside source: true
     *** True Line Result
    -  $boxsize = 30
    +  APIs listing that haven't been encountered in a previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render_sources args~
    -- Inside source: true
    -*** True Line Result
    -  def render_sources args
    -** Processing line: ~    mouse_in_panel = (args.state.selected != 0) && args.inputs.mouse.position.inside_rect?([900, 450, 340, 250])~
    +** Processing line: ~  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set~
     - Inside source: true
     *** True Line Result
    -    mouse_in_panel = (args.state.selected != 0) && args.inputs.mouse.position.inside_rect?([900, 450, 340, 250])
    -** Processing line: ~    mouse_new_down = (args.state.mouse_held == 1)~
    +  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    +** Processing line: ~    to the frame  that the key_up event occurred (the frame correlates~
     - Inside source: true
     *** True Line Result
    -    mouse_new_down = (args.state.mouse_held == 1)
    -** Processing line: ~~
    +    to the frame  that the key_up event occurred (the frame correlates
    +** Processing line: ~    to args.state.tick_count). Otherwise the value will be nil. For a~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if (mouse_new_down && !mouse_in_panel)~
    +    to args.state.tick_count). Otherwise the value will be nil. For a
    +** Processing line: ~    full listing of keys, take a look at mygame/documentation/06-keyboard.md.~
     - Inside source: true
     *** True Line Result
    -    if (mouse_new_down && !mouse_in_panel)
    -** Processing line: ~      args.state.selected = 0  # will reset below if we hit something.~
    +    full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    +** Processing line: ~  - args.state.PROPERTY: The state property on args is a dynamic~
     - Inside source: true
     *** True Line Result
    -      args.state.selected = 0  # will reset below if we hit something.
    -** Processing line: ~    end~
    +  - args.state.PROPERTY: The state property on args is a dynamic
    +** Processing line: ~    structure. You can define ANY property here with ANY type of~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    structure. You can define ANY property here with ANY type of
    +** Processing line: ~    arbitrary nesting. Properties defined on args.state will be retained~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.audio.keys.each { |k|~
    +    arbitrary nesting. Properties defined on args.state will be retained
    +** Processing line: ~    across frames. If you attempt access a property that doesn't exist~
     - Inside source: true
     *** True Line Result
    -    args.audio.keys.each { |k|
    -** Processing line: ~      s = args.audio[k]~
    +    across frames. If you attempt access a property that doesn't exist
    +** Processing line: ~    on args.state, it will simply return nil (no exception will be thrown).~
     - Inside source: true
     *** True Line Result
    -      s = args.audio[k]
    +    on args.state, it will simply return nil (no exception will be thrown).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if (mouse_new_down) && !mouse_in_panel && args.inputs.mouse.position.inside_rect?([s[:screenx], s[:screeny], $boxsize, $boxsize])~
    -- Inside source: true
    -*** True Line Result
    -      if (mouse_new_down) && !mouse_in_panel && args.inputs.mouse.position.inside_rect?([s[:screenx], s[:screeny], $boxsize, $boxsize])
    -** Processing line: ~        args.state.selected = k~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -        args.state.selected = k
    -** Processing line: ~        args.state.dragging_source = true~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        args.state.dragging_source = true
    -** Processing line: ~      end~
    +
    +** Processing line: ~  # Along with outputs, inputs are also an essential part of video game development~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +  # Along with outputs, inputs are also an essential part of video game development
    +** Processing line: ~  # DragonRuby can take input from keyboards, mouse, and controllers.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      isselected = (k == args.state.selected)~
    +  # DragonRuby can take input from keyboards, mouse, and controllers.
    +** Processing line: ~  # This sample app will cover keyboard input.~
     - Inside source: true
     *** True Line Result
    -      isselected = (k == args.state.selected)
    +  # This sample app will cover keyboard input.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if isselected && args.state.dragging_source~
    +** Processing line: ~  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed~
     - Inside source: true
     *** True Line Result
    -      if isselected && args.state.dragging_source
    -** Processing line: ~        # you can hang anything on the audio hashes you want, so we store the~
    +  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    +** Processing line: ~  # This will work with the other keys as well~
     - Inside source: true
     *** True Line Result
    -        # you can hang anything on the audio hashes you want, so we store the
    -** Processing line: ~        #  actual screen position so it doesn't scale weirdly vs your mouse.~
    +  # This will work with the other keys as well
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        #  actual screen position so it doesn't scale weirdly vs your mouse.
    -** Processing line: ~        s[:screenx] = args.inputs.mouse.x - ($boxsize / 2)~
    +
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s[:screenx] = args.inputs.mouse.x - ($boxsize / 2)
    -** Processing line: ~        s[:screeny] = args.inputs.mouse.y - ($boxsize / 2)~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -        s[:screeny] = args.inputs.mouse.y - ($boxsize / 2)
    -** Processing line: ~~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        s[:screeny] = 50 if s[:screeny] < 50~
    +    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    +** Processing line: ~    # Notice how small_font accounts for all the remaining parameters~
     - Inside source: true
     *** True Line Result
    -        s[:screeny] = 50 if s[:screeny] < 50
    -** Processing line: ~        s[:screeny] = (719 - $boxsize) if s[:screeny] > (719 - $boxsize)~
    +    # Notice how small_font accounts for all the remaining parameters
    +** Processing line: ~    args.outputs.labels << { x: 460, y: row_to_px(args, 0), text: "Current game time: #{args.state.tick_count}", size_enum: -1 }~
     - Inside source: true
     *** True Line Result
    -        s[:screeny] = (719 - $boxsize) if s[:screeny] > (719 - $boxsize)
    -** Processing line: ~        s[:screenx] = 0 if s[:screenx] < 0~
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 0), text: "Current game time: #{args.state.tick_count}", size_enum: -1 }
    +** Processing line: ~    args.outputs.labels << { x: 460, y: row_to_px(args, 2), text: "Keyboard input: args.inputs.keyboard.key_up.h", size_enum: -1 }~
     - Inside source: true
     *** True Line Result
    -        s[:screenx] = 0 if s[:screenx] < 0
    -** Processing line: ~        s[:screenx] = (1279 - $boxsize) if s[:screenx] > (1279 - $boxsize)~
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 2), text: "Keyboard input: args.inputs.keyboard.key_up.h", size_enum: -1 }
    +** Processing line: ~    args.outputs.labels << { x: 460, y: row_to_px(args, 3), text: "Press \"h\" on the keyboard.", size_enum: -1 }~
     - Inside source: true
     *** True Line Result
    -        s[:screenx] = (1279 - $boxsize) if s[:screenx] > (1279 - $boxsize)
    +    args.outputs.labels << { x: 460, y: row_to_px(args, 3), text: "Press \"h\" on the keyboard.", size_enum: -1 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        s[:x] = ((s[:screenx] / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range~
    -- Inside source: true
    -*** True Line Result
    -        s[:x] = ((s[:screenx] / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    -** Processing line: ~        s[:y] = ((s[:screeny] / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range~
    +** Processing line: ~    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key~
     - Inside source: true
     *** True Line Result
    -        s[:y] = ((s[:screeny] / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    -** Processing line: ~      end~
    +    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    +** Processing line: ~    if args.inputs.keyboard.key_up.h~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    if args.inputs.keyboard.key_up.h
    +** Processing line: ~      args.state.h_pressed_at = args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]~
    +      args.state.h_pressed_at = args.state.tick_count
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    -** Processing line: ~      args.outputs.primitives << [s[:screenx], s[:screeny], $boxsize, $boxsize, *color].solid~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [s[:screenx], s[:screeny], $boxsize, $boxsize, *color].solid
    -** Processing line: ~    }~
    +
    +** Processing line: ~    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false~
     - Inside source: true
     *** True Line Result
    -    }
    -** Processing line: ~  end~
    +    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    +** Processing line: ~    args.state.h_pressed_at ||= false~
     - Inside source: true
     *** True Line Result
    -  end
    +    args.state.h_pressed_at ||= false
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render_panel args~
    +** Processing line: ~    if args.state.h_pressed_at~
     - Inside source: true
     *** True Line Result
    -  def render_panel args
    -** Processing line: ~    s = args.audio[args.state.selected]~
    +    if args.state.h_pressed_at
    +** Processing line: ~      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" was pressed at time: #{args.state.h_pressed_at}", size_enum: -1 }~
     - Inside source: true
     *** True Line Result
    -    s = args.audio[args.state.selected]
    -** Processing line: ~    return if s.nil?~
    +      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" was pressed at time: #{args.state.h_pressed_at}", size_enum: -1 }
    +** Processing line: ~    else~
    +- Inside source: true
    +*** True Line Result
    +    else
    +** Processing line: ~      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" has never been pressed.", size_enum: -1 }~
     - Inside source: true
     *** True Line Result
    -    return if s.nil?
    -** Processing line: ~    mouse_down = (args.state.mouse_held > 0)~
    +      args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" has never been pressed.", size_enum: -1 }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    mouse_down = (args.state.mouse_held > 0)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.primitives << [900, 450, 340, 250, 127, 127, 200, 255].solid~
    +** Processing line: ~    tick_help_text args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [900, 450, 340, 250, 127, 127, 200, 255].solid
    -** Processing line: ~    args.outputs.primitives << [1075, 690, "Source ##{args.state.selected}", 3, 1, 255, 255, 255].label~
    +    tick_help_text args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [1075, 690, "Source ##{args.state.selected}", 3, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.primitives << [910, 660, 1230, 660, 255, 255, 255].line~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 660, 1230, 660, 255, 255, 255].line
    -** Processing line: ~    args.outputs.primitives << [910, 650, "screen:    (#{s[:screenx].to_i}, #{s[:screeny].to_i})", 0, 0, 255, 255, 255].label~
    +
    +** Processing line: ~  def row_to_px args, row_number, y_offset = 20~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 650, "screen:    (#{s[:screenx].to_i}, #{s[:screeny].to_i})", 0, 0, 255, 255, 255].label
    -** Processing line: ~    args.outputs.primitives << [910, 625, "position:  (#{s[:x].round(5).to_s[0..6]}, #{s[:y].round(5).to_s[0..6]})", 0, 0, 255, 255, 255].label~
    +  def row_to_px args, row_number, y_offset = 20
    +** Processing line: ~    # This takes a row_number and converts it to pixels DragonRuby understands.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 625, "position:  (#{s[:x].round(5).to_s[0..6]}, #{s[:y].round(5).to_s[0..6]})", 0, 0, 255, 255, 255].label
    -** Processing line: ~~
    +    # This takes a row_number and converts it to pixels DragonRuby understands.
    +** Processing line: ~    # Row 0 starts 5 units below the top of the grid~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    slider = [1022, 586, 200, 7]~
    +    # Row 0 starts 5 units below the top of the grid
    +** Processing line: ~    # Each row afterward is 20 units lower~
    +- Inside source: true
    +*** True Line Result
    +    # Each row afterward is 20 units lower
    +** Processing line: ~    args.grid.top - 5 - (y_offset * row_number)~
     - Inside source: true
     *** True Line Result
    -    slider = [1022, 586, 200, 7]
    -** Processing line: ~    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)~
    +    args.grid.top - 5 - (y_offset * row_number)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -** Processing line: ~      s[:pitch] = ((args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)) * 2.0~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      s[:pitch] = ((args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)) * 2.0
    -** Processing line: ~    end~
    +
    +** Processing line: ~  # Don't worry about understanding the code within this method just yet.~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    slidercolor = (s[:pitch] / 2.0) * 255~
    +  # Don't worry about understanding the code within this method just yet.
    +** Processing line: ~  # This method shows you the help text within the game.~
     - Inside source: true
     *** True Line Result
    -    slidercolor = (s[:pitch] / 2.0) * 255
    -** Processing line: ~    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid~
    +  # This method shows you the help text within the game.
    +** Processing line: ~  def tick_help_text args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -** Processing line: ~    args.outputs.primitives << [910, 600, "pitch: #{s[:pitch].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label~
    +  def tick_help_text args
    +** Processing line: ~    return unless args.state.h_pressed_at~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 600, "pitch: #{s[:pitch].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
    +    return unless args.state.h_pressed_at
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    slider = [1022, 561, 200, 7]~
    +** Processing line: ~    args.state.key_value_history      ||= {}~
     - Inside source: true
     *** True Line Result
    -    slider = [1022, 561, 200, 7]
    -** Processing line: ~    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)~
    +    args.state.key_value_history      ||= {}
    +** Processing line: ~    args.state.key_down_value_history ||= {}~
     - Inside source: true
     *** True Line Result
    -    if mouse_down && args.inputs.mouse.position.inside_rect?(slider)
    -** Processing line: ~      s[:gain] = (args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)~
    +    args.state.key_down_value_history ||= {}
    +** Processing line: ~    args.state.key_held_value_history ||= {}~
     - Inside source: true
     *** True Line Result
    -      s[:gain] = (args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)
    -** Processing line: ~    end~
    +    args.state.key_held_value_history ||= {}
    +** Processing line: ~    args.state.key_up_value_history   ||= {}~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    slidercolor = s[:gain] * 255~
    +    args.state.key_up_value_history   ||= {}
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    slidercolor = s[:gain] * 255
    -** Processing line: ~    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid~
    +
    +** Processing line: ~    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid
    -** Processing line: ~    args.outputs.primitives << [910, 575, "gain: #{s[:gain].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label~
    +    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    +** Processing line: ~        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 575, "gain: #{s[:gain].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label
    -** Processing line: ~~
    +        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    +** Processing line: ~        args.inputs.keyboard.key_up.truthy_keys.length > 0)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    checkbox = [1022, 533, 10, 12]~
    +        args.inputs.keyboard.key_up.truthy_keys.length > 0)
    +** Processing line: ~      args.state.help_available = true~
     - Inside source: true
     *** True Line Result
    -    checkbox = [1022, 533, 10, 12]
    -** Processing line: ~    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)~
    +      args.state.help_available = true
    +** Processing line: ~      args.state.no_activity_debounce = nil~
     - Inside source: true
     *** True Line Result
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -** Processing line: ~      s[:looping] = !s[:looping]~
    +      args.state.no_activity_debounce = nil
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      s[:looping] = !s[:looping]
    -** Processing line: ~    end~
    +    else
    +** Processing line: ~      args.state.no_activity_debounce ||= 5.seconds~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    checkboxcolor = s[:looping] ? 255 : 0~
    +      args.state.no_activity_debounce ||= 5.seconds
    +** Processing line: ~      args.state.no_activity_debounce -= 1~
     - Inside source: true
     *** True Line Result
    -    checkboxcolor = s[:looping] ? 255 : 0
    -** Processing line: ~    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid~
    +      args.state.no_activity_debounce -= 1
    +** Processing line: ~      if args.state.no_activity_debounce <= 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -** Processing line: ~    args.outputs.primitives << [910, 550, "looping:", 0, 0, 255, 255, 255].label~
    +      if args.state.no_activity_debounce <= 0
    +** Processing line: ~        args.state.help_available = false~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 550, "looping:", 0, 0, 255, 255, 255].label
    -** Processing line: ~~
    +        args.state.help_available = false
    +** Processing line: ~        args.state.key_value_history        = {}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    checkbox = [1022, 508, 10, 12]~
    +        args.state.key_value_history        = {}
    +** Processing line: ~        args.state.key_down_value_history   = {}~
     - Inside source: true
     *** True Line Result
    -    checkbox = [1022, 508, 10, 12]
    -** Processing line: ~    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)~
    +        args.state.key_down_value_history   = {}
    +** Processing line: ~        args.state.key_held_value_history   = {}~
     - Inside source: true
     *** True Line Result
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)
    -** Processing line: ~      s[:paused] = !s[:paused]~
    +        args.state.key_held_value_history   = {}
    +** Processing line: ~        args.state.key_up_value_history     = {}~
     - Inside source: true
     *** True Line Result
    -      s[:paused] = !s[:paused]
    -** Processing line: ~    end~
    +        args.state.key_up_value_history     = {}
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    checkboxcolor = s[:paused] ? 255 : 0~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    checkboxcolor = s[:paused] ? 255 : 0
    -** Processing line: ~    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid
    -** Processing line: ~    args.outputs.primitives << [910, 525, "paused:", 0, 0, 255, 255, 255].label~
    +
    +** Processing line: ~    args.outputs.labels << { x: 10, y: row_to_px(args, 6), text: "This is the api for the keys you've pressed:", size_enum: -1, r: 180 }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [910, 525, "paused:", 0, 0, 255, 255, 255].label
    +    args.outputs.labels << { x: 10, y: row_to_px(args, 6), text: "This is the api for the keys you've pressed:", size_enum: -1, r: 180 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    button = [910, 460, 320, 20]~
    -- Inside source: true
    -*** True Line Result
    -    button = [910, 460, 320, 20]
    -** Processing line: ~    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(button)~
    +** Processing line: ~    if !args.state.help_available~
     - Inside source: true
     *** True Line Result
    -    if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(button)
    -** Processing line: ~      args.audio.delete(args.state.selected)~
    +    if !args.state.help_available
    +** Processing line: ~      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]~
     - Inside source: true
     *** True Line Result
    -      args.audio.delete(args.state.selected)
    -** Processing line: ~      args.state.selected = 0~
    +      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    +** Processing line: ~      return~
     - Inside source: true
     *** True Line Result
    -      args.state.selected = 0
    +      return
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~    args.outputs.primitives << [*button, 255, 0, 0, 255].solid~
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    args.outputs.labels << { x: 10 , y: row_to_px(args, 7), text: "args.inputs.keyboard",          size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [*button, 255, 0, 0, 255].solid
    -** Processing line: ~    args.outputs.primitives << [button[0] + (button[2] / 2), button[1]+20, "DELETE SOURCE", 0, 1, 255, 255, 0].label~
    +    args.outputs.labels << { x: 10 , y: row_to_px(args, 7), text: "args.inputs.keyboard",          size_enum: -2 }
    +** Processing line: ~    args.outputs.labels << { x: 330, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_down", size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [button[0] + (button[2] / 2), button[1]+20, "DELETE SOURCE", 0, 1, 255, 255, 0].label
    -** Processing line: ~  end~
    +    args.outputs.labels << { x: 330, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_down", size_enum: -2 }
    +** Processing line: ~    args.outputs.labels << { x: 650, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_held", size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -  end
    +    args.outputs.labels << { x: 650, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_held", size_enum: -2 }
    +** Processing line: ~    args.outputs.labels << { x: 990, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_up",   size_enum: -2 }~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.labels << { x: 990, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_up",   size_enum: -2 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def spawn_new_sound args, num~
    +** Processing line: ~    fill_history args, :key_value_history,      :down_or_held, nil~
    +- Inside source: true
    +*** True Line Result
    +    fill_history args, :key_value_history,      :down_or_held, nil
    +** Processing line: ~    fill_history args, :key_down_value_history, :down,        :key_down~
     - Inside source: true
     *** True Line Result
    -  def spawn_new_sound args, num
    -** Processing line: ~    input = nil~
    +    fill_history args, :key_down_value_history, :down,        :key_down
    +** Processing line: ~    fill_history args, :key_held_value_history, :held,        :key_held~
     - Inside source: true
     *** True Line Result
    -    input = nil
    -** Processing line: ~    input = "sounds/#{num}.#{(num == 6) ? 'ogg' : 'wav'}"~
    +    fill_history args, :key_held_value_history, :held,        :key_held
    +** Processing line: ~    fill_history args, :key_up_value_history,   :up,          :key_up~
     - Inside source: true
     *** True Line Result
    -    input = "sounds/#{num}.#{(num == 6) ? 'ogg' : 'wav'}"
    +    fill_history args, :key_up_value_history,   :up,          :key_up
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Spawn randomly in an area that won't be covered by UI.~
    +** Processing line: ~    render_help_labels args, :key_value_history,      :down_or_held, nil,      10~
     - Inside source: true
     *** True Line Result
    -    # Spawn randomly in an area that won't be covered by UI.
    -** Processing line: ~    screenx = (rand * 600.0) + 200.0~
    +    render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    +** Processing line: ~    render_help_labels args, :key_down_value_history, :down,        :key_down, 330~
     - Inside source: true
     *** True Line Result
    -    screenx = (rand * 600.0) + 200.0
    -** Processing line: ~    screeny = (rand * 400.0) + 100.0~
    +    render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    +** Processing line: ~    render_help_labels args, :key_held_value_history, :held,        :key_held, 650~
     - Inside source: true
     *** True Line Result
    -    screeny = (rand * 400.0) + 100.0
    -** Processing line: ~~
    +    render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    +** Processing line: ~    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.next_sound_index += 1~
    +    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.state.next_sound_index += 1
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # you can hang anything on the audio hashes you want, so we store the~
    +** Processing line: ~  def fill_history args, history_key, state_key, keyboard_method~
     - Inside source: true
     *** True Line Result
    -    # you can hang anything on the audio hashes you want, so we store the
    -** Processing line: ~    #  actual screen position in here for convenience.~
    +  def fill_history args, history_key, state_key, keyboard_method
    +** Processing line: ~    fill_single_history args, history_key, state_key, keyboard_method, :raw_key~
     - Inside source: true
     *** True Line Result
    -    #  actual screen position in here for convenience.
    -** Processing line: ~    args.audio[args.state.next_sound_index] = {~
    +    fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    +** Processing line: ~    fill_single_history args, history_key, state_key, keyboard_method, :char~
     - Inside source: true
     *** True Line Result
    -    args.audio[args.state.next_sound_index] = {
    -** Processing line: ~      input: input,~
    +    fill_single_history args, history_key, state_key, keyboard_method, :char
    +** Processing line: ~    args.inputs.keyboard.keys[state_key].each do |key_name|~
     - Inside source: true
     *** True Line Result
    -      input: input,
    -** Processing line: ~      screenx: screenx,~
    +    args.inputs.keyboard.keys[state_key].each do |key_name|
    +** Processing line: ~      fill_single_history args, history_key, state_key, keyboard_method, key_name~
     - Inside source: true
     *** True Line Result
    -      screenx: screenx,
    -** Processing line: ~      screeny: screeny,~
    +      fill_single_history args, history_key, state_key, keyboard_method, key_name
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      screeny: screeny,
    -** Processing line: ~      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    -** Processing line: ~      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    -** Processing line: ~      z: 0.0,~
    +
    +** Processing line: ~  def fill_single_history args, history_key, state_key, keyboard_method, key_name~
     - Inside source: true
     *** True Line Result
    -      z: 0.0,
    -** Processing line: ~      gain: 1.0,~
    +  def fill_single_history args, history_key, state_key, keyboard_method, key_name
    +** Processing line: ~    current_value = args.inputs.keyboard.send(key_name)~
     - Inside source: true
     *** True Line Result
    -      gain: 1.0,
    -** Processing line: ~      pitch: 1.0,~
    +    current_value = args.inputs.keyboard.send(key_name)
    +** Processing line: ~    if keyboard_method~
     - Inside source: true
     *** True Line Result
    -      pitch: 1.0,
    -** Processing line: ~      looping: true,~
    +    if keyboard_method
    +** Processing line: ~      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)~
     - Inside source: true
     *** True Line Result
    -      looping: true,
    -** Processing line: ~      paused: false~
    +      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      paused: false
    -** Processing line: ~    }~
    +    end
    +** Processing line: ~    args.state.as_hash[history_key][key_name] ||= []~
     - Inside source: true
     *** True Line Result
    -    }
    -** Processing line: ~~
    +    args.state.as_hash[history_key][key_name] ||= []
    +** Processing line: ~    args.state.as_hash[history_key][key_name] << current_value~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.selected = args.state.next_sound_index~
    +    args.state.as_hash[history_key][key_name] << current_value
    +** Processing line: ~    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse~
     - Inside source: true
     *** True Line Result
    -    args.state.selected = args.state.next_sound_index
    +    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -14448,78 +14979,82 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render_launcher args~
    +** Processing line: ~  def render_help_labels args, history_key, state_key, keyboard_method, x~
     - Inside source: true
     *** True Line Result
    -  def render_launcher args
    -** Processing line: ~    total = 6~
    +  def render_help_labels args, history_key, state_key, keyboard_method, x
    +** Processing line: ~    idx = 8~
    +- Inside source: true
    +*** True Line Result
    +    idx = 8
    +** Processing line: ~    args.outputs.labels << args.state~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.labels << args.state
    +** Processing line: ~                             .as_hash[history_key]~
     - Inside source: true
     *** True Line Result
    -    total = 6
    -** Processing line: ~    x = (1280 - (total * $boxsize * 3)) / 2~
    +                             .as_hash[history_key]
    +** Processing line: ~                             .keys~
     - Inside source: true
     *** True Line Result
    -    x = (1280 - (total * $boxsize * 3)) / 2
    -** Processing line: ~    y = 10~
    +                             .keys
    +** Processing line: ~                             .reverse~
     - Inside source: true
     *** True Line Result
    -    y = 10
    -** Processing line: ~    args.outputs.primitives << [0, 0, 1280, ((y*2) + $boxsize), 127, 127, 127, 255].solid~
    +                             .reverse
    +** Processing line: ~                             .map~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [0, 0, 1280, ((y*2) + $boxsize), 127, 127, 127, 255].solid
    -** Processing line: ~    for i in 1..total~
    +                             .map
    +** Processing line: ~                             .with_index do |k, i|~
     - Inside source: true
     *** True Line Result
    -    for i in 1..total
    -** Processing line: ~      args.outputs.primitives << [x, y, $boxsize, $boxsize, 255, 255, 255, 255].solid~
    +                             .with_index do |k, i|
    +** Processing line: ~      v = args.state.as_hash[history_key][k]~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [x, y, $boxsize, $boxsize, 255, 255, 255, 255].solid
    -** Processing line: ~      args.outputs.primitives << [x+8, y+28, i.to_s, 3, 0, 0, 0, 255, 255].label~
    +      v = args.state.as_hash[history_key][k]
    +** Processing line: ~      current_value = args.inputs.keyboard.send(k)~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [x+8, y+28, i.to_s, 3, 0, 0, 0, 255, 255].label
    -** Processing line: ~      if args.inputs.mouse.click && args.inputs.mouse.click.point.inside_rect?([x, y, $boxsize, $boxsize])~
    +      current_value = args.inputs.keyboard.send(k)
    +** Processing line: ~      if keyboard_method~
     - Inside source: true
     *** True Line Result
    -      if args.inputs.mouse.click && args.inputs.mouse.click.point.inside_rect?([x, y, $boxsize, $boxsize])
    -** Processing line: ~        spawn_new_sound args, i~
    +      if keyboard_method
    +** Processing line: ~        current_value = args.inputs.keyboard.send(keyboard_method).send(k)~
     - Inside source: true
     *** True Line Result
    -        spawn_new_sound args, i
    +        current_value = args.inputs.keyboard.send(keyboard_method).send(k)
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    -** Processing line: ~      x = x + ($boxsize * 3)~
    -- Inside source: true
    -*** True Line Result
    -      x = x + ($boxsize * 3)
    -** Processing line: ~    end~
    +** Processing line: ~      idx += 2~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      idx += 2
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      [
    +** Processing line: ~        { x: x, y: row_to_px(args, idx + 0, 16), text: "    .#{k} is #{current_value || "nil"}", size_enum: -2 },~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def render_ui args~
    +        { x: x, y: row_to_px(args, idx + 0, 16), text: "    .#{k} is #{current_value || "nil"}", size_enum: -2 },
    +** Processing line: ~        { x: x, y: row_to_px(args, idx + 1, 16), text: "       was #{v}", size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -  def render_ui args
    -** Processing line: ~    render_launcher args~
    +        { x: x, y: row_to_px(args, idx + 1, 16), text: "       was #{v}", size_enum: -2 }
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -    render_launcher args
    -** Processing line: ~    render_panel args~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    render_panel args
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -14528,54 +15063,38 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    -- Inside source: true
    -*** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.mouse_held ||= 0~
    -- Inside source: true
    -*** True Line Result
    -    args.state.mouse_held ||= 0
    -** Processing line: ~    args.state.dragging_source ||= false~
    -- Inside source: true
    -*** True Line Result
    -    args.state.dragging_source ||= false
    -** Processing line: ~    args.state.selected ||= 0~
    -- Inside source: true
    -*** True Line Result
    -    args.state.selected ||= 0
    -** Processing line: ~    args.state.next_sound_index ||= 0~
    -- Inside source: true
    -*** True Line Result
    -    args.state.next_sound_index ||= 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.inputs.mouse.up~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.up
    -** Processing line: ~      args.state.mouse_held = 0~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -      args.state.mouse_held = 0
    -** Processing line: ~      args.state.dragging_source = false~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -      args.state.dragging_source = false
    -** Processing line: ~    elsif args.inputs.mouse.down || (args.state.mouse_held > 0)~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.mouse.down || (args.state.mouse_held > 0)
    -** Processing line: ~      args.state.mouse_held += 1~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -      args.state.mouse_held += 1
    -** Processing line: ~    else~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -    else
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
    +- Inside source: true
    +*** True Line Result
    +      args.state.key_event_occurred = true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -14584,18 +15103,26 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.background_color = [ 0, 0, 0, 255 ]~
    +** Processing line: ~    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [ 0, 0, 0, 255 ]
    -** Processing line: ~    render_sources args~
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y,      text: text,~
     - Inside source: true
     *** True Line Result
    -    render_sources args
    -** Processing line: ~    render_ui args~
    +    args.outputs.debug << { x: 640, y: y,      text: text,
    +** Processing line: ~                            size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -    render_ui args
    +                            size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)",~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)",
    +** Processing line: ~                            size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
    +- Inside source: true
    +*** True Line Result
    +                            size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -14612,110 +15139,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Rendering Basics - Sound Synthesis - main.rb~
    +** Processing line: ~*** Input Basics - Moving A Sprite - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Rendering Basics - Sound Synthesis - main.rb
    +*** Input Basics - Moving A Sprite - 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/01_rendering_basics/07_sound_synthesis/app/main.rb~
    +** Processing line: ~  # ./samples/02_input_basics/01_moving_a_sprite/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/01_rendering_basics/07_sound_synthesis/app/main.rb
    -** Processing line: ~  begin # region: top level tick methods~
    +  # ./samples/02_input_basics/01_moving_a_sprite/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -  begin # region: top level tick methods
    -** Processing line: ~    def tick args~
    +  def tick args
    +** Processing line: ~    # create a player and set default values~
     - Inside source: true
     *** True Line Result
    -    def tick args
    -** Processing line: ~      defaults args~
    +    # create a player and set default values
    +** Processing line: ~    # for the player's x, y, w (width), and h (height)~
     - Inside source: true
     *** True Line Result
    -      defaults args
    -** Processing line: ~      render args~
    +    # for the player's x, y, w (width), and h (height)
    +** Processing line: ~    args.state.player.x ||= 100~
     - Inside source: true
     *** True Line Result
    -      render args
    -** Processing line: ~      input args~
    +    args.state.player.x ||= 100
    +** Processing line: ~    args.state.player.y ||= 100~
     - Inside source: true
     *** True Line Result
    -      input args
    -** Processing line: ~      process_audio_queue args~
    +    args.state.player.y ||= 100
    +** Processing line: ~    args.state.player.w ||=  50~
     - Inside source: true
     *** True Line Result
    -      process_audio_queue args
    -** Processing line: ~    end~
    +    args.state.player.w ||=  50
    +** Processing line: ~    args.state.player.h ||=  50~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.player.h ||=  50
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def defaults args~
    -- Inside source: true
    -*** True Line Result
    -    def defaults args
    -** Processing line: ~      args.state.sine_waves      ||= {}~
    -- Inside source: true
    -*** True Line Result
    -      args.state.sine_waves      ||= {}
    -** Processing line: ~      args.state.square_waves    ||= {}~
    +** Processing line: ~    # render the player to the screen~
     - Inside source: true
     *** True Line Result
    -      args.state.square_waves    ||= {}
    -** Processing line: ~      args.state.saw_tooth_waves ||= {}~
    +    # render the player to the screen
    +** Processing line: ~    args.outputs.sprites << { x: args.state.player.x,~
     - Inside source: true
     *** True Line Result
    -      args.state.saw_tooth_waves ||= {}
    -** Processing line: ~      args.state.triangle_waves  ||= {}~
    +    args.outputs.sprites << { x: args.state.player.x,
    +** Processing line: ~                              y: args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -      args.state.triangle_waves  ||= {}
    -** Processing line: ~      args.state.audio_queue     ||= []~
    +                              y: args.state.player.y,
    +** Processing line: ~                              w: args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -      args.state.audio_queue     ||= []
    -** Processing line: ~      args.state.buttons         ||= [~
    +                              w: args.state.player.w,
    +** Processing line: ~                              h: args.state.player.h,~
     - Inside source: true
     *** True Line Result
    -      args.state.buttons         ||= [
    -** Processing line: ~        (frequency_buttons args),~
    +                              h: args.state.player.h,
    +** Processing line: ~                              path: 'sprites/square/green.png' }~
     - Inside source: true
     *** True Line Result
    -        (frequency_buttons args),
    -** Processing line: ~        (sine_wave_note_buttons args),~
    +                              path: 'sprites/square/green.png' }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (sine_wave_note_buttons args),
    -** Processing line: ~        (bell_buttons args),~
    +
    +** Processing line: ~    # move the player around using the keyboard~
     - Inside source: true
     *** True Line Result
    -        (bell_buttons args),
    -** Processing line: ~        (square_wave_note_buttons args),~
    +    # move the player around using the keyboard
    +** Processing line: ~    if args.inputs.up~
     - Inside source: true
     *** True Line Result
    -        (square_wave_note_buttons args),
    -** Processing line: ~        (saw_tooth_wave_note_buttons args),~
    +    if args.inputs.up
    +** Processing line: ~      args.state.player.y += 10~
     - Inside source: true
     *** True Line Result
    -        (saw_tooth_wave_note_buttons args),
    -** Processing line: ~        (triangle_wave_note_buttons args),~
    +      args.state.player.y += 10
    +** Processing line: ~    elsif args.inputs.down~
     - Inside source: true
     *** True Line Result
    -        (triangle_wave_note_buttons args),
    -** Processing line: ~      ].flatten~
    +    elsif args.inputs.down
    +** Processing line: ~      args.state.player.y -= 10~
     - Inside source: true
     *** True Line Result
    -      ].flatten
    +      args.state.player.y -= 10
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -14724,258 +15243,250 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render args~
    -- Inside source: true
    -*** True Line Result
    -    def render args
    -** Processing line: ~      args.outputs.borders << args.state.buttons.map { |b| b[:border] }~
    +** Processing line: ~    if args.inputs.left~
     - Inside source: true
     *** True Line Result
    -      args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    -** Processing line: ~      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }~
    +    if args.inputs.left
    +** Processing line: ~      args.state.player.x -= 10~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    -** Processing line: ~      args.outputs.labels  << args.layout~
    +      args.state.player.x -= 10
    +** Processing line: ~    elsif args.inputs.right~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels  << args.layout
    -** Processing line: ~                                .rect(row: 0, col: 11.5)~
    +    elsif args.inputs.right
    +** Processing line: ~      args.state.player.x += 10~
     - Inside source: true
     *** True Line Result
    -                                .rect(row: 0, col: 11.5)
    -** Processing line: ~                                .yield_self { |r| r.merge y: r.y + r.h }~
    +      args.state.player.x += 10
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                                .yield_self { |r| r.merge y: r.y + r.h }
    -** Processing line: ~                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    -** Processing line: ~                                       alignment_enum: 1)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                       alignment_enum: 1)
    -** Processing line: ~    end~
    +
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -    end
    +  $gtk.reset
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    def input args~
    -- Inside source: true
    +** Processing line: ~*** Input Basics - Mouse - main.rb~
    +- Header detected.
     *** True Line Result
    -    def input args
    -** Processing line: ~      args.state.buttons.each do |b|~
    -- Inside source: true
    +
     *** True Line Result
    -      args.state.buttons.each do |b|
    -** Processing line: ~        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])~
    -- Inside source: true
    +*** Input Basics - Mouse - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    -** Processing line: ~          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "~
    -- Inside source: true
    +
     *** True Line Result
    -          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    -** Processing line: ~          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/02_input_basics/02_mouse/app/main.rb~
     - Inside source: true
     *** True Line Result
    -          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    -** Processing line: ~          send b[:method_to_call], args, b~
    +  # ./samples/02_input_basics/02_mouse/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -          send b[:method_to_call], args, b
    -** Processing line: ~        end~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
     - Inside source: true
     *** True Line Result
    -      end
    +  APIs that haven't been encountered in a previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))~
    +** Processing line: ~  - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
     - Inside source: true
     *** True Line Result
    -      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    -** Processing line: ~        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'~
    +  - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +** Processing line: ~  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
     - Inside source: true
     *** True Line Result
    -        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    -** Processing line: ~      end~
    +  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +** Processing line: ~  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +** Processing line: ~  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed~
     - Inside source: true
     *** True Line Result
    -    end
    +  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +** Processing line: ~    since the click event.~
    +- Inside source: true
    +*** True Line Result
    +    since the click event.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def process_audio_queue args~
    +** Processing line: ~  Reminder:~
     - Inside source: true
     *** True Line Result
    -    def process_audio_queue args
    -** Processing line: ~      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }~
    +  Reminder:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    -** Processing line: ~      args.state.audio_queue -= to_queue~
    +
    +** Processing line: ~  - args.state.PROPERTY: The state property on args is a dynamic~
     - Inside source: true
     *** True Line Result
    -      args.state.audio_queue -= to_queue
    -** Processing line: ~      to_queue.each { |a| args.audio[a[:id]] = a }~
    +  - args.state.PROPERTY: The state property on args is a dynamic
    +** Processing line: ~    structure. You can define ANY property here with ANY type of~
     - Inside source: true
     *** True Line Result
    -      to_queue.each { |a| args.audio[a[:id]] = a }
    -** Processing line: ~~
    +    structure. You can define ANY property here with ANY type of
    +** Processing line: ~    arbitrary nesting. Properties defined on args.state will be retained~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      args.audio.find_all { |k, v| v[:decay_rate] }~
    +    arbitrary nesting. Properties defined on args.state will be retained
    +** Processing line: ~    across frames. If you attempt access a property that doesn't exist~
     - Inside source: true
     *** True Line Result
    -      args.audio.find_all { |k, v| v[:decay_rate] }
    -** Processing line: ~        .each     { |k, v| v[:gain] -= v[:decay_rate] }~
    +    across frames. If you attempt access a property that doesn't exist
    +** Processing line: ~    on args.state, it will simply return nil (no exception will be thrown).~
     - Inside source: true
     *** True Line Result
    -        .each     { |k, v| v[:gain] -= v[:decay_rate] }
    +    on args.state, it will simply return nil (no exception will be thrown).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      sounds_to_stop = args.audio~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      sounds_to_stop = args.audio
    -** Processing line: ~                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    -** Processing line: ~                         .map { |k, v| k }~
    +
    +** Processing line: ~  # This code demonstrates DragonRuby mouse input~
     - Inside source: true
     *** True Line Result
    -                         .map { |k, v| k }
    +  # This code demonstrates DragonRuby mouse input
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      sounds_to_stop.each { |k| args.audio.delete k }~
    +** Processing line: ~  # To see if the a mouse click occurred~
     - Inside source: true
     *** True Line Result
    -      sounds_to_stop.each { |k| args.audio.delete k }
    -** Processing line: ~    end~
    +  # To see if the a mouse click occurred
    +** Processing line: ~  # Use args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +  # Use args.inputs.mouse.click
    +** Processing line: ~  # Which returns a boolean~
     - Inside source: true
     *** True Line Result
    -  end
    +  # Which returns a boolean
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin # region: button definitions, ui layout, callback functions~
    -- Inside source: true
    -*** True Line Result
    -  begin # region: button definitions, ui layout, callback functions
    -** Processing line: ~    def button args, opts~
    -- Inside source: true
    -*** True Line Result
    -    def button args, opts
    -** Processing line: ~      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))~
    +** Processing line: ~  # To see where a mouse click occurred~
     - Inside source: true
     *** True Line Result
    -      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
    -** Processing line: ~~
    +  # To see where a mouse click occurred
    +** Processing line: ~  # Use args.inputs.mouse.click.point.x AND~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0~
    +  # Use args.inputs.mouse.click.point.x AND
    +** Processing line: ~  # args.inputs.mouse.click.point.y~
     - Inside source: true
     *** True Line Result
    -      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
    +  # args.inputs.mouse.click.point.y
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      label_offset_x = 5~
    +** Processing line: ~  # To see which frame the click occurred~
     - Inside source: true
     *** True Line Result
    -      label_offset_x = 5
    -** Processing line: ~      label_offset_y = 30~
    +  # To see which frame the click occurred
    +** Processing line: ~  # Use args.inputs.mouse.click.created_at~
     - Inside source: true
     *** True Line Result
    -      label_offset_y = 30
    +  # Use args.inputs.mouse.click.created_at
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      button_def[:label]  = button_def[:rect].merge text: opts[:text],~
    +** Processing line: ~  # To see how many frames its been since the click occurred~
     - Inside source: true
     *** True Line Result
    -      button_def[:label]  = button_def[:rect].merge text: opts[:text],
    -** Processing line: ~                                                    size_enum: -2.5,~
    +  # To see how many frames its been since the click occurred
    +** Processing line: ~  # Use args.inputs.mouse.click.creat_at_elapsed~
     - Inside source: true
     *** True Line Result
    -                                                    size_enum: -2.5,
    -** Processing line: ~                                                    x: button_def[:rect].x + label_offset_x,~
    +  # Use args.inputs.mouse.click.creat_at_elapsed
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                                    x: button_def[:rect].x + label_offset_x,
    -** Processing line: ~                                                    y: button_def[:rect].y + label_offset_y~
    +
    +** Processing line: ~  # Saving the click in args.state can be quite useful~
     - Inside source: true
     *** True Line Result
    -                                                    y: button_def[:rect].y + label_offset_y
    +  # Saving the click in args.state can be quite useful
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      button_def~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      button_def
    -** Processing line: ~    end~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    +** Processing line: ~    x = 460~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def play_sine_wave args, sender~
    +    x = 460
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def play_sine_wave args, sender
    -** Processing line: ~      queue_sine_wave args,~
    +
    +** Processing line: ~    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")~
     - Inside source: true
     *** True Line Result
    -      queue_sine_wave args,
    -** Processing line: ~                      frequency: sender[:frequency],~
    +    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                      frequency: sender[:frequency],
    -** Processing line: ~                      duration: 1.seconds,~
    +
    +** Processing line: ~    if args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -                      duration: 1.seconds,
    -** Processing line: ~                      fade_out: true~
    +    if args.inputs.mouse.click
    +** Processing line: ~      args.state.last_mouse_click = args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -                      fade_out: true
    +      args.state.last_mouse_click = args.inputs.mouse.click
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -14984,118 +15495,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def play_note args, sender~
    +** Processing line: ~    if args.state.last_mouse_click~
     - Inside source: true
     *** True Line Result
    -    def play_note args, sender
    -** Processing line: ~      method_to_call = :queue_sine_wave~
    +    if args.state.last_mouse_click
    +** Processing line: ~      click = args.state.last_mouse_click~
     - Inside source: true
     *** True Line Result
    -      method_to_call = :queue_sine_wave
    -** Processing line: ~      method_to_call = :queue_square_wave    if sender[:type] == :square~
    +      click = args.state.last_mouse_click
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")~
     - Inside source: true
     *** True Line Result
    -      method_to_call = :queue_square_wave    if sender[:type] == :square
    -** Processing line: ~      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth~
    +      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")~
     - Inside source: true
     *** True Line Result
    -      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    -** Processing line: ~      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle~
    +      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")~
     - Inside source: true
     *** True Line Result
    -      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    -** Processing line: ~      method_to_call = :queue_bell           if sender[:type] == :bell~
    +      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      method_to_call = :queue_bell           if sender[:type] == :bell
    -** Processing line: ~~
    +    else
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      send method_to_call, args,~
    +      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")~
     - Inside source: true
     *** True Line Result
    -      send method_to_call, args,
    -** Processing line: ~           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),~
    +      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    -** Processing line: ~           duration: 1.seconds,~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -           duration: 1.seconds,
    -** Processing line: ~           fade_out: true~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -           fade_out: true
    -** Processing line: ~    end~
    +
    +** Processing line: ~  def small_label args, x, row, message~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  def small_label args, x, row, message
    +** Processing line: ~    # This method effectively combines the row_to_px and small_font methods~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def frequency_buttons args~
    +    # This method effectively combines the row_to_px and small_font methods
    +** Processing line: ~    # It changes the given row value to a DragonRuby pixel value~
     - Inside source: true
     *** True Line Result
    -    def frequency_buttons args
    -** Processing line: ~      [~
    +    # It changes the given row value to a DragonRuby pixel value
    +** Processing line: ~    # and adds the customization parameters~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    # and adds the customization parameters
    +** Processing line: ~    { x: x, y: row_to_px(args, row), text: message, alignment_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.0, col: 0, text: "300hz",~
    +    { x: x, y: row_to_px(args, row), text: message, alignment_enum: -2 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                row: 4.0, col: 0, text: "300hz",
    -** Processing line: ~                frequency: 300,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                frequency: 300,
    -** Processing line: ~                method_to_call: :play_sine_wave),~
    +
    +** Processing line: ~  def row_to_px args, row_number~
     - Inside source: true
     *** True Line Result
    -                method_to_call: :play_sine_wave),
    -** Processing line: ~        (button args,~
    +  def row_to_px args, row_number
    +** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.0, col: 0, text: "400hz",~
    +    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                row: 5.0, col: 0, text: "400hz",
    -** Processing line: ~                frequency: 400,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                frequency: 400,
    -** Processing line: ~                method_to_call: :play_sine_wave),~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -                method_to_call: :play_sine_wave),
    -** Processing line: ~        (button args,~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.0, col: 0, text: "500hz",~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -                row: 6.0, col: 0, text: "500hz",
    -** Processing line: ~                frequency: 500,~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -                frequency: 500,
    -** Processing line: ~                method_to_call: :play_sine_wave),~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -                method_to_call: :play_sine_wave),
    -** Processing line: ~      ]~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -      ]
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
    +- Inside source: true
    +*** True Line Result
    +      args.state.key_event_occurred = true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -15104,1030 +15619,994 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def sine_wave_note_buttons args~
    +** Processing line: ~    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!~
     - Inside source: true
     *** True Line Result
    -    def sine_wave_note_buttons args
    -** Processing line: ~      [~
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 1.5, col: 2, text: "Sine C4",~
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                row: 1.5, col: 2, text: "Sine C4",
    -** Processing line: ~                note: :c, octave: 4, type: :sine, method_to_call: :play_note),~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 2.5, col: 2, text: "Sine D4",~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -                row: 2.5, col: 2, text: "Sine D4",
    -** Processing line: ~                note: :d, octave: 4, type: :sine, method_to_call: :play_note),~
    -- Inside source: true
    +
    +** Processing line: ~*** Input Basics - Mouse Point To Rect - main.rb~
    +- Header detected.
     *** True Line Result
    -                note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    -- Inside source: true
    +
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 3.5, col: 2, text: "Sine E4",~
    -- Inside source: true
    +*** Input Basics - Mouse Point To Rect - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -                row: 3.5, col: 2, text: "Sine E4",
    -** Processing line: ~                note: :e, octave: 4, type: :sine, method_to_call: :play_note),~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb~
     - Inside source: true
     *** True Line Result
    -                note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.5, col: 2, text: "Sine F4",~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 4.5, col: 2, text: "Sine F4",
    -** Processing line: ~                note: :f, octave: 4, type: :sine, method_to_call: :play_note),~
    +
    +** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
     - Inside source: true
     *** True Line Result
    -                note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  APIs that haven't been encountered in a previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.5, col: 2, text: "Sine G4",~
    +
    +** Processing line: ~  - args.outputus.borders: An array. Values in this array will be rendered as~
     - Inside source: true
     *** True Line Result
    -                row: 5.5, col: 2, text: "Sine G4",
    -** Processing line: ~                note: :g, octave: 4, type: :sine, method_to_call: :play_note),~
    +  - args.outputus.borders: An array. Values in this array will be rendered as
    +** Processing line: ~    unfilled rectangles on the screen.~
     - Inside source: true
     *** True Line Result
    -                note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    unfilled rectangles on the screen.
    +** Processing line: ~  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.5, col: 2, text: "Sine A5",~
    +  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +** Processing line: ~    with at least four values is considered a rect. The inside_rect? function returns true~
     - Inside source: true
     *** True Line Result
    -                row: 6.5, col: 2, text: "Sine A5",
    -** Processing line: ~                note: :a, octave: 5, type: :sine, method_to_call: :play_note),~
    +    with at least four values is considered a rect. The inside_rect? function returns true
    +** Processing line: ~    or false depending on if the point is inside the rect.~
     - Inside source: true
     *** True Line Result
    -                note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    or false depending on if the point is inside the rect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 7.5, col: 2, text: "Sine B5",~
    +
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -                row: 7.5, col: 2, text: "Sine B5",
    -** Processing line: ~                note: :b, octave: 5, type: :sine, method_to_call: :play_note),~
    +    ```
    +** Processing line: ~    # Point:  x: 100, y: 100~
     - Inside source: true
     *** True Line Result
    -                note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    # Point:  x: 100, y: 100
    +** Processing line: ~    # Rect:   x: 0, y: 0, w: 500, h: 500~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 8.5, col: 2, text: "Sine C5",~
    +    # Rect:   x: 0, y: 0, w: 500, h: 500
    +** Processing line: ~    # Result: true~
     - Inside source: true
     *** True Line Result
    -                row: 8.5, col: 2, text: "Sine C5",
    -** Processing line: ~                note: :c, octave: 5, type: :sine, method_to_call: :play_note),~
    +    # Result: true
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    -** Processing line: ~      ]~
    +
    +** Processing line: ~    [100, 100].inside_rect? [0, 0, 500, 500]~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +    [100, 100].inside_rect? [0, 0, 500, 500]
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -    end
    +    ```
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def square_wave_note_buttons args~
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -    def square_wave_note_buttons args
    -** Processing line: ~      [~
    +    ```
    +** Processing line: ~    # Point:  x: 100, y: 100~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    # Point:  x: 100, y: 100
    +** Processing line: ~    # Rect:   x: 300, y: 300, w: 100, h: 100~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 1.5, col: 6, text: "Square C4",~
    +    # Rect:   x: 300, y: 300, w: 100, h: 100
    +** Processing line: ~    # Result: false~
     - Inside source: true
     *** True Line Result
    -                row: 1.5, col: 6, text: "Square C4",
    -** Processing line: ~                note: :c, octave: 4, type: :square, method_to_call: :play_note),~
    +    # Result: false
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 4, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~    [100, 100].inside_rect? [300, 300, 100, 100]~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 2.5, col: 6, text: "Square D4",~
    +    [100, 100].inside_rect? [300, 300, 100, 100]
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -                row: 2.5, col: 6, text: "Square D4",
    -** Processing line: ~                note: :d, octave: 4, type: :square, method_to_call: :play_note),~
    +    ```
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :d, octave: 4, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 3.5, col: 6, text: "Square E4",~
    +  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +** Processing line: ~  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed~
     - Inside source: true
     *** True Line Result
    -                row: 3.5, col: 6, text: "Square E4",
    -** Processing line: ~                note: :e, octave: 4, type: :square, method_to_call: :play_note),~
    +  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    +** Processing line: ~    since the click event.~
     - Inside source: true
     *** True Line Result
    -                note: :e, octave: 4, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    since the click event.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.5, col: 6, text: "Square F4",~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -                row: 4.5, col: 6, text: "Square F4",
    -** Processing line: ~                note: :f, octave: 4, type: :square, method_to_call: :play_note),~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :f, octave: 4, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~  # To determine whether a point is in a rect~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.5, col: 6, text: "Square G4",~
    +  # To determine whether a point is in a rect
    +** Processing line: ~  # Use point.inside_rect? rect~
     - Inside source: true
     *** True Line Result
    -                row: 5.5, col: 6, text: "Square G4",
    -** Processing line: ~                note: :g, octave: 4, type: :square, method_to_call: :play_note),~
    +  # Use point.inside_rect? rect
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :g, octave: 4, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~  # This is useful to determine if a click occurred in a rect~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.5, col: 6, text: "Square A5",~
    +  # This is useful to determine if a click occurred in a rect
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 6.5, col: 6, text: "Square A5",
    -** Processing line: ~                note: :a, octave: 5, type: :square, method_to_call: :play_note),~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -                note: :a, octave: 5, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 7.5, col: 6, text: "Square B5",~
    +    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 7.5, col: 6, text: "Square B5",
    -** Processing line: ~                note: :b, octave: 5, type: :square, method_to_call: :play_note),~
    +
    +** Processing line: ~    x = 460~
     - Inside source: true
     *** True Line Result
    -                note: :b, octave: 5, type: :square, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    x = 460
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 8.5, col: 6, text: "Square C5",~
    +
    +** Processing line: ~    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")~
     - Inside source: true
     *** True Line Result
    -                row: 8.5, col: 6, text: "Square C5",
    -** Processing line: ~                note: :c, octave: 5, type: :square, method_to_call: :play_note),~
    +    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 5, type: :square, method_to_call: :play_note),
    -** Processing line: ~      ]~
    +
    +** Processing line: ~    box = { x: 785, y: 370, w: 50, h: 50, r: 0, g: 0, b: 170 }~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +    box = { x: 785, y: 370, w: 50, h: 50, r: 0, g: 0, b: 170 }
    +** Processing line: ~    args.outputs.borders << box~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    def saw_tooth_wave_note_buttons args~
    +    args.outputs.borders << box
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def saw_tooth_wave_note_buttons args
    -** Processing line: ~      [~
    +
    +** Processing line: ~    # Saves the most recent click into args.state~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    # Saves the most recent click into args.state
    +** Processing line: ~    # Unlike the other components of args,~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 1.5, col: 8, text: "Saw C4",~
    +    # Unlike the other components of args,
    +** Processing line: ~    # args.state does not reset every tick.~
     - Inside source: true
     *** True Line Result
    -                row: 1.5, col: 8, text: "Saw C4",
    -** Processing line: ~                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
    -- Inside source: true
    -*** True Line Result
    -                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    -- Inside source: true
    -*** True Line Result
    -        (button args,
    -** Processing line: ~                row: 2.5, col: 8, text: "Saw D4",~
    +    # args.state does not reset every tick.
    +** Processing line: ~    if args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -                row: 2.5, col: 8, text: "Saw D4",
    -** Processing line: ~                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
    +    if args.inputs.mouse.click
    +** Processing line: ~      args.state.last_mouse_click = args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +      args.state.last_mouse_click = args.inputs.mouse.click
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 3.5, col: 8, text: "Saw E4",~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 3.5, col: 8, text: "Saw E4",
    -** Processing line: ~                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
    +
    +** Processing line: ~    if args.state.last_mouse_click~
     - Inside source: true
     *** True Line Result
    -                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    if args.state.last_mouse_click
    +** Processing line: ~      if args.state.last_mouse_click.point.inside_rect? box~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.5, col: 8, text: "Saw F4",~
    +      if args.state.last_mouse_click.point.inside_rect? box
    +** Processing line: ~        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")~
     - Inside source: true
     *** True Line Result
    -                row: 4.5, col: 8, text: "Saw F4",
    -** Processing line: ~                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
    +        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +      else
    +** Processing line: ~        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.5, col: 8, text: "Saw G4",~
    +        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                row: 5.5, col: 8, text: "Saw G4",
    -** Processing line: ~                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
    +      end
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    else
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.5, col: 8, text: "Saw A5",~
    +      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                row: 6.5, col: 8, text: "Saw A5",
    -** Processing line: ~                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 7.5, col: 8, text: "Saw B5",~
    +
    +** Processing line: ~  def small_label args, x, row, message~
     - Inside source: true
     *** True Line Result
    -                row: 7.5, col: 8, text: "Saw B5",
    -** Processing line: ~                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
    +  def small_label args, x, row, message
    +** Processing line: ~    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 8.5, col: 8, text: "Saw C5",~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 8.5, col: 8, text: "Saw C5",
    -** Processing line: ~                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
    +
    +** Processing line: ~  def row_to_px args, row_number~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    -** Processing line: ~      ]~
    +  def row_to_px args, row_number
    +** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def triangle_wave_note_buttons args~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    def triangle_wave_note_buttons args
    -** Processing line: ~      [~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 1.5, col: 10, text: "Triangle C4",~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -                row: 1.5, col: 10, text: "Triangle C4",
    -** Processing line: ~                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 2.5, col: 10, text: "Triangle D4",~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -                row: 2.5, col: 10, text: "Triangle D4",
    -** Processing line: ~                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 3.5, col: 10, text: "Triangle E4",~
    +
    +** Processing line: ~    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!~
     - Inside source: true
     *** True Line Result
    -                row: 3.5, col: 10, text: "Triangle E4",
    -** Processing line: ~                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),~
    +    args.outputs.debug << { x: 0,   y: y - 50, w: 1280, h: 60 }.solid!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.5, col: 10, text: "Triangle F4",~
    +    args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                row: 4.5, col: 10, text: "Triangle F4",
    -** Processing line: ~                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.5, col: 10, text: "Triangle G4",~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -                row: 5.5, col: 10, text: "Triangle G4",
    -** Processing line: ~                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),~
    -- Inside source: true
    +
    +** Processing line: ~*** Input Basics - Mouse Rect To Rect - main.rb~
    +- Header detected.
     *** True Line Result
    -                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    -- Inside source: true
    +
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.5, col: 10, text: "Triangle A5",~
    +*** Input Basics - Mouse Rect To Rect - 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/02_input_basics/04_mouse_rect_to_rect/app/main.rb~
     - Inside source: true
     *** True Line Result
    -                row: 6.5, col: 10, text: "Triangle A5",
    -** Processing line: ~                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),~
    +  # ./samples/02_input_basics/04_mouse_rect_to_rect/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 7.5, col: 10, text: "Triangle B5",~
    +
    +** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
     - Inside source: true
     *** True Line Result
    -                row: 7.5, col: 10, text: "Triangle B5",
    -** Processing line: ~                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),~
    +  APIs that haven't been encountered in a previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~  - args.outputs.borders: An array. Values in this array will be rendered as~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 8.5, col: 10, text: "Triangle C5",~
    +  - args.outputs.borders: An array. Values in this array will be rendered as
    +** Processing line: ~    unfilled rectangles on the screen.~
     - Inside source: true
     *** True Line Result
    -                row: 8.5, col: 10, text: "Triangle C5",
    -** Processing line: ~                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),~
    +    unfilled rectangles on the screen.
    +** Processing line: ~  - ARRAY#intersect_rect?: An array with at least four values is~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    -** Processing line: ~      ]~
    +  - ARRAY#intersect_rect?: An array with at least four values is
    +** Processing line: ~    considered a rect. The intersect_rect? function returns true~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +    considered a rect. The intersect_rect? function returns true
    +** Processing line: ~    or false depending on if the two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -    end
    +    or false depending on if the two rectangles intersect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def bell_buttons args~
    -- Inside source: true
    -*** True Line Result
    -    def bell_buttons args
    -** Processing line: ~      [~
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        (button args,~
    +    ```
    +** Processing line: ~    # Rect One: x: 100, y: 100, w: 100, h: 100~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 1.5, col: 4, text: "Bell C4",~
    +    # Rect One: x: 100, y: 100, w: 100, h: 100
    +** Processing line: ~    # Rect Two: x: 0, y: 0, w: 500, h: 500~
     - Inside source: true
     *** True Line Result
    -                row: 1.5, col: 4, text: "Bell C4",
    -** Processing line: ~                note: :c, octave: 4, type: :bell, method_to_call: :play_note),~
    +    # Rect Two: x: 0, y: 0, w: 500, h: 500
    +** Processing line: ~    # Result:   true~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    # Result:   true
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 2.5, col: 4, text: "Bell D4",~
    +
    +** Processing line: ~    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]~
     - Inside source: true
     *** True Line Result
    -                row: 2.5, col: 4, text: "Bell D4",
    -** Processing line: ~                note: :d, octave: 4, type: :bell, method_to_call: :play_note),~
    +    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -                note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    ```
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 3.5, col: 4, text: "Bell E4",~
    +
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -                row: 3.5, col: 4, text: "Bell E4",
    -** Processing line: ~                note: :e, octave: 4, type: :bell, method_to_call: :play_note),~
    +    ```
    +** Processing line: ~    # Rect One: x: 100, y: 100, w: 10, h: 10~
     - Inside source: true
     *** True Line Result
    -                note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +    # Rect One: x: 100, y: 100, w: 10, h: 10
    +** Processing line: ~    # Rect Two: x: 500, y: 500, w: 10, h: 10~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 4.5, col: 4, text: "Bell F4",~
    +    # Rect Two: x: 500, y: 500, w: 10, h: 10
    +** Processing line: ~    # Result:   false~
     - Inside source: true
     *** True Line Result
    -                row: 4.5, col: 4, text: "Bell F4",
    -** Processing line: ~                note: :f, octave: 4, type: :bell, method_to_call: :play_note),~
    +    # Result:   false
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 5.5, col: 4, text: "Bell G4",~
    +    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]
    +** Processing line: ~    ```~
     - Inside source: true
     *** True Line Result
    -                row: 5.5, col: 4, text: "Bell G4",
    -** Processing line: ~                note: :g, octave: 4, type: :bell, method_to_call: :play_note),~
    +    ```
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 6.5, col: 4, text: "Bell A5",~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 6.5, col: 4, text: "Bell A5",
    -** Processing line: ~                note: :a, octave: 5, type: :bell, method_to_call: :play_note),~
    +
    +** Processing line: ~  # Similarly, whether rects intersect can be found through~
     - Inside source: true
     *** True Line Result
    -                note: :a, octave: 5, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  # Similarly, whether rects intersect can be found through
    +** Processing line: ~  # rect1.intersect_rect? rect2~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 7.5, col: 4, text: "Bell B5",~
    +  # rect1.intersect_rect? rect2
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                row: 7.5, col: 4, text: "Bell B5",
    -** Processing line: ~                note: :b, octave: 5, type: :bell, method_to_call: :play_note),~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -                note: :b, octave: 5, type: :bell, method_to_call: :play_note),
    -** Processing line: ~        (button args,~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."~
     - Inside source: true
     *** True Line Result
    -        (button args,
    -** Processing line: ~                row: 8.5, col: 4, text: "Bell C5",~
    +    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."
    +** Processing line: ~    x = 460~
     - Inside source: true
     *** True Line Result
    -                row: 8.5, col: 4, text: "Bell C5",
    -** Processing line: ~                note: :c, octave: 5, type: :bell, method_to_call: :play_note),~
    +    x = 460
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                note: :c, octave: 5, type: :bell, method_to_call: :play_note),
    -** Processing line: ~      ]~
    +
    +** Processing line: ~    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")
    +** Processing line: ~    # red_box = [460, 250, 355, 90, 170, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +    # red_box = [460, 250, 355, 90, 170, 0, 0]
    +** Processing line: ~    # args.outputs.borders << red_box~
     - Inside source: true
     *** True Line Result
    -  end
    +    # args.outputs.borders << red_box
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin # region: wave generation~
    -- Inside source: true
    -*** True Line Result
    -  begin # region: wave generation
    -** Processing line: ~    begin # sine wave~
    +** Processing line: ~    # args.state.box_collision_one and args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -    begin # sine wave
    -** Processing line: ~      def defaults_sine_wave_for~
    +    # args.state.box_collision_one and args.state.box_collision_two
    +** Processing line: ~    # Are given values of a solid when they should be rendered~
     - Inside source: true
     *** True Line Result
    -      def defaults_sine_wave_for
    -** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
    +    # Are given values of a solid when they should be rendered
    +** Processing line: ~    # They are stored in game so that they do not get reset every tick~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, sample_rate: 48000 }
    -** Processing line: ~      end~
    +    # They are stored in game so that they do not get reset every tick
    +** Processing line: ~    if args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    if args.inputs.mouse.click
    +** Processing line: ~      if !args.state.box_collision_one~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def sine_wave_for opts = {}~
    +      if !args.state.box_collision_one
    +** Processing line: ~        args.state.box_collision_one = { x: args.inputs.mouse.click.point.x - 25,~
     - Inside source: true
     *** True Line Result
    -      def sine_wave_for opts = {}
    -** Processing line: ~        opts = defaults_sine_wave_for.merge opts~
    +        args.state.box_collision_one = { x: args.inputs.mouse.click.point.x - 25,
    +** Processing line: ~                                         y: args.inputs.mouse.click.point.y - 25,~
     - Inside source: true
     *** True Line Result
    -        opts = defaults_sine_wave_for.merge opts
    -** Processing line: ~        frequency   = opts[:frequency]~
    +                                         y: args.inputs.mouse.click.point.y - 25,
    +** Processing line: ~                                         w: 125, h: 125,~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = opts[:sample_rate]~
    +                                         w: 125, h: 125,
    +** Processing line: ~                                         r: 180, g: 0, b: 0, a: 180 }~
     - Inside source: true
     *** True Line Result
    -        sample_rate = opts[:sample_rate]
    -** Processing line: ~        period_size = (sample_rate.fdiv frequency).ceil~
    +                                         r: 180, g: 0, b: 0, a: 180 }
    +** Processing line: ~      elsif !args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -        period_size = (sample_rate.fdiv frequency).ceil
    -** Processing line: ~        period_size.map_with_index do |i|~
    +      elsif !args.state.box_collision_two
    +** Processing line: ~        args.state.box_collision_two = { x: args.inputs.mouse.click.point.x - 25,~
     - Inside source: true
     *** True Line Result
    -        period_size.map_with_index do |i|
    -** Processing line: ~          Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)~
    +        args.state.box_collision_two = { x: args.inputs.mouse.click.point.x - 25,
    +** Processing line: ~                                         y: args.inputs.mouse.click.point.y - 25,~
     - Inside source: true
     *** True Line Result
    -          Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)
    -** Processing line: ~        end.to_a~
    +                                         y: args.inputs.mouse.click.point.y - 25,
    +** Processing line: ~                                         w: 125, h: 125,~
     - Inside source: true
     *** True Line Result
    -        end.to_a
    -** Processing line: ~      end~
    +                                         w: 125, h: 125,
    +** Processing line: ~                                         r: 0, g: 0, b: 180, a: 180 }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                                         r: 0, g: 0, b: 180, a: 180 }
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def defaults_queue_sine_wave~
    +      else
    +** Processing line: ~        args.state.box_collision_one = nil~
     - Inside source: true
     *** True Line Result
    -      def defaults_queue_sine_wave
    -** Processing line: ~        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~
    +        args.state.box_collision_one = nil
    +** Processing line: ~        args.state.box_collision_two = nil~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +        args.state.box_collision_two = nil
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    -** Processing line: ~~
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def queue_sine_wave args, opts = {}~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      def queue_sine_wave args, opts = {}
    -** Processing line: ~        opts        = defaults_queue_sine_wave.merge opts~
    +
    +** Processing line: ~    if args.state.box_collision_one~
     - Inside source: true
     *** True Line Result
    -        opts        = defaults_queue_sine_wave.merge opts
    -** Processing line: ~        frequency   = opts[:frequency]~
    +    if args.state.box_collision_one
    +** Processing line: ~      args.outputs.solids << args.state.box_collision_one~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = 48000~
    +      args.outputs.solids << args.state.box_collision_one
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        sample_rate = 48000
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate~
    +** Processing line: ~    if args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -        sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate
    -** Processing line: ~        args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate~
    +    if args.state.box_collision_two
    +** Processing line: ~      args.outputs.solids << args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -        args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate
    +      args.outputs.solids << args.state.box_collision_two
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        proc = lambda do~
    +** Processing line: ~    if args.state.box_collision_one && args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -        proc = lambda do
    -** Processing line: ~          generate_audio_data args.state.sine_waves[frequency], sample_rate~
    +    if args.state.box_collision_one && args.state.box_collision_two
    +** Processing line: ~      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -          generate_audio_data args.state.sine_waves[frequency], sample_rate
    -** Processing line: ~        end~
    +      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two
    +** Processing line: ~        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~~
    +        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        audio_state = new_audio_state args, opts~
    +      else
    +** Processing line: ~        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')~
     - Inside source: true
     *** True Line Result
    -        audio_state = new_audio_state args, opts
    -** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
    +        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        audio_state[:input] = [1, sample_rate, proc]
    -** Processing line: ~        queue_audio args, audio_state: audio_state, wave: sine_wave~
    +      end
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -        queue_audio args, audio_state: audio_state, wave: sine_wave
    -** Processing line: ~      end~
    +    else
    +** Processing line: ~      args.outputs.labels << small_label(args, x, 4, '--')~
     - Inside source: true
     *** True Line Result
    -      end
    +      args.outputs.labels << small_label(args, x, 4, '--')
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~~
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    begin # region: square wave~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    begin # region: square wave
    -** Processing line: ~      def defaults_square_wave_for~
    +
    +** Processing line: ~  def small_label args, x, row, message~
     - Inside source: true
     *** True Line Result
    -      def defaults_square_wave_for
    -** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
    +  def small_label args, x, row, message
    +** Processing line: ~    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, sample_rate: 48000 }
    -** Processing line: ~      end~
    +    { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def square_wave_for opts = {}~
    -- Inside source: true
    -*** True Line Result
    -      def square_wave_for opts = {}
    -** Processing line: ~        opts = defaults_square_wave_for.merge opts~
    -- Inside source: true
    -*** True Line Result
    -        opts = defaults_square_wave_for.merge opts
    -** Processing line: ~        sine_wave = sine_wave_for opts~
    -- Inside source: true
    -*** True Line Result
    -        sine_wave = sine_wave_for opts
    -** Processing line: ~        sine_wave.map do |v|~
    +** Processing line: ~  def row_to_px args, row_number~
     - Inside source: true
     *** True Line Result
    -        sine_wave.map do |v|
    -** Processing line: ~          if v >= 0~
    +  def row_to_px args, row_number
    +** Processing line: ~    args.grid.top - 5 - (20 * row_number)~
     - Inside source: true
     *** True Line Result
    -          if v >= 0
    -** Processing line: ~            1.0~
    +    args.grid.top - 5 - (20 * row_number)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -            1.0
    -** Processing line: ~          else~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          else
    -** Processing line: ~            -1.0~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -            -1.0
    -** Processing line: ~          end~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end.to_a~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -        end.to_a
    -** Processing line: ~      end~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def defaults_queue_square_wave~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -      def defaults_queue_square_wave
    -** Processing line: ~        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -** Processing line: ~      end~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def queue_square_wave args, opts = {}~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -      def queue_square_wave args, opts = {}
    -** Processing line: ~        opts        = defaults_queue_square_wave.merge opts~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        opts        = defaults_queue_square_wave.merge opts
    -** Processing line: ~        frequency   = opts[:frequency]~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = 48000~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        sample_rate = 48000
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate~
    -- Inside source: true
    -*** True Line Result
    -        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    -** Processing line: ~        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~        proc = lambda do~
    -- Inside source: true
    -*** True Line Result
    -        proc = lambda do
    -** Processing line: ~          generate_audio_data args.state.square_waves[frequency], sample_rate~
    -- Inside source: true
    +** Processing line: ~*** Input Basics - Controller - main.rb~
    +- Header detected.
     *** True Line Result
    -          generate_audio_data args.state.square_waves[frequency], sample_rate
    -** Processing line: ~        end~
    -- Inside source: true
    +
     *** True Line Result
    -        end
    -** Processing line: ~~
    -- Inside source: true
    +*** Input Basics - Controller - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~        audio_state = new_audio_state args, opts~
    -- Inside source: true
     *** True Line Result
    -        audio_state = new_audio_state args, opts
    -** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/02_input_basics/05_controller/app/main.rb~
     - Inside source: true
     *** True Line Result
    -        audio_state[:input] = [1, sample_rate, proc]
    -** Processing line: ~        queue_audio args, audio_state: audio_state, wave: square_wave~
    +  # ./samples/02_input_basics/05_controller/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -        queue_audio args, audio_state: audio_state, wave: square_wave
    -** Processing line: ~      end~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -    end
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    begin # region: saw tooth wave~
    +** Processing line: ~   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key~
     - Inside source: true
     *** True Line Result
    -    begin # region: saw tooth wave
    -** Processing line: ~      def defaults_saw_tooth_wave_for~
    +   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key
    +** Processing line: ~     is being held down on the controller.~
     - Inside source: true
     *** True Line Result
    -      def defaults_saw_tooth_wave_for
    -** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
    +     is being held down on the controller.
    +** Processing line: ~     If there is more than one controller being used, they can be differentiated by~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, sample_rate: 48000 }
    -** Processing line: ~      end~
    +     If there is more than one controller being used, they can be differentiated by
    +** Processing line: ~     using names like controller_one and controller_two.~
     - Inside source: true
     *** True Line Result
    -      end
    +     using names like controller_one and controller_two.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def saw_tooth_wave_for opts = {}~
    +** Processing line: ~     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.~
     - Inside source: true
     *** True Line Result
    -      def saw_tooth_wave_for opts = {}
    -** Processing line: ~        opts = defaults_saw_tooth_wave_for.merge opts~
    +     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        opts = defaults_saw_tooth_wave_for.merge opts
    -** Processing line: ~        sine_wave = sine_wave_for opts~
    +
    +** Processing line: ~   Reminder:~
     - Inside source: true
     *** True Line Result
    -        sine_wave = sine_wave_for opts
    -** Processing line: ~        period_size = sine_wave.length~
    +   Reminder:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        period_size = sine_wave.length
    -** Processing line: ~        sine_wave.map_with_index do |v, i|~
    +
    +** Processing line: ~   - args.state.PROPERTY: The state property on args is a dynamic~
     - Inside source: true
     *** True Line Result
    -        sine_wave.map_with_index do |v, i|
    -** Processing line: ~          (((i % period_size).fdiv period_size) * 2) - 1~
    +   - args.state.PROPERTY: The state property on args is a dynamic
    +** Processing line: ~     structure. You can define ANY property here with ANY type of~
     - Inside source: true
     *** True Line Result
    -          (((i % period_size).fdiv period_size) * 2) - 1
    -** Processing line: ~        end~
    +     structure. You can define ANY property here with ANY type of
    +** Processing line: ~     arbitrary nesting. Properties defined on args.state will be retained~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +     arbitrary nesting. Properties defined on args.state will be retained
    +** Processing line: ~     across frames. If you attempt to access a property that doesn't exist~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +     across frames. If you attempt to access a property that doesn't exist
    +** Processing line: ~     on args.state, it will simply return nil (no exception will be thrown).~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def defaults_queue_saw_tooth_wave~
    +     on args.state, it will simply return nil (no exception will be thrown).
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      def defaults_queue_saw_tooth_wave
    -** Processing line: ~        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~
    +
    +** Processing line: ~     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    -** Processing line: ~      end~
    +     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.
    +** Processing line: ~     The parameters of a button are:~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +     The parameters of a button are:
    +** Processing line: ~     1. the position (x, y)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def queue_saw_tooth_wave args, opts = {}~
    +     1. the position (x, y)
    +** Processing line: ~     2. the input key held on the controller~
     - Inside source: true
     *** True Line Result
    -      def queue_saw_tooth_wave args, opts = {}
    -** Processing line: ~        opts        = defaults_queue_saw_tooth_wave.merge opts~
    +     2. the input key held on the controller
    +** Processing line: ~     3. the text or name of the button~
     - Inside source: true
     *** True Line Result
    -        opts        = defaults_queue_saw_tooth_wave.merge opts
    -** Processing line: ~        frequency   = opts[:frequency]~
    +     3. the text or name of the button
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = 48000~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -        sample_rate = 48000
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~
    +** Processing line: ~  # This sample app provides a visual demonstration of a standard controller, including~
     - Inside source: true
     *** True Line Result
    -        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    -** Processing line: ~        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~
    +  # This sample app provides a visual demonstration of a standard controller, including
    +** Processing line: ~  # the placement and function of all buttons.~
     - Inside source: true
     *** True Line Result
    -        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +  # the placement and function of all buttons.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        proc = lambda do~
    -- Inside source: true
    -*** True Line Result
    -        proc = lambda do
    -** Processing line: ~          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate~
    +** Processing line: ~  class ControllerDemo~
     - Inside source: true
     *** True Line Result
    -          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    -** Processing line: ~        end~
    +  class ControllerDemo
    +** Processing line: ~    attr_accessor :inputs, :state, :outputs~
     - Inside source: true
     *** True Line Result
    -        end
    +    attr_accessor :inputs, :state, :outputs
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        audio_state = new_audio_state args, opts~
    +** Processing line: ~    # Calls the methods necessary for the app to run successfully.~
     - Inside source: true
     *** True Line Result
    -        audio_state = new_audio_state args, opts
    -** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
    +    # Calls the methods necessary for the app to run successfully.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -        audio_state[:input] = [1, sample_rate, proc]
    -** Processing line: ~        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave~
    +    def tick
    +** Processing line: ~      process_inputs~
     - Inside source: true
     *** True Line Result
    -        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
    -** Processing line: ~      end~
    +      process_inputs
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -      end
    +      render
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -16136,186 +16615,182 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    begin # region: triangle wave~
    +** Processing line: ~    # Starts with an empty collection of buttons.~
     - Inside source: true
     *** True Line Result
    -    begin # region: triangle wave
    -** Processing line: ~      def defaults_triangle_wave_for~
    +    # Starts with an empty collection of buttons.
    +** Processing line: ~    # Adds buttons that are on the controller to the collection.~
     - Inside source: true
     *** True Line Result
    -      def defaults_triangle_wave_for
    -** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
    +    # Adds buttons that are on the controller to the collection.
    +** Processing line: ~    def process_inputs~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, sample_rate: 48000 }
    -** Processing line: ~      end~
    +    def process_inputs
    +** Processing line: ~      state.buttons = []~
     - Inside source: true
     *** True Line Result
    -      end
    +      state.buttons = []
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def triangle_wave_for opts = {}~
    +** Processing line: ~      state.buttons << { x: 100,  y: 500, active: inputs.controller_one.key_held.l1, text: "L1"}~
     - Inside source: true
     *** True Line Result
    -      def triangle_wave_for opts = {}
    -** Processing line: ~        opts = defaults_saw_tooth_wave_for.merge opts~
    +      state.buttons << { x: 100,  y: 500, active: inputs.controller_one.key_held.l1, text: "L1"}
    +** Processing line: ~      state.buttons << { x: 100,  y: 600, active: inputs.controller_one.key_held.l2, text: "L2"}~
     - Inside source: true
     *** True Line Result
    -        opts = defaults_saw_tooth_wave_for.merge opts
    -** Processing line: ~        sine_wave = sine_wave_for opts~
    +      state.buttons << { x: 100,  y: 600, active: inputs.controller_one.key_held.l2, text: "L2"}
    +** Processing line: ~      state.buttons << { x: 1100, y: 500, active: inputs.controller_one.key_held.r1, text: "R1"}~
     - Inside source: true
     *** True Line Result
    -        sine_wave = sine_wave_for opts
    -** Processing line: ~        period_size = sine_wave.length~
    +      state.buttons << { x: 1100, y: 500, active: inputs.controller_one.key_held.r1, text: "R1"}
    +** Processing line: ~      state.buttons << { x: 1100, y: 600, active: inputs.controller_one.key_held.r2, text: "R2"}~
     - Inside source: true
     *** True Line Result
    -        period_size = sine_wave.length
    -** Processing line: ~        sine_wave.map_with_index do |v, i|~
    +      state.buttons << { x: 1100, y: 600, active: inputs.controller_one.key_held.r2, text: "R2"}
    +** Processing line: ~      state.buttons << { x: 540,  y: 450, active: inputs.controller_one.key_held.select, text: "Select"}~
     - Inside source: true
     *** True Line Result
    -        sine_wave.map_with_index do |v, i|
    -** Processing line: ~          ratio = (i.fdiv period_size)~
    +      state.buttons << { x: 540,  y: 450, active: inputs.controller_one.key_held.select, text: "Select"}
    +** Processing line: ~      state.buttons << { x: 660,  y: 450, active: inputs.controller_one.key_held.start, text: "Start"}~
     - Inside source: true
     *** True Line Result
    -          ratio = (i.fdiv period_size)
    -** Processing line: ~          if ratio <= 0.5~
    +      state.buttons << { x: 660,  y: 450, active: inputs.controller_one.key_held.start, text: "Start"}
    +** Processing line: ~      state.buttons << { x: 200,  y: 300, active: inputs.controller_one.key_held.left, text: "Left"}~
     - Inside source: true
     *** True Line Result
    -          if ratio <= 0.5
    -** Processing line: ~            (ratio * 4) - 1~
    +      state.buttons << { x: 200,  y: 300, active: inputs.controller_one.key_held.left, text: "Left"}
    +** Processing line: ~      state.buttons << { x: 300,  y: 400, active: inputs.controller_one.key_held.up, text: "Up"}~
     - Inside source: true
     *** True Line Result
    -            (ratio * 4) - 1
    -** Processing line: ~          else~
    +      state.buttons << { x: 300,  y: 400, active: inputs.controller_one.key_held.up, text: "Up"}
    +** Processing line: ~      state.buttons << { x: 400,  y: 300, active: inputs.controller_one.key_held.right, text: "Right"}~
     - Inside source: true
     *** True Line Result
    -          else
    -** Processing line: ~            ratio -= 0.5~
    +      state.buttons << { x: 400,  y: 300, active: inputs.controller_one.key_held.right, text: "Right"}
    +** Processing line: ~      state.buttons << { x: 300,  y: 200, active: inputs.controller_one.key_held.down, text: "Down"}~
     - Inside source: true
     *** True Line Result
    -            ratio -= 0.5
    -** Processing line: ~            1 - (ratio * 4)~
    +      state.buttons << { x: 300,  y: 200, active: inputs.controller_one.key_held.down, text: "Down"}
    +** Processing line: ~      state.buttons << { x: 800,  y: 300, active: inputs.controller_one.key_held.x, text: "X"}~
     - Inside source: true
     *** True Line Result
    -            1 - (ratio * 4)
    -** Processing line: ~          end~
    +      state.buttons << { x: 800,  y: 300, active: inputs.controller_one.key_held.x, text: "X"}
    +** Processing line: ~      state.buttons << { x: 900,  y: 400, active: inputs.controller_one.key_held.y, text: "Y"}~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +      state.buttons << { x: 900,  y: 400, active: inputs.controller_one.key_held.y, text: "Y"}
    +** Processing line: ~      state.buttons << { x: 1000, y: 300, active: inputs.controller_one.key_held.a, text: "A"}~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      state.buttons << { x: 1000, y: 300, active: inputs.controller_one.key_held.a, text: "A"}
    +** Processing line: ~      state.buttons << { x: 900,  y: 200, active: inputs.controller_one.key_held.b, text: "B"}~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      state.buttons << { x: 900,  y: 200, active: inputs.controller_one.key_held.b, text: "B"}
    +** Processing line: ~      state.buttons << { x: 450 + inputs.controller_one.left_analog_x_perc * 100,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def defaults_queue_triangle_wave~
    +      state.buttons << { x: 450 + inputs.controller_one.left_analog_x_perc * 100,
    +** Processing line: ~                         y: 100 + inputs.controller_one.left_analog_y_perc * 100,~
     - Inside source: true
     *** True Line Result
    -      def defaults_queue_triangle_wave
    -** Processing line: ~        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~
    +                         y: 100 + inputs.controller_one.left_analog_y_perc * 100,
    +** Processing line: ~                         active: inputs.controller_one.key_held.l3,~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -** Processing line: ~      end~
    +                         active: inputs.controller_one.key_held.l3,
    +** Processing line: ~                         text: "L3" }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                         text: "L3" }
    +** Processing line: ~      state.buttons << { x: 750 + inputs.controller_one.right_analog_x_perc * 100,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def queue_triangle_wave args, opts = {}~
    +      state.buttons << { x: 750 + inputs.controller_one.right_analog_x_perc * 100,
    +** Processing line: ~                         y: 100 + inputs.controller_one.right_analog_y_perc * 100,~
     - Inside source: true
     *** True Line Result
    -      def queue_triangle_wave args, opts = {}
    -** Processing line: ~        opts        = defaults_queue_triangle_wave.merge opts~
    +                         y: 100 + inputs.controller_one.right_analog_y_perc * 100,
    +** Processing line: ~                         active: inputs.controller_one.key_held.r3,~
     - Inside source: true
     *** True Line Result
    -        opts        = defaults_queue_triangle_wave.merge opts
    -** Processing line: ~        frequency   = opts[:frequency]~
    +                         active: inputs.controller_one.key_held.r3,
    +** Processing line: ~                         text: "R3" }~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = 48000~
    +                         text: "R3" }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        sample_rate = 48000
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate~
    +** Processing line: ~    # Gives each button a square shape.~
     - Inside source: true
     *** True Line Result
    -        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    -** Processing line: ~        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate~
    +    # Gives each button a square shape.
    +** Processing line: ~    # If the button is being pressed or held (which means it is considered active),~
     - Inside source: true
     *** True Line Result
    -        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
    -** Processing line: ~~
    +    # If the button is being pressed or held (which means it is considered active),
    +** Processing line: ~    # the square is filled in. Otherwise, the button simply has a border.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        proc = lambda do~
    +    # the square is filled in. Otherwise, the button simply has a border.
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -        proc = lambda do
    -** Processing line: ~          generate_audio_data args.state.triangle_waves[frequency], sample_rate~
    +    def render
    +** Processing line: ~      state.buttons.each do |b|~
     - Inside source: true
     *** True Line Result
    -          generate_audio_data args.state.triangle_waves[frequency], sample_rate
    -** Processing line: ~        end~
    +      state.buttons.each do |b|
    +** Processing line: ~        rect = { x: b.x, y: b.y, w: 75, h: 75 }~
     - Inside source: true
     *** True Line Result
    -        end
    +        rect = { x: b.x, y: b.y, w: 75, h: 75 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        audio_state = new_audio_state args, opts~
    +** Processing line: ~        if b.active # if button is pressed~
     - Inside source: true
     *** True Line Result
    -        audio_state = new_audio_state args, opts
    -** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
    +        if b.active # if button is pressed
    +** Processing line: ~          outputs.solids << rect # rect is output as solid (filled in)~
     - Inside source: true
     *** True Line Result
    -        audio_state[:input] = [1, sample_rate, proc]
    -** Processing line: ~        queue_audio args, audio_state: audio_state, wave: triangle_wave~
    +          outputs.solids << rect # rect is output as solid (filled in)
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -        queue_audio args, audio_state: audio_state, wave: triangle_wave
    -** Processing line: ~      end~
    +        else
    +** Processing line: ~          outputs.borders << rect # otherwise, output as border~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +          outputs.borders << rect # otherwise, output as border
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    end
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    begin # region: bell~
    -- Inside source: true
    -*** True Line Result
    -    begin # region: bell
    -** Processing line: ~      def defaults_queue_bell~
    +** Processing line: ~        # Outputs the text of each button using labels.~
     - Inside source: true
     *** True Line Result
    -      def defaults_queue_bell
    -** Processing line: ~        { frequency: 440, duration: 1.seconds, queue_in: 0 }~
    +        # Outputs the text of each button using labels.
    +** Processing line: ~        outputs.labels << { x: b.x, y: b.y + 95, text: b.text } # add 95 to place label above button~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    +        outputs.labels << { x: b.x, y: b.y + 95, text: b.text } # add 95 to place label above button
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -16324,134 +16799,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def queue_bell args, opts = {}~
    -- Inside source: true
    -*** True Line Result
    -      def queue_bell args, opts = {}
    -** Processing line: ~        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }~
    -- Inside source: true
    -*** True Line Result
    -        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
    -** Processing line: ~      end~
    -- Inside source: true
    -*** True Line Result
    -      end
    -** Processing line: ~~
    +** Processing line: ~      outputs.labels << { x:  10, y: 60, text: "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)" }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def bell_harmonics~
    +      outputs.labels << { x:  10, y: 60, text: "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)" }
    +** Processing line: ~      outputs.labels << { x:  10, y: 30, text: "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)" }~
     - Inside source: true
     *** True Line Result
    -      def bell_harmonics
    -** Processing line: ~        [~
    +      outputs.labels << { x:  10, y: 30, text: "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)" }
    +** Processing line: ~      outputs.labels << { x: 900, y: 60, text: "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)" }~
     - Inside source: true
     *** True Line Result
    -        [
    -** Processing line: ~          { frequency_ratio: 0.5, duration_ratio: 1.00 },~
    +      outputs.labels << { x: 900, y: 60, text: "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)" }
    +** Processing line: ~      outputs.labels << { x: 900, y: 30, text: "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)" }~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 0.5, duration_ratio: 1.00 },
    -** Processing line: ~          { frequency_ratio: 1.0, duration_ratio: 0.80 },~
    +      outputs.labels << { x: 900, y: 30, text: "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)" }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 1.0, duration_ratio: 0.80 },
    -** Processing line: ~          { frequency_ratio: 2.0, duration_ratio: 0.60 },~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 2.0, duration_ratio: 0.60 },
    -** Processing line: ~          { frequency_ratio: 3.0, duration_ratio: 0.40 },~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 3.0, duration_ratio: 0.40 },
    -** Processing line: ~          { frequency_ratio: 4.2, duration_ratio: 0.25 },~
    +
    +** Processing line: ~  $controller_demo = ControllerDemo.new~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 4.2, duration_ratio: 0.25 },
    -** Processing line: ~          { frequency_ratio: 5.4, duration_ratio: 0.20 },~
    +  $controller_demo = ControllerDemo.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 5.4, duration_ratio: 0.20 },
    -** Processing line: ~          { frequency_ratio: 6.8, duration_ratio: 0.15 }~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -          { frequency_ratio: 6.8, duration_ratio: 0.15 }
    -** Processing line: ~        ]~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~      end~
    +    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."
    +** Processing line: ~    $controller_demo.inputs = args.inputs~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    $controller_demo.inputs = args.inputs
    +** Processing line: ~    $controller_demo.state = args.state~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def defaults_bell_to_sine_waves~
    +    $controller_demo.state = args.state
    +** Processing line: ~    $controller_demo.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -      def defaults_bell_to_sine_waves
    -** Processing line: ~        { frequency: 440, duration: 1.seconds, queue_in: 0 }~
    +    $controller_demo.outputs = args.outputs
    +** Processing line: ~    $controller_demo.tick~
     - Inside source: true
     *** True Line Result
    -        { frequency: 440, duration: 1.seconds, queue_in: 0 }
    -** Processing line: ~      end~
    +    $controller_demo.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def bell_to_sine_waves opts = {}~
    +** Processing line: ~  # Resets the app.~
     - Inside source: true
     *** True Line Result
    -      def bell_to_sine_waves opts = {}
    -** Processing line: ~        opts = defaults_bell_to_sine_waves.merge opts~
    +  # Resets the app.
    +** Processing line: ~  def r~
     - Inside source: true
     *** True Line Result
    -        opts = defaults_bell_to_sine_waves.merge opts
    -** Processing line: ~        bell_harmonics.map do |b|~
    +  def r
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -        bell_harmonics.map do |b|
    -** Processing line: ~          {~
    +    $gtk.reset
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          {
    -** Processing line: ~            frequency: opts[:frequency] * b[:frequency_ratio],~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            frequency: opts[:frequency] * b[:frequency_ratio],
    -** Processing line: ~            duration:  opts[:duration] * b[:duration_ratio],~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -            duration:  opts[:duration] * b[:duration_ratio],
    -** Processing line: ~            queue_in:  opts[:queue_in],~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -            queue_in:  opts[:queue_in],
    -** Processing line: ~            gain:      (1.fdiv bell_harmonics.length),~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -            gain:      (1.fdiv bell_harmonics.length),
    -** Processing line: ~            fade_out:  true~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -            fade_out:  true
    -** Processing line: ~          }~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -          }
    -** Processing line: ~        end~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -      end
    +      args.state.key_event_occurred = true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -16460,758 +16923,722 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    begin # audio entity construction~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    begin # audio entity construction
    -** Processing line: ~      def generate_audio_data sine_wave, sample_rate~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      def generate_audio_data sine_wave, sample_rate
    -** Processing line: ~        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    -** Processing line: ~        copy_count  = (sample_size.fdiv sine_wave.length).ceil~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        copy_count  = (sample_size.fdiv sine_wave.length).ceil
    -** Processing line: ~        sine_wave * copy_count~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        sine_wave * copy_count
    -** Processing line: ~      end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~      def defaults_new_audio_state~
    -- Inside source: true
    -*** True Line Result
    -      def defaults_new_audio_state
    -** Processing line: ~        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~
    -- Inside source: true
    +** Processing line: ~*** Input Basics - Touch - main.rb~
    +- Header detected.
     *** True Line Result
    -        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    -** Processing line: ~      end~
    -- Inside source: true
    +
     *** True Line Result
    -      end
    -** Processing line: ~~
    -- Inside source: true
    +*** Input Basics - Touch - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~      def new_audio_state args, opts = {}~
    -- Inside source: true
    -*** True Line Result
    -      def new_audio_state args, opts = {}
    -** Processing line: ~        opts        = defaults_new_audio_state.merge opts~
    -- Inside source: true
     *** True Line Result
    -        opts        = defaults_new_audio_state.merge opts
    -** Processing line: ~        decay_rate  = 0~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/02_input_basics/06_touch/app/main.rb~
     - Inside source: true
     *** True Line Result
    -        decay_rate  = 0
    -** Processing line: ~        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]~
    +  # ./samples/02_input_basics/06_touch/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    -** Processing line: ~        frequency   = opts[:frequency]~
    +  def tick args
    +** Processing line: ~    args.outputs.background_color = [ 0, 0, 0 ]~
     - Inside source: true
     *** True Line Result
    -        frequency   = opts[:frequency]
    -** Processing line: ~        sample_rate = 48000~
    +    args.outputs.background_color = [ 0, 0, 0 ]
    +** Processing line: ~    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        sample_rate = 48000
    +    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        {~
    +** Processing line: ~    # If you don't want to get fancy, you can just look for finger_one~
     - Inside source: true
     *** True Line Result
    -        {
    -** Processing line: ~          id:               (new_id! args),~
    +    # If you don't want to get fancy, you can just look for finger_one
    +** Processing line: ~    #  (and _two, if you like), which are assigned in the order new touches hit~
     - Inside source: true
     *** True Line Result
    -          id:               (new_id! args),
    -** Processing line: ~          frequency:        frequency,~
    +    #  (and _two, if you like), which are assigned in the order new touches hit
    +** Processing line: ~    #  the screen. If not nil, they are touching right now, and are just~
     - Inside source: true
     *** True Line Result
    -          frequency:        frequency,
    -** Processing line: ~          sample_rate:      48000,~
    +    #  the screen. If not nil, they are touching right now, and are just
    +** Processing line: ~    #  references to specific items in the args.input.touch hash.~
     - Inside source: true
     *** True Line Result
    -          sample_rate:      48000,
    -** Processing line: ~          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],~
    -- Inside source: true
    -*** True Line Result
    -          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    -** Processing line: ~          gain:             opts[:gain].to_f,~
    -- Inside source: true
    -*** True Line Result
    -          gain:             opts[:gain].to_f,
    -** Processing line: ~          queue_at:         args.state.tick_count + opts[:queue_in],~
    -- Inside source: true
    -*** True Line Result
    -          queue_at:         args.state.tick_count + opts[:queue_in],
    -** Processing line: ~          decay_rate:       decay_rate,~
    -- Inside source: true
    -*** True Line Result
    -          decay_rate:       decay_rate,
    -** Processing line: ~          pitch:            1.0,~
    -- Inside source: true
    -*** True Line Result
    -          pitch:            1.0,
    -** Processing line: ~          looping:          true,~
    -- Inside source: true
    -*** True Line Result
    -          looping:          true,
    -** Processing line: ~          paused:           false~
    -- Inside source: true
    -*** True Line Result
    -          paused:           false
    -** Processing line: ~        }~
    +    #  references to specific items in the args.input.touch hash.
    +** Processing line: ~    # If finger_one lifts off, it will become nil, but finger_two, if it was~
     - Inside source: true
     *** True Line Result
    -        }
    -** Processing line: ~      end~
    +    # If finger_one lifts off, it will become nil, but finger_two, if it was
    +** Processing line: ~    #  touching, remains until it also lifts off. When all fingers lift off, the~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    #  touching, remains until it also lifts off. When all fingers lift off, the
    +** Processing line: ~    #  the next new touch will be finger_one again, but until then, new touches~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def queue_audio args, opts = {}~
    +    #  the next new touch will be finger_one again, but until then, new touches
    +** Processing line: ~    #  don't fill in earlier slots.~
     - Inside source: true
     *** True Line Result
    -      def queue_audio args, opts = {}
    -** Processing line: ~        graph_wave args, opts[:wave], opts[:audio_state][:frequency]~
    +    #  don't fill in earlier slots.
    +** Processing line: ~    if !args.inputs.finger_one.nil?~
     - Inside source: true
     *** True Line Result
    -        graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    -** Processing line: ~        args.state.audio_queue << opts[:audio_state]~
    +    if !args.inputs.finger_one.nil?
    +** Processing line: ~      args.outputs.primitives << { x: 640, y: 650, text: "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).",~
     - Inside source: true
     *** True Line Result
    -        args.state.audio_queue << opts[:audio_state]
    -** Processing line: ~      end~
    +      args.outputs.primitives << { x: 640, y: 650, text: "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).",
    +** Processing line: ~                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def new_id! args~
    +    end
    +** Processing line: ~    if !args.inputs.finger_two.nil?~
     - Inside source: true
     *** True Line Result
    -      def new_id! args
    -** Processing line: ~        args.state.audio_id ||= 0~
    +    if !args.inputs.finger_two.nil?
    +** Processing line: ~      args.outputs.primitives << { x: 640, y: 600, text: "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).",~
     - Inside source: true
     *** True Line Result
    -        args.state.audio_id ||= 0
    -** Processing line: ~        args.state.audio_id  += 1~
    +      args.outputs.primitives << { x: 640, y: 600, text: "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).",
    +** Processing line: ~                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~
     - Inside source: true
     *** True Line Result
    -        args.state.audio_id  += 1
    -** Processing line: ~      end~
    +                                   size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def graph_wave args, wave, frequency~
    +** Processing line: ~    # Here's the more flexible interface: this will report as many simultaneous~
     - Inside source: true
     *** True Line Result
    -      def graph_wave args, wave, frequency
    -** Processing line: ~        if args.state.tick_count != args.state.graphed_at~
    +    # Here's the more flexible interface: this will report as many simultaneous
    +** Processing line: ~    #  touches as the system can handle, but it's a little more effort to track~
     - Inside source: true
     *** True Line Result
    -        if args.state.tick_count != args.state.graphed_at
    -** Processing line: ~          args.outputs.static_lines.clear~
    +    #  touches as the system can handle, but it's a little more effort to track
    +** Processing line: ~    #  them. Each item in the args.input.touch hash has a unique key (an~
     - Inside source: true
     *** True Line Result
    -          args.outputs.static_lines.clear
    -** Processing line: ~          args.outputs.static_sprites.clear~
    +    #  them. Each item in the args.input.touch hash has a unique key (an
    +** Processing line: ~    #  incrementing integer) that exists until the finger lifts off. You can~
     - Inside source: true
     *** True Line Result
    -          args.outputs.static_sprites.clear
    -** Processing line: ~        end~
    +    #  incrementing integer) that exists until the finger lifts off. You can
    +** Processing line: ~    #  tell which order the touches happened globally by the key value, or~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~~
    +    #  tell which order the touches happened globally by the key value, or
    +** Processing line: ~    #  by the touch[id].touch_order field, which resets to zero each time all~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        wave = wave~
    +    #  by the touch[id].touch_order field, which resets to zero each time all
    +** Processing line: ~    #  touches have lifted.~
     - Inside source: true
     *** True Line Result
    -        wave = wave
    +    #  touches have lifted.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        r, g, b = frequency.to_i % 85,~
    +** Processing line: ~    args.state.colors ||= [~
     - Inside source: true
     *** True Line Result
    -        r, g, b = frequency.to_i % 85,
    -** Processing line: ~                  frequency.to_i % 170,~
    +    args.state.colors ||= [
    +** Processing line: ~      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF~
     - Inside source: true
     *** True Line Result
    -                  frequency.to_i % 170,
    -** Processing line: ~                  frequency.to_i % 255~
    +      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -                  frequency.to_i % 255
    +    ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        starting_rect = args.layout.rect(row: 5, col: 13)~
    +** Processing line: ~    size = 100~
     - Inside source: true
     *** True Line Result
    -        starting_rect = args.layout.rect(row: 5, col: 13)
    -** Processing line: ~        x_scale    = 10~
    +    size = 100
    +** Processing line: ~    args.inputs.touch.each { |k,v|~
     - Inside source: true
     *** True Line Result
    -        x_scale    = 10
    -** Processing line: ~        y_scale    = 100~
    +    args.inputs.touch.each { |k,v|
    +** Processing line: ~      color = args.state.colors[v.touch_order % 7]~
     - Inside source: true
     *** True Line Result
    -        y_scale    = 100
    -** Processing line: ~        max_points = 25~
    +      color = args.state.colors[v.touch_order % 7]
    +** Processing line: ~      r = (color & 0xFF0000) >> 16~
     - Inside source: true
     *** True Line Result
    -        max_points = 25
    -** Processing line: ~~
    +      r = (color & 0xFF0000) >> 16
    +** Processing line: ~      g = (color & 0x00FF00) >> 8~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        points = wave~
    +      g = (color & 0x00FF00) >> 8
    +** Processing line: ~      b = (color & 0x0000FF)~
     - Inside source: true
     *** True Line Result
    -        points = wave
    -** Processing line: ~        if wave.length > max_points~
    +      b = (color & 0x0000FF)
    +** Processing line: ~      args.outputs.primitives << { x: v.x - (size / 2), y: v.y + (size / 2), w: size, h: size, r: r, g: g, b: b, a: 255 }.solid!~
     - Inside source: true
     *** True Line Result
    -        if wave.length > max_points
    -** Processing line: ~          resolution = wave.length.idiv max_points~
    +      args.outputs.primitives << { x: v.x - (size / 2), y: v.y + (size / 2), w: size, h: size, r: r, g: g, b: b, a: 255 }.solid!
    +** Processing line: ~      args.outputs.primitives << { x: v.x, y: v.y + size, text: k.to_s, alignment_enum: 1 }.label!~
     - Inside source: true
     *** True Line Result
    -          resolution = wave.length.idiv max_points
    -** Processing line: ~          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }~
    +      args.outputs.primitives << { x: v.x, y: v.y + size, text: k.to_s, alignment_enum: 1 }.label!
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    -** Processing line: ~        end~
    +    }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.outputs.static_lines << points.map_with_index do |y, x|~
    -- Inside source: true
    -*** True Line Result
    -        args.outputs.static_lines << points.map_with_index do |y, x|
    -** Processing line: ~          next_y = points[x + 1]~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -          next_y = points[x + 1]
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~          if next_y~
    -- Inside source: true
    +** Processing line: ~*** Rendering Sprites - Animation Using Separate Pngs - main.rb~
    +- Header detected.
     *** True Line Result
    -          if next_y
    -** Processing line: ~            {~
    -- Inside source: true
    +
     *** True Line Result
    -            {
    -** Processing line: ~              x:  starting_rect.x + (x * x_scale),~
    +*** Rendering Sprites - Animation Using Separate Pngs - 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/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb~
     - Inside source: true
     *** True Line Result
    -              x:  starting_rect.x + (x * x_scale),
    -** Processing line: ~              y:  starting_rect.y + starting_rect.h.half + y_scale * y,~
    +  # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -              y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    -** Processing line: ~              x2: starting_rect.x + ((x + 1) * x_scale),~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              x2: starting_rect.x + ((x + 1) * x_scale),
    -** Processing line: ~              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    -** Processing line: ~              r:  r,~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              r:  r,
    -** Processing line: ~              g:  g,~
    +
    +** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -              g:  g,
    -** Processing line: ~              b:  b~
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -              b:  b
    -** Processing line: ~            }~
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            }
    -** Processing line: ~          end~
    +
    +** Processing line: ~     In this sample app, we're using string interpolation to iterate through images in the~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +     In this sample app, we're using string interpolation to iterate through images in the
    +** Processing line: ~     sprites folder using their image path names.~
     - Inside source: true
     *** True Line Result
    -        end
    +     sprites folder using their image path names.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.outputs.static_sprites << points.map_with_index do |y, x|~
    +** Processing line: ~   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.~
     - Inside source: true
     *** True Line Result
    -        args.outputs.static_sprites << points.map_with_index do |y, x|
    -** Processing line: ~          {~
    +   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]~
     - Inside source: true
     *** True Line Result
    -          {
    -** Processing line: ~            x:  (starting_rect.x + (x * x_scale)) - 2,~
    +     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]
    +** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -            x:  (starting_rect.x + (x * x_scale)) - 2,
    -** Processing line: ~            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,~
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    -** Processing line: ~            w:  4,~
    +
    +** Processing line: ~   - args.outputs.labels: An array. Values in the array generate labels on the screen.~
     - Inside source: true
     *** True Line Result
    -            w:  4,
    -** Processing line: ~            h:  4,~
    +   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -            h:  4,
    -** Processing line: ~            path: 'sprites/square-white.png',~
    +     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -            path: 'sprites/square-white.png',
    -** Processing line: ~            r: r,~
    +     For more information about labels, go to mygame/documentation/02-labels.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            r: r,
    -** Processing line: ~            g: g,~
    +
    +** Processing line: ~   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.~
     - Inside source: true
     *** True Line Result
    -            g: g,
    -** Processing line: ~            b: b~
    +   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.
    +** Processing line: ~     Stores the frame that key was pressed on.~
     - Inside source: true
     *** True Line Result
    -            b: b
    -** Processing line: ~          }~
    +     Stores the frame that key was pressed on.
    +** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
     - Inside source: true
     *** True Line Result
    -          }
    -** Processing line: ~        end~
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    +
    +** Processing line: ~  =end~
    +- Inside source: true
    +*** True Line Result
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.state.graphed_at = args.state.tick_count~
    +** Processing line: ~  # This sample app demonstrates how sprite animations work.~
     - Inside source: true
     *** True Line Result
    -        args.state.graphed_at = args.state.tick_count
    -** Processing line: ~      end~
    +  # This sample app demonstrates how sprite animations work.
    +** Processing line: ~  # There are two sprites that animate forever and one sprite~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +  # There are two sprites that animate forever and one sprite
    +** Processing line: ~  # that *only* animates when you press the "f" key on the keyboard.~
     - Inside source: true
     *** True Line Result
    -    end
    +  # that *only* animates when you press the "f" key on the keyboard.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    begin # region: musical note mapping~
    +** Processing line: ~  # This is the entry point to your game. The `tick` method~
     - Inside source: true
     *** True Line Result
    -    begin # region: musical note mapping
    -** Processing line: ~      def defaults_frequency_for~
    +  # This is the entry point to your game. The `tick` method
    +** Processing line: ~  # executes at 60 frames per second. There are two methods~
     - Inside source: true
     *** True Line Result
    -      def defaults_frequency_for
    -** Processing line: ~        { note: :a, octave: 5, sharp:  false, flat:   false }~
    +  # executes at 60 frames per second. There are two methods
    +** Processing line: ~  # in this tick "entry point": `looping_animation`, and the~
     - Inside source: true
     *** True Line Result
    -        { note: :a, octave: 5, sharp:  false, flat:   false }
    -** Processing line: ~      end~
    +  # in this tick "entry point": `looping_animation`, and the
    +** Processing line: ~  # second method is `one_time_animation`.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +  # second method is `one_time_animation`.
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def frequency_for opts = {}~
    +  def tick args
    +** Processing line: ~    # uncomment the line below to see animation play out in slow motion~
     - Inside source: true
     *** True Line Result
    -      def frequency_for opts = {}
    -** Processing line: ~        opts = defaults_frequency_for.merge opts~
    +    # uncomment the line below to see animation play out in slow motion
    +** Processing line: ~    # args.gtk.slowmo! 6~
     - Inside source: true
     *** True Line Result
    -        opts = defaults_frequency_for.merge opts
    -** Processing line: ~        octave_offset_multiplier  = opts[:octave] - 5~
    +    # args.gtk.slowmo! 6
    +** Processing line: ~    looping_animation args~
     - Inside source: true
     *** True Line Result
    -        octave_offset_multiplier  = opts[:octave] - 5
    -** Processing line: ~        note = note_frequencies_octave_5[opts[:note]]~
    +    looping_animation args
    +** Processing line: ~    one_time_animation args~
     - Inside source: true
     *** True Line Result
    -        note = note_frequencies_octave_5[opts[:note]]
    -** Processing line: ~        if octave_offset_multiplier < 0~
    +    one_time_animation args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        if octave_offset_multiplier < 0
    -** Processing line: ~          note = note * 1 / (octave_offset_multiplier.abs + 1)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          note = note * 1 / (octave_offset_multiplier.abs + 1)
    -** Processing line: ~        elsif octave_offset_multiplier > 0~
    +
    +** Processing line: ~  # This function shows how to animate a sprite that loops forever.~
     - Inside source: true
     *** True Line Result
    -        elsif octave_offset_multiplier > 0
    -** Processing line: ~          note = note * (octave_offset_multiplier.abs + 1) / 1~
    +  # This function shows how to animate a sprite that loops forever.
    +** Processing line: ~  def looping_animation args~
     - Inside source: true
     *** True Line Result
    -          note = note * (octave_offset_multiplier.abs + 1) / 1
    -** Processing line: ~        end~
    +  def looping_animation args
    +** Processing line: ~    # Here we define a few local variables that will be sent~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        note~
    +    # Here we define a few local variables that will be sent
    +** Processing line: ~    # into the magic function that gives us the correct sprite image~
     - Inside source: true
     *** True Line Result
    -        note
    -** Processing line: ~      end~
    +    # into the magic function that gives us the correct sprite image
    +** Processing line: ~    # over time. There are four things we need in order to figure~
     - Inside source: true
     *** True Line Result
    -      end
    +    # over time. There are four things we need in order to figure
    +** Processing line: ~    # out which sprite to show.~
    +- Inside source: true
    +*** True Line Result
    +    # out which sprite to show.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def note_frequencies_octave_5~
    +** Processing line: ~    # 1. When to start the animation.~
     - Inside source: true
     *** True Line Result
    -      def note_frequencies_octave_5
    -** Processing line: ~        {~
    +    # 1. When to start the animation.
    +** Processing line: ~    start_looping_at = 0~
     - Inside source: true
     *** True Line Result
    -        {
    -** Processing line: ~          a: 440.0,~
    +    start_looping_at = 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          a: 440.0,
    -** Processing line: ~          a_sharp: 466.16, b_flat: 466.16,~
    +
    +** Processing line: ~    # 2. The number of pngs that represent the full animation.~
     - Inside source: true
     *** True Line Result
    -          a_sharp: 466.16, b_flat: 466.16,
    -** Processing line: ~          b: 493.88,~
    +    # 2. The number of pngs that represent the full animation.
    +** Processing line: ~    number_of_sprites = 6~
     - Inside source: true
     *** True Line Result
    -          b: 493.88,
    -** Processing line: ~          c: 523.25,~
    +    number_of_sprites = 6
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          c: 523.25,
    -** Processing line: ~          c_sharp: 554.37, d_flat: 587.33,~
    +
    +** Processing line: ~    # 3. How long to show each png.~
     - Inside source: true
     *** True Line Result
    -          c_sharp: 554.37, d_flat: 587.33,
    -** Processing line: ~          d: 587.33,~
    +    # 3. How long to show each png.
    +** Processing line: ~    number_of_frames_to_show_each_sprite = 4~
     - Inside source: true
     *** True Line Result
    -          d: 587.33,
    -** Processing line: ~          d_sharp: 622.25, e_flat: 659.25,~
    +    number_of_frames_to_show_each_sprite = 4
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          d_sharp: 622.25, e_flat: 659.25,
    -** Processing line: ~          e: 659.25,~
    +
    +** Processing line: ~    # 4. Whether the animation should loop once, or forever.~
     - Inside source: true
     *** True Line Result
    -          e: 659.25,
    -** Processing line: ~          f: 698.25,~
    +    # 4. Whether the animation should loop once, or forever.
    +** Processing line: ~    does_sprite_loop = true~
     - Inside source: true
     *** True Line Result
    -          f: 698.25,
    -** Processing line: ~          f_sharp: 739.99, g_flat: 739.99,~
    +    does_sprite_loop = true
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          f_sharp: 739.99, g_flat: 739.99,
    -** Processing line: ~          g: 783.99,~
    +
    +** Processing line: ~    # With the variables defined above, we can get a number~
     - Inside source: true
     *** True Line Result
    -          g: 783.99,
    -** Processing line: ~          g_sharp: 830.61, a_flat: 830.61~
    +    # With the variables defined above, we can get a number
    +** Processing line: ~    # which represents the sprite to show by calling the `frame_index` function.~
     - Inside source: true
     *** True Line Result
    -          g_sharp: 830.61, a_flat: 830.61
    -** Processing line: ~        }~
    +    # which represents the sprite to show by calling the `frame_index` function.
    +** Processing line: ~    # In this case the number will be between 0, and 5 (you can see the sprites~
     - Inside source: true
     *** True Line Result
    -        }
    -** Processing line: ~      end~
    +    # In this case the number will be between 0, and 5 (you can see the sprites
    +** Processing line: ~    # in the ./sprites directory).~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    # in the ./sprites directory).
    +** Processing line: ~    sprite_index = start_looping_at.frame_index number_of_sprites,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +    sprite_index = start_looping_at.frame_index number_of_sprites,
    +** Processing line: ~                                                number_of_frames_to_show_each_sprite,~
     - Inside source: true
     *** True Line Result
    -  end
    +                                                number_of_frames_to_show_each_sprite,
    +** Processing line: ~                                                does_sprite_loop~
    +- Inside source: true
    +*** True Line Result
    +                                                does_sprite_loop
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $gtk.reset~
    +** Processing line: ~    # Now that we have `sprite_index, we can present the correct file.~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset
    -** Processing line: ~~
    +    # Now that we have `sprite_index, we can present the correct file.
    +** Processing line: ~    args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }~
     - 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
    +    args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Input Basics - Keyboard - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Input Basics - Keyboard - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~    # Try changing the numbers below to see how the animation changes:~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/02_input_basics/01_keyboard/app/main.rb~
    +    # Try changing the numbers below to see how the animation changes:
    +** Processing line: ~    args.outputs.sprites << { x: 100, y: 200, w: 100, h: 100, path: "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png" }~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/01_keyboard/app/main.rb
    -** Processing line: ~  =begin~
    +    args.outputs.sprites << { x: 100, y: 200, w: 100, h: 100, path: "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png" }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  =begin
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  APIs listing that haven't been encountered in a previous sample apps:~
    -- Inside source: true
    -*** True Line Result
    -  APIs listing that haven't been encountered in a previous sample apps:
    -** Processing line: ~~
    +** Processing line: ~  # This function shows how to animate a sprite that executes~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set~
    +  # This function shows how to animate a sprite that executes
    +** Processing line: ~  # only once when the "f" key is pressed.~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    -** Processing line: ~    to the frame  that the key_up event occurred (the frame correlates~
    +  # only once when the "f" key is pressed.
    +** Processing line: ~  def one_time_animation args~
     - Inside source: true
     *** True Line Result
    -    to the frame  that the key_up event occurred (the frame correlates
    -** Processing line: ~    to args.state.tick_count). Otherwise the value will be nil. For a~
    +  def one_time_animation args
    +** Processing line: ~    # This is just a label the shows instructions within the game.~
     - Inside source: true
     *** True Line Result
    -    to args.state.tick_count). Otherwise the value will be nil. For a
    -** Processing line: ~    full listing of keys, take a look at mygame/documentation/06-keyboard.md.~
    +    # This is just a label the shows instructions within the game.
    +** Processing line: ~    args.outputs.labels <<  { x: 220, y: 350, text: "(press f to animate)" }~
     - Inside source: true
     *** True Line Result
    -    full listing of keys, take a look at mygame/documentation/06-keyboard.md.
    -** Processing line: ~  - args.state.PROPERTY: The state property on args is a dynamic~
    +    args.outputs.labels <<  { x: 220, y: 350, text: "(press f to animate)" }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  - args.state.PROPERTY: The state property on args is a dynamic
    -** Processing line: ~    structure. You can define ANY property here with ANY type of~
    +
    +** Processing line: ~    # If "f" is pressed on the keyboard...~
     - Inside source: true
     *** True Line Result
    -    structure. You can define ANY property here with ANY type of
    -** Processing line: ~    arbitrary nesting. Properties defined on args.state will be retained~
    +    # If "f" is pressed on the keyboard...
    +** Processing line: ~    if args.inputs.keyboard.key_down.f~
     - Inside source: true
     *** True Line Result
    -    arbitrary nesting. Properties defined on args.state will be retained
    -** Processing line: ~    across frames. If you attempt access a property that doesn't exist~
    +    if args.inputs.keyboard.key_down.f
    +** Processing line: ~      # Print the frame that "f" was pressed on.~
     - Inside source: true
     *** True Line Result
    -    across frames. If you attempt access a property that doesn't exist
    -** Processing line: ~    on args.state, it will simply return nil (no exception will be thrown).~
    +      # Print the frame that "f" was pressed on.
    +** Processing line: ~      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.state.tick_count}"~
     - Inside source: true
     *** True Line Result
    -    on args.state, it will simply return nil (no exception will be thrown).
    +      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.state.tick_count}"
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~      # And MOST IMPORTANTLY set the point it time to start the animation,~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      # And MOST IMPORTANTLY set the point it time to start the animation,
    +** Processing line: ~      # equal to "now" which is represented as args.state.tick_count.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Along with outputs, inputs are also an essential part of video game development~
    +      # equal to "now" which is represented as args.state.tick_count.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # Along with outputs, inputs are also an essential part of video game development
    -** Processing line: ~  # DragonRuby can take input from keyboards, mouse, and controllers.~
    +
    +** Processing line: ~      # Also IMPORTANT, you'll notice that the value of when to start looping~
     - Inside source: true
     *** True Line Result
    -  # DragonRuby can take input from keyboards, mouse, and controllers.
    -** Processing line: ~  # This sample app will cover keyboard input.~
    +      # Also IMPORTANT, you'll notice that the value of when to start looping
    +** Processing line: ~      # is stored in `args.state`. This construct's values are retained across~
     - Inside source: true
     *** True Line Result
    -  # This sample app will cover keyboard input.
    -** Processing line: ~~
    +      # is stored in `args.state`. This construct's values are retained across
    +** Processing line: ~      # executions of the `tick` method.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed~
    +      # executions of the `tick` method.
    +** Processing line: ~      args.state.start_looping_at = args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -  # args.inputs.keyboard.key_up.a will check to see if the a key has been pressed
    -** Processing line: ~  # This will work with the other keys as well~
    +      args.state.start_looping_at = args.state.tick_count
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # This will work with the other keys as well
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~    # These are the same local variables that were defined~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +    # These are the same local variables that were defined
    +** Processing line: ~    # for the `looping_animation` function.~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360~
    +    # for the `looping_animation` function.
    +** Processing line: ~    number_of_sprites = 6~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360
    -** Processing line: ~    # Notice how small_font accounts for all the remaining parameters~
    +    number_of_sprites = 6
    +** Processing line: ~    number_of_frames_to_show_each_sprite = 4~
     - Inside source: true
     *** True Line Result
    -    # Notice how small_font accounts for all the remaining parameters
    -** Processing line: ~    args.outputs.labels << [460, row_to_px(args, 0), "Current game time: #{args.state.tick_count}", small_font]~
    +    number_of_frames_to_show_each_sprite = 4
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    # Except this sprite does not loop again. If the animation time has passed,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [460, row_to_px(args, 0), "Current game time: #{args.state.tick_count}", small_font]
    -** Processing line: ~    args.outputs.labels << [460, row_to_px(args, 2), "Keyboard input: args.inputs.keyboard.key_up.h", small_font]~
    +    # Except this sprite does not loop again. If the animation time has passed,
    +** Processing line: ~    # then the frame_index function returns nil.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [460, row_to_px(args, 2), "Keyboard input: args.inputs.keyboard.key_up.h", small_font]
    -** Processing line: ~    args.outputs.labels << [460, row_to_px(args, 3), "Press \"h\" on the keyboard.", small_font]~
    +    # then the frame_index function returns nil.
    +** Processing line: ~    does_sprite_loop = false~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [460, row_to_px(args, 3), "Press \"h\" on the keyboard.", small_font]
    +    does_sprite_loop = false
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key~
    +** Processing line: ~    sprite_index = args.state~
     - Inside source: true
     *** True Line Result
    -    # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key
    -** Processing line: ~    if args.inputs.keyboard.key_up.h~
    +    sprite_index = args.state
    +** Processing line: ~                       .start_looping_at~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.key_up.h
    -** Processing line: ~      args.state.h_pressed_at = args.state.tick_count~
    +                       .start_looping_at
    +** Processing line: ~                       .frame_index number_of_sprites,~
     - Inside source: true
     *** True Line Result
    -      args.state.h_pressed_at = args.state.tick_count
    -** Processing line: ~    end~
    +                       .frame_index number_of_sprites,
    +** Processing line: ~                                    number_of_frames_to_show_each_sprite,~
     - Inside source: true
     *** True Line Result
    -    end
    +                                    number_of_frames_to_show_each_sprite,
    +** Processing line: ~                                    does_sprite_loop~
    +- Inside source: true
    +*** True Line Result
    +                                    does_sprite_loop
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false~
    +** Processing line: ~    # This line sets the frame index to zero, if~
     - Inside source: true
     *** True Line Result
    -    # This code simplifies to if args.state.h_pressed_at has not been initialized, set it to false
    -** Processing line: ~    args.state.h_pressed_at ||= false~
    +    # This line sets the frame index to zero, if
    +** Processing line: ~    # the animation duration has passed (frame_index returned nil).~
     - Inside source: true
     *** True Line Result
    -    args.state.h_pressed_at ||= false
    +    # the animation duration has passed (frame_index returned nil).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.h_pressed_at~
    +** Processing line: ~    # Remeber: we are not looping forever here.~
     - Inside source: true
     *** True Line Result
    -    if args.state.h_pressed_at
    -** Processing line: ~      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" was pressed at time: #{args.state.h_pressed_at}", small_font]~
    +    # Remeber: we are not looping forever here.
    +** Processing line: ~    sprite_index ||= 0~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" was pressed at time: #{args.state.h_pressed_at}", small_font]
    -** Processing line: ~    else~
    +    sprite_index ||= 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" has never been pressed.", small_font]~
    +
    +** Processing line: ~    # Present the sprite.~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [460, row_to_px(args, 4), "\"h\" has never been pressed.", small_font]
    -** Processing line: ~    end~
    +    # Present the sprite.
    +** Processing line: ~    args.outputs.sprites << { x: 100, y: 300, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.outputs.sprites << { x: 100, y: 300, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    tick_help_text args~
    +** Processing line: ~    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."~
     - Inside source: true
     *** True Line Result
    -    tick_help_text args
    +    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -17220,58 +17647,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 small_font~
    -- Inside source: true
    -*** True Line Result
    -  def small_font
    -** Processing line: ~    # This method provides some values for the construction of labels~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    # This method provides some values for the construction of labels
    -** Processing line: ~    # Specifically, Size, Alignment, & RGBA~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -    # Specifically, Size, Alignment, & RGBA
    -** Processing line: ~    # This makes it so that custom parameters don't have to be repeatedly typed.~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -    # This makes it so that custom parameters don't have to be repeatedly typed.
    -** Processing line: ~    # Additionally "small_font" provides programmers with more information than some numbers~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -    # Additionally "small_font" provides programmers with more information than some numbers
    -** Processing line: ~    [-2, 0, 0, 0, 0, 255]~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -    [-2, 0, 0, 0, 0, 255]
    -** Processing line: ~  end~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def row_to_px args, row_number~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  def row_to_px args, row_number
    -** Processing line: ~    # This takes a row_number and converts it to pixels DragonRuby understands.~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # This takes a row_number and converts it to pixels DragonRuby understands.
    -** Processing line: ~    # Row 0 starts 5 units below the top of the grid~
    +
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    # Row 0 starts 5 units below the top of the grid
    -** Processing line: ~    # Each row afterward is 20 units lower~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -    # Each row afterward is 20 units lower
    -** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -17280,106 +17703,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Don't worry about understanding the code within this method just yet.~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  # Don't worry about understanding the code within this method just yet.
    -** Processing line: ~  # This method shows you the help text within the game.~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -  # This method shows you the help text within the game.
    -** Processing line: ~  def tick_help_text args~
    -- Inside source: true
    +
    +** Processing line: ~*** Rendering Sprites - Animation Using Sprite Sheet - main.rb~
    +- Header detected.
     *** True Line Result
    -  def tick_help_text args
    -** Processing line: ~    return unless args.state.h_pressed_at~
    -- Inside source: true
    +
     *** True Line Result
    -    return unless args.state.h_pressed_at
    -** Processing line: ~~
    -- Inside source: true
    +*** Rendering Sprites - Animation Using Sprite Sheet - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~    args.state.key_value_history      ||= {}~
    -- Inside source: true
     *** True Line Result
    -    args.state.key_value_history      ||= {}
    -** Processing line: ~    args.state.key_down_value_history ||= {}~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    args.state.key_down_value_history ||= {}
    -** Processing line: ~    args.state.key_held_value_history ||= {}~
    +  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.state.key_held_value_history ||= {}
    -** Processing line: ~    args.state.key_up_value_history   ||= {}~
    +  def tick args
    +** Processing line: ~    args.state.player.x ||= 100~
     - Inside source: true
     *** True Line Result
    -    args.state.key_up_value_history   ||= {}
    -** Processing line: ~~
    +    args.state.player.x ||= 100
    +** Processing line: ~    args.state.player.y ||= 100~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||~
    +    args.state.player.y ||= 100
    +** Processing line: ~    args.state.player.w ||= 64~
     - Inside source: true
     *** True Line Result
    -    if (args.inputs.keyboard.key_down.truthy_keys.length > 0 ||
    -** Processing line: ~        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||~
    +    args.state.player.w ||= 64
    +** Processing line: ~    args.state.player.h ||= 64~
     - Inside source: true
     *** True Line Result
    -        args.inputs.keyboard.key_held.truthy_keys.length > 0 ||
    -** Processing line: ~        args.inputs.keyboard.key_up.truthy_keys.length > 0)~
    +    args.state.player.h ||= 64
    +** Processing line: ~    args.state.player.direction ||= 1~
     - Inside source: true
     *** True Line Result
    -        args.inputs.keyboard.key_up.truthy_keys.length > 0)
    -** Processing line: ~      args.state.help_available = true~
    +    args.state.player.direction ||= 1
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.help_available = true
    -** Processing line: ~      args.state.no_activity_debounce = nil~
    +
    +** Processing line: ~    args.state.player.is_moving = false~
     - Inside source: true
     *** True Line Result
    -      args.state.no_activity_debounce = nil
    -** Processing line: ~    else~
    +    args.state.player.is_moving = false
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.state.no_activity_debounce ||= 5.seconds~
    +
    +** Processing line: ~    # get the keyboard input and set player properties~
     - Inside source: true
     *** True Line Result
    -      args.state.no_activity_debounce ||= 5.seconds
    -** Processing line: ~      args.state.no_activity_debounce -= 1~
    +    # get the keyboard input and set player properties
    +** Processing line: ~    if args.inputs.keyboard.right~
     - Inside source: true
     *** True Line Result
    -      args.state.no_activity_debounce -= 1
    -** Processing line: ~      if args.state.no_activity_debounce <= 0~
    +    if args.inputs.keyboard.right
    +** Processing line: ~      args.state.player.x += 3~
     - Inside source: true
     *** True Line Result
    -      if args.state.no_activity_debounce <= 0
    -** Processing line: ~        args.state.help_available = false~
    +      args.state.player.x += 3
    +** Processing line: ~      args.state.player.direction = 1~
     - Inside source: true
     *** True Line Result
    -        args.state.help_available = false
    -** Processing line: ~        args.state.key_value_history        = {}~
    +      args.state.player.direction = 1
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -        args.state.key_value_history        = {}
    -** Processing line: ~        args.state.key_down_value_history   = {}~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    elsif args.inputs.keyboard.left~
     - Inside source: true
     *** True Line Result
    -        args.state.key_down_value_history   = {}
    -** Processing line: ~        args.state.key_held_value_history   = {}~
    +    elsif args.inputs.keyboard.left
    +** Processing line: ~      args.state.player.x -= 3~
     - Inside source: true
     *** True Line Result
    -        args.state.key_held_value_history   = {}
    -** Processing line: ~        args.state.key_up_value_history     = {}~
    +      args.state.player.x -= 3
    +** Processing line: ~      args.state.player.direction = -1~
     - Inside source: true
     *** True Line Result
    -        args.state.key_up_value_history     = {}
    -** Processing line: ~      end~
    +      args.state.player.direction = -1
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -      end
    +      args.state.player.started_running_at ||= args.state.tick_count
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -17388,26 +17807,30 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.labels << [10, row_to_px(args, 6), "Advanced Help:", small_font]~
    +** Processing line: ~    if args.inputs.keyboard.up~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [10, row_to_px(args, 6), "Advanced Help:", small_font]
    -** Processing line: ~~
    +    if args.inputs.keyboard.up
    +** Processing line: ~      args.state.player.y += 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if !args.state.help_available~
    +      args.state.player.y += 1
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    if !args.state.help_available
    -** Processing line: ~      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    elsif args.inputs.keyboard.down~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [10, row_to_px(args, 7),  "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]
    -** Processing line: ~      return~
    +    elsif args.inputs.keyboard.down
    +** Processing line: ~      args.state.player.y -= 1~
     - Inside source: true
     *** True Line Result
    -      return
    +      args.state.player.y -= 1
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +      args.state.player.started_running_at ||= args.state.tick_count
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -17416,134 +17839,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.labels << [10 , row_to_px(args, 7), "args.inputs.keyboard", small_font]~
    +** Processing line: ~    # if no arrow keys are being pressed, set the player as not moving~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [10 , row_to_px(args, 7), "args.inputs.keyboard", small_font]
    -** Processing line: ~    args.outputs.labels << [330, row_to_px(args, 7), "args.inputs.keyboard.key_down", small_font]~
    +    # if no arrow keys are being pressed, set the player as not moving
    +** Processing line: ~    if !args.inputs.keyboard.directional_vector~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [330, row_to_px(args, 7), "args.inputs.keyboard.key_down", small_font]
    -** Processing line: ~    args.outputs.labels << [650, row_to_px(args, 7), "args.inputs.keyboard.key_held", small_font]~
    +    if !args.inputs.keyboard.directional_vector
    +** Processing line: ~      args.state.player.started_running_at = nil~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [650, row_to_px(args, 7), "args.inputs.keyboard.key_held", small_font]
    -** Processing line: ~    args.outputs.labels << [990, row_to_px(args, 7), "args.inputs.keyboard.key_up", small_font]~
    +      args.state.player.started_running_at = nil
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [990, row_to_px(args, 7), "args.inputs.keyboard.key_up", small_font]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    fill_history args, :key_value_history,      :down_or_held, nil~
    -- Inside source: true
    -*** True Line Result
    -    fill_history args, :key_value_history,      :down_or_held, nil
    -** Processing line: ~    fill_history args, :key_down_value_history, :down,        :key_down~
    -- Inside source: true
    -*** True Line Result
    -    fill_history args, :key_down_value_history, :down,        :key_down
    -** Processing line: ~    fill_history args, :key_held_value_history, :held,        :key_held~
    +** Processing line: ~    # wrap player around the stage~
     - Inside source: true
     *** True Line Result
    -    fill_history args, :key_held_value_history, :held,        :key_held
    -** Processing line: ~    fill_history args, :key_up_value_history,   :up,          :key_up~
    +    # wrap player around the stage
    +** Processing line: ~    if args.state.player.x > 1280~
     - Inside source: true
     *** True Line Result
    -    fill_history args, :key_up_value_history,   :up,          :key_up
    -** Processing line: ~~
    +    if args.state.player.x > 1280
    +** Processing line: ~      args.state.player.x = -64~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    render_help_labels args, :key_value_history,      :down_or_held, nil,      10~
    +      args.state.player.x = -64
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    render_help_labels args, :key_value_history,      :down_or_held, nil,      10
    -** Processing line: ~    render_help_labels args, :key_down_value_history, :down,        :key_down, 330~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    elsif args.state.player.x < -64~
     - Inside source: true
     *** True Line Result
    -    render_help_labels args, :key_down_value_history, :down,        :key_down, 330
    -** Processing line: ~    render_help_labels args, :key_held_value_history, :held,        :key_held, 650~
    +    elsif args.state.player.x < -64
    +** Processing line: ~      args.state.player.x = 1280~
     - Inside source: true
     *** True Line Result
    -    render_help_labels args, :key_held_value_history, :held,        :key_held, 650
    -** Processing line: ~    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990~
    +      args.state.player.x = 1280
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    render_help_labels args, :key_up_value_history,   :up,          :key_up,   990
    -** Processing line: ~  end~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def fill_history args, history_key, state_key, keyboard_method~
    +** Processing line: ~    if args.state.player.y > 720~
     - Inside source: true
     *** True Line Result
    -  def fill_history args, history_key, state_key, keyboard_method
    -** Processing line: ~    fill_single_history args, history_key, state_key, keyboard_method, :raw_key~
    +    if args.state.player.y > 720
    +** Processing line: ~      args.state.player.y = -64~
     - Inside source: true
     *** True Line Result
    -    fill_single_history args, history_key, state_key, keyboard_method, :raw_key
    -** Processing line: ~    fill_single_history args, history_key, state_key, keyboard_method, :char~
    +      args.state.player.y = -64
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    fill_single_history args, history_key, state_key, keyboard_method, :char
    -** Processing line: ~    args.inputs.keyboard.keys[state_key].each do |key_name|~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    elsif args.state.player.y < -64~
     - Inside source: true
     *** True Line Result
    -    args.inputs.keyboard.keys[state_key].each do |key_name|
    -** Processing line: ~      fill_single_history args, history_key, state_key, keyboard_method, key_name~
    +    elsif args.state.player.y < -64
    +** Processing line: ~      args.state.player.y = 720~
     - Inside source: true
     *** True Line Result
    -      fill_single_history args, history_key, state_key, keyboard_method, key_name
    -** Processing line: ~    end~
    +      args.state.player.y = 720
    +** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      args.state.player.started_running_at ||= args.state.tick_count
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def fill_single_history args, history_key, state_key, keyboard_method, key_name~
    -- Inside source: true
    -*** True Line Result
    -  def fill_single_history args, history_key, state_key, keyboard_method, key_name
    -** Processing line: ~    current_value = args.inputs.keyboard.send(key_name)~
    +** Processing line: ~    # render player as standing or running~
     - Inside source: true
     *** True Line Result
    -    current_value = args.inputs.keyboard.send(key_name)
    -** Processing line: ~    if keyboard_method~
    +    # render player as standing or running
    +** Processing line: ~    if args.state.player.started_running_at~
     - Inside source: true
     *** True Line Result
    -    if keyboard_method
    -** Processing line: ~      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)~
    +    if args.state.player.started_running_at
    +** Processing line: ~      args.outputs.sprites << running_sprite(args)~
     - Inside source: true
     *** True Line Result
    -      current_value = args.inputs.keyboard.send(keyboard_method).send(key_name)
    -** Processing line: ~    end~
    +      args.outputs.sprites << running_sprite(args)
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    args.state.as_hash[history_key][key_name] ||= []~
    +    else
    +** Processing line: ~      args.outputs.sprites << standing_sprite(args)~
     - Inside source: true
     *** True Line Result
    -    args.state.as_hash[history_key][key_name] ||= []
    -** Processing line: ~    args.state.as_hash[history_key][key_name] << current_value~
    +      args.outputs.sprites << standing_sprite(args)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.as_hash[history_key][key_name] << current_value
    -** Processing line: ~    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse~
    +    end
    +** Processing line: ~    args.outputs.labels << [30, 700, "Use arrow keys to move around."]~
     - Inside source: true
     *** True Line Result
    -    args.state.as_hash[history_key][key_name] = args.state.as_hash[history_key][key_name].reverse.uniq.take(3).reverse
    +    args.outputs.labels << [30, 700, "Use arrow keys to move around."]
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -17552,158 +17963,158 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render_help_labels args, history_key, state_key, keyboard_method, x~
    +** Processing line: ~  def standing_sprite args~
     - Inside source: true
     *** True Line Result
    -  def render_help_labels args, history_key, state_key, keyboard_method, x
    -** Processing line: ~    idx = 8~
    +  def standing_sprite args
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -    idx = 8
    -** Processing line: ~    args.outputs.labels << args.state~
    +    {
    +** Processing line: ~      x: args.state.player.x,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << args.state
    -** Processing line: ~                             .as_hash[history_key]~
    +      x: args.state.player.x,
    +** Processing line: ~      y: args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -                             .as_hash[history_key]
    -** Processing line: ~                             .keys~
    +      y: args.state.player.y,
    +** Processing line: ~      w: args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -                             .keys
    -** Processing line: ~                             .reverse~
    +      w: args.state.player.w,
    +** Processing line: ~      h: args.state.player.h,~
     - Inside source: true
     *** True Line Result
    -                             .reverse
    -** Processing line: ~                             .map~
    +      h: args.state.player.h,
    +** Processing line: ~      path: "sprites/horizontal-stand.png",~
     - Inside source: true
     *** True Line Result
    -                             .map
    -** Processing line: ~                             .with_index do |k, i|~
    +      path: "sprites/horizontal-stand.png",
    +** Processing line: ~      flip_horizontally: args.state.player.direction > 0~
     - Inside source: true
     *** True Line Result
    -                             .with_index do |k, i|
    -** Processing line: ~      v = args.state.as_hash[history_key][k]~
    +      flip_horizontally: args.state.player.direction > 0
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -      v = args.state.as_hash[history_key][k]
    -** Processing line: ~      current_value = args.inputs.keyboard.send(k)~
    +    }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      current_value = args.inputs.keyboard.send(k)
    -** Processing line: ~      if keyboard_method~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if keyboard_method
    -** Processing line: ~        current_value = args.inputs.keyboard.send(keyboard_method).send(k)~
    +
    +** Processing line: ~  def running_sprite args~
     - Inside source: true
     *** True Line Result
    -        current_value = args.inputs.keyboard.send(keyboard_method).send(k)
    -** Processing line: ~      end~
    +  def running_sprite args
    +** Processing line: ~    if !args.state.player.started_running_at~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      idx += 2~
    +    if !args.state.player.started_running_at
    +** Processing line: ~      tile_index = 0~
     - Inside source: true
     *** True Line Result
    -      idx += 2
    -** Processing line: ~      [~
    +      tile_index = 0
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [x, row_to_px(args, idx - 2),~
    +    else
    +** Processing line: ~      how_many_frames_in_sprite_sheet = 6~
     - Inside source: true
     *** True Line Result
    -        [x, row_to_px(args, idx - 2),
    -** Processing line: ~         "    .#{k} is #{current_value || "nil"}",~
    +      how_many_frames_in_sprite_sheet = 6
    +** Processing line: ~      how_many_ticks_to_hold_each_frame = 3~
     - Inside source: true
     *** True Line Result
    -         "    .#{k} is #{current_value || "nil"}",
    -** Processing line: ~         small_font],~
    +      how_many_ticks_to_hold_each_frame = 3
    +** Processing line: ~      should_the_index_repeat = true~
     - Inside source: true
     *** True Line Result
    -         small_font],
    -** Processing line: ~        [x, row_to_px(args, idx - 1),~
    +      should_the_index_repeat = true
    +** Processing line: ~      tile_index = args.state~
     - Inside source: true
     *** True Line Result
    -        [x, row_to_px(args, idx - 1),
    -** Processing line: ~         "       was #{v}",~
    +      tile_index = args.state
    +** Processing line: ~                       .player~
     - Inside source: true
     *** True Line Result
    -         "       was #{v}",
    -** Processing line: ~         small_font]~
    +                       .player
    +** Processing line: ~                       .started_running_at~
     - Inside source: true
     *** True Line Result
    -         small_font]
    -** Processing line: ~      ]~
    +                       .started_running_at
    +** Processing line: ~                       .frame_index(how_many_frames_in_sprite_sheet,~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +                       .frame_index(how_many_frames_in_sprite_sheet,
    +** Processing line: ~                                    how_many_ticks_to_hold_each_frame,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +                                    how_many_ticks_to_hold_each_frame,
    +** Processing line: ~                                    should_the_index_repeat)~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                                    should_the_index_repeat)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    {
    +** Processing line: ~      x: args.state.player.x,~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +      x: args.state.player.x,
    +** Processing line: ~      y: args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      y: args.state.player.y,
    +** Processing line: ~      w: args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      w: args.state.player.w,
    +** Processing line: ~      h: args.state.player.h,~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      h: args.state.player.h,
    +** Processing line: ~      path: 'sprites/horizontal-run.png',~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +      path: 'sprites/horizontal-run.png',
    +** Processing line: ~      tile_x: 0 + (tile_index * args.state.player.w),~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +      tile_x: 0 + (tile_index * args.state.player.w),
    +** Processing line: ~      tile_y: 0,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      tile_y: 0,
    +** Processing line: ~      tile_w: args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +      tile_w: args.state.player.w,
    +** Processing line: ~      tile_h: args.state.player.h,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +      tile_h: args.state.player.h,
    +** Processing line: ~      flip_horizontally: args.state.player.direction > 0,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      flip_horizontally: args.state.player.direction > 0,
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    }
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -17720,346 +18131,346 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Input Basics - Mouse - main.rb~
    +** Processing line: ~*** Rendering Sprites - Animation States - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Input Basics - Mouse - main.rb
    +*** Rendering Sprites - Animation States - 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/02_input_basics/02_mouse/app/main.rb~
    +** Processing line: ~  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/02_mouse/app/main.rb
    -** Processing line: ~  =begin~
    +  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb
    +** Processing line: ~  class Game~
     - Inside source: true
     *** True Line Result
    -  =begin
    +  class Game
    +** Processing line: ~    attr_gtk~
    +- Inside source: true
    +*** True Line Result
    +    attr_gtk
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -  APIs that haven't been encountered in a previous sample apps:
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~  - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
    -- Inside source: true
    -*** True Line Result
    -  - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -** Processing line: ~  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
    +    def defaults
    +** Processing line: ~      state.show_debug_layer  = true if state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -** Processing line: ~  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
    +      state.show_debug_layer  = true if state.tick_count == 0
    +** Processing line: ~      player.tile_size        = 64~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -** Processing line: ~  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed~
    +      player.tile_size        = 64
    +** Processing line: ~      player.speed            = 3~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -** Processing line: ~    since the click event.~
    +      player.speed            = 3
    +** Processing line: ~      player.slash_frames     = 15~
     - Inside source: true
     *** True Line Result
    -    since the click event.
    -** Processing line: ~~
    +      player.slash_frames     = 15
    +** Processing line: ~      player.x              ||= 50~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  Reminder:~
    +      player.x              ||= 50
    +** Processing line: ~      player.y              ||= 400~
     - Inside source: true
     *** True Line Result
    -  Reminder:
    -** Processing line: ~~
    +      player.y              ||= 400
    +** Processing line: ~      player.dir_x          ||=  1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  - args.state.PROPERTY: The state property on args is a dynamic~
    +      player.dir_x          ||=  1
    +** Processing line: ~      player.dir_y          ||= -1~
     - Inside source: true
     *** True Line Result
    -  - args.state.PROPERTY: The state property on args is a dynamic
    -** Processing line: ~    structure. You can define ANY property here with ANY type of~
    +      player.dir_y          ||= -1
    +** Processing line: ~      player.is_moving      ||= false~
     - Inside source: true
     *** True Line Result
    -    structure. You can define ANY property here with ANY type of
    -** Processing line: ~    arbitrary nesting. Properties defined on args.state will be retained~
    +      player.is_moving      ||= false
    +** Processing line: ~      state.watch_list      ||= {}~
     - Inside source: true
     *** True Line Result
    -    arbitrary nesting. Properties defined on args.state will be retained
    -** Processing line: ~    across frames. If you attempt access a property that doesn't exist~
    +      state.watch_list      ||= {}
    +** Processing line: ~      state.enemies         ||= []~
     - Inside source: true
     *** True Line Result
    -    across frames. If you attempt access a property that doesn't exist
    -** Processing line: ~    on args.state, it will simply return nil (no exception will be thrown).~
    +      state.enemies         ||= []
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    on args.state, it will simply return nil (no exception will be thrown).
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~    def add_enemy~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +    def add_enemy
    +** Processing line: ~      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This code demonstrates DragonRuby mouse input~
    +      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # This code demonstrates DragonRuby mouse input
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # To see if the a mouse click occurred~
    +** Processing line: ~    def sprite_horizontal_run~
     - Inside source: true
     *** True Line Result
    -  # To see if the a mouse click occurred
    -** Processing line: ~  # Use args.inputs.mouse.click~
    +    def sprite_horizontal_run
    +** Processing line: ~      tile_index = 0.frame_index(6, 3, true)~
     - Inside source: true
     *** True Line Result
    -  # Use args.inputs.mouse.click
    -** Processing line: ~  # Which returns a boolean~
    +      tile_index = 0.frame_index(6, 3, true)
    +** Processing line: ~      tile_index = 0 if !player.is_moving~
     - Inside source: true
     *** True Line Result
    -  # Which returns a boolean
    +      tile_index = 0 if !player.is_moving
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # To see where a mouse click occurred~
    -- Inside source: true
    -*** True Line Result
    -  # To see where a mouse click occurred
    -** Processing line: ~  # Use args.inputs.mouse.click.point.x AND~
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -  # Use args.inputs.mouse.click.point.x AND
    -** Processing line: ~  # args.inputs.mouse.click.point.y~
    +      {
    +** Processing line: ~        x: player.x,~
     - Inside source: true
     *** True Line Result
    -  # args.inputs.mouse.click.point.y
    -** Processing line: ~~
    +        x: player.x,
    +** Processing line: ~        y: player.y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # To see which frame the click occurred~
    +        y: player.y,
    +** Processing line: ~        w: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -  # To see which frame the click occurred
    -** Processing line: ~  # Use args.inputs.mouse.click.created_at~
    +        w: player.tile_size,
    +** Processing line: ~        h: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -  # Use args.inputs.mouse.click.created_at
    -** Processing line: ~~
    +        h: player.tile_size,
    +** Processing line: ~        path: 'sprites/horizontal-run.png',~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # To see how many frames its been since the click occurred~
    +        path: 'sprites/horizontal-run.png',
    +** Processing line: ~        tile_x: 0 + (tile_index * player.tile_size),~
     - Inside source: true
     *** True Line Result
    -  # To see how many frames its been since the click occurred
    -** Processing line: ~  # Use args.inputs.mouse.click.creat_at_elapsed~
    +        tile_x: 0 + (tile_index * player.tile_size),
    +** Processing line: ~        tile_y: 0,~
     - Inside source: true
     *** True Line Result
    -  # Use args.inputs.mouse.click.creat_at_elapsed
    -** Processing line: ~~
    +        tile_y: 0,
    +** Processing line: ~        tile_w: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Saving the click in args.state can be quite useful~
    +        tile_w: player.tile_size,
    +** Processing line: ~        tile_h: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -  # Saving the click in args.state can be quite useful
    -** Processing line: ~~
    +        tile_h: player.tile_size,
    +** Processing line: ~        flip_horizontally: player.dir_x > 0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +        flip_horizontally: player.dir_x > 0,
    +** Processing line: ~        # a: 40~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."~
    +        # a: 40
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how mouse events are registered and how to measure elapsed time."
    -** Processing line: ~    x = 460~
    +      }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    x = 460
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")~
    +** Processing line: ~    def sprite_horizontal_stand~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << small_label(args, x, 11, "Mouse input: args.inputs.mouse")
    -** Processing line: ~~
    +    def sprite_horizontal_stand
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.inputs.mouse.click~
    +      {
    +** Processing line: ~        x: player.x,~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click
    -** Processing line: ~      args.state.last_mouse_click = args.inputs.mouse.click~
    +        x: player.x,
    +** Processing line: ~        y: player.y,~
     - Inside source: true
     *** True Line Result
    -      args.state.last_mouse_click = args.inputs.mouse.click
    -** Processing line: ~    end~
    +        y: player.y,
    +** Processing line: ~        w: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        w: player.tile_size,
    +** Processing line: ~        h: player.tile_size,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.state.last_mouse_click~
    +        h: player.tile_size,
    +** Processing line: ~        path: 'sprites/horizontal-stand.png',~
     - Inside source: true
     *** True Line Result
    -    if args.state.last_mouse_click
    -** Processing line: ~      click = args.state.last_mouse_click~
    +        path: 'sprites/horizontal-stand.png',
    +** Processing line: ~        flip_horizontally: player.dir_x > 0,~
     - Inside source: true
     *** True Line Result
    -      click = args.state.last_mouse_click
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")~
    +        flip_horizontally: player.dir_x > 0,
    +** Processing line: ~        # a: 40~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 12, "Mouse click happened at: #{click.created_at}")
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")~
    +        # a: 40
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 13, "Mouse clicked #{click.created_at_elapsed} ticks ago")
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")~
    +      }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 14, "Mouse click location: #{click.point.x}, #{click.point.y}")
    -** Processing line: ~    else~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")~
    +
    +** Processing line: ~    def sprite_horizontal_slash~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 12, "Mouse click has not occurred yet.")
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")~
    +    def sprite_horizontal_slash
    +** Processing line: ~      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 13, "Please click mouse.")
    -** Processing line: ~    end~
    +      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      {
    +** Processing line: ~        x: player.x - 41.25,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def small_label args, x, row, message~
    +        x: player.x - 41.25,
    +** Processing line: ~        y: player.y - 41.25,~
     - Inside source: true
     *** True Line Result
    -  def small_label args, x, row, message
    -** Processing line: ~    # This method effectively combines the row_to_px and small_font methods~
    +        y: player.y - 41.25,
    +** Processing line: ~        w: 165,~
     - Inside source: true
     *** True Line Result
    -    # This method effectively combines the row_to_px and small_font methods
    -** Processing line: ~    # It changes the given row value to a DragonRuby pixel value~
    +        w: 165,
    +** Processing line: ~        h: 165,~
     - Inside source: true
     *** True Line Result
    -    # It changes the given row value to a DragonRuby pixel value
    -** Processing line: ~    # and adds the customization parameters~
    +        h: 165,
    +** Processing line: ~        path: 'sprites/horizontal-slash.png',~
     - Inside source: true
     *** True Line Result
    -    # and adds the customization parameters
    -** Processing line: ~    [x, row_to_px(args, row), message, small_font]~
    +        path: 'sprites/horizontal-slash.png',
    +** Processing line: ~        tile_x: 0 + (tile_index * 128),~
     - Inside source: true
     *** True Line Result
    -    [x, row_to_px(args, row), message, small_font]
    -** Processing line: ~  end~
    +        tile_x: 0 + (tile_index * 128),
    +** Processing line: ~        tile_y: 0,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        tile_y: 0,
    +** Processing line: ~        tile_w: 128,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def small_font~
    +        tile_w: 128,
    +** Processing line: ~        tile_h: 128,~
     - Inside source: true
     *** True Line Result
    -  def small_font
    -** Processing line: ~    [-2, 0, 0, 0, 0, 255]~
    +        tile_h: 128,
    +** Processing line: ~        flip_horizontally: player.dir_x > 0~
     - Inside source: true
     *** True Line Result
    -    [-2, 0, 0, 0, 0, 255]
    -** Processing line: ~  end~
    +        flip_horizontally: player.dir_x > 0
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -  end
    +      }
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def row_to_px args, row_number~
    +** Processing line: ~    def render_player~
     - Inside source: true
     *** True Line Result
    -  def row_to_px args, row_number
    -** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
    +    def render_player
    +** Processing line: ~      if player.slash_at~
     - Inside source: true
     *** True Line Result
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    -** Processing line: ~  end~
    +      if player.slash_at
    +** Processing line: ~        outputs.sprites << sprite_horizontal_slash~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        outputs.sprites << sprite_horizontal_slash
    +** Processing line: ~      elsif player.is_moving~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +      elsif player.is_moving
    +** Processing line: ~        outputs.sprites << sprite_horizontal_run~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +        outputs.sprites << sprite_horizontal_run
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +      else
    +** Processing line: ~        outputs.sprites << sprite_horizontal_stand~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +        outputs.sprites << sprite_horizontal_stand
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +
    +** Processing line: ~    def render_enemies~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +    def render_enemies
    +** Processing line: ~      outputs.borders << state.enemies~
    +- Inside source: true
    +*** True Line Result
    +      outputs.borders << state.enemies
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -18068,258 +18479,270 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~    def render_debug_layer~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +    def render_debug_layer
    +** Processing line: ~      return if !state.show_debug_layer~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      return if !state.show_debug_layer
    +** Processing line: ~      outputs.labels << state.watch_list.map.with_index do |(k, v), i|~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      outputs.labels << state.watch_list.map.with_index do |(k, v), i|
    +** Processing line: ~         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +      end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Input Basics - Mouse Point To Rect - main.rb~
    -- Header detected.
    +** Processing line: ~      outputs.borders << player.slash_collision_rect~
    +- Inside source: true
     *** True Line Result
    -
    +      outputs.borders << player.slash_collision_rect
    +** Processing line: ~    end~
    +- Inside source: true
     *** True Line Result
    -*** Input Basics - Mouse Point To Rect - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    end
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~    def slash_initiate?~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb~
    +    def slash_initiate?
    +** Processing line: ~      # buffalo usb controller has a button and b button swapped lol~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/03_mouse_point_to_rect/app/main.rb
    -** Processing line: ~  =begin~
    +      # buffalo usb controller has a button and b button swapped lol
    +** Processing line: ~      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j~
     - Inside source: true
     *** True Line Result
    -  =begin
    +      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
    +** Processing line: ~    def input~
     - Inside source: true
     *** True Line Result
    -  APIs that haven't been encountered in a previous sample apps:
    -** Processing line: ~~
    +    def input
    +** Processing line: ~      # player movement~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  - args.outputus.borders: An array. Values in this array will be rendered as~
    +      # player movement
    +** Processing line: ~      if slash_complete? && (vector = inputs.directional_vector)~
     - Inside source: true
     *** True Line Result
    -  - args.outputus.borders: An array. Values in this array will be rendered as
    -** Processing line: ~    unfilled rectangles on the screen.~
    +      if slash_complete? && (vector = inputs.directional_vector)
    +** Processing line: ~        player.x += vector.x * player.speed~
     - Inside source: true
     *** True Line Result
    -    unfilled rectangles on the screen.
    -** Processing line: ~  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
    +        player.x += vector.x * player.speed
    +** Processing line: ~        player.y += vector.y * player.speed~
     - Inside source: true
     *** True Line Result
    -  - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -** Processing line: ~    with at least four values is considered a rect. The inside_rect? function returns true~
    +        player.y += vector.y * player.speed
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    with at least four values is considered a rect. The inside_rect? function returns true
    -** Processing line: ~    or false depending on if the point is inside the rect.~
    +      end
    +** Processing line: ~      player.slash_at = slash_initiate? if slash_initiate?~
     - Inside source: true
     *** True Line Result
    -    or false depending on if the point is inside the rect.
    +      player.slash_at = slash_initiate? if slash_initiate?
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    ```~
    +** Processing line: ~    def calc_movement~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~    # Point:  x: 100, y: 100~
    +    def calc_movement
    +** Processing line: ~      # movement~
     - Inside source: true
     *** True Line Result
    -    # Point:  x: 100, y: 100
    -** Processing line: ~    # Rect:   x: 0, y: 0, w: 500, h: 500~
    +      # movement
    +** Processing line: ~      if vector = inputs.directional_vector~
     - Inside source: true
     *** True Line Result
    -    # Rect:   x: 0, y: 0, w: 500, h: 500
    -** Processing line: ~    # Result: true~
    +      if vector = inputs.directional_vector
    +** Processing line: ~        state.debug_label = vector~
     - Inside source: true
     *** True Line Result
    -    # Result: true
    -** Processing line: ~~
    +        state.debug_label = vector
    +** Processing line: ~        player.dir_x = vector.x~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    [100, 100].inside_rect? [0, 0, 500, 500]~
    +        player.dir_x = vector.x
    +** Processing line: ~        player.dir_y = vector.y~
     - Inside source: true
     *** True Line Result
    -    [100, 100].inside_rect? [0, 0, 500, 500]
    -** Processing line: ~    ```~
    +        player.dir_y = vector.y
    +** Processing line: ~        player.is_moving = true~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~~
    +        player.is_moving = true
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    ```~
    +      else
    +** Processing line: ~        state.debug_label = vector~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~    # Point:  x: 100, y: 100~
    +        state.debug_label = vector
    +** Processing line: ~        player.is_moving = false~
     - Inside source: true
     *** True Line Result
    -    # Point:  x: 100, y: 100
    -** Processing line: ~    # Rect:   x: 300, y: 300, w: 100, h: 100~
    +        player.is_moving = false
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    # Rect:   x: 300, y: 300, w: 100, h: 100
    -** Processing line: ~    # Result: false~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    # Result: false
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    [100, 100].inside_rect? [300, 300, 100, 100]~
    +** Processing line: ~    def calc_slash~
     - Inside source: true
     *** True Line Result
    -    [100, 100].inside_rect? [300, 300, 100, 100]
    -** Processing line: ~    ```~
    +    def calc_slash
    +** Processing line: ~      # re-calc the location of the swords collision box~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~~
    +      # re-calc the location of the swords collision box
    +** Processing line: ~      if player.dir_x.positive?~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
    +      if player.dir_x.positive?
    +** Processing line: ~        player.slash_collision_rect = [player.x + player.tile_size,~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -** Processing line: ~  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed~
    +        player.slash_collision_rect = [player.x + player.tile_size,
    +** Processing line: ~                                       player.y + player.tile_size.half - 10,~
     - Inside source: true
     *** True Line Result
    -  - args.inputs.mouse.click.point.created_at_elapsed: How many frames have passed
    -** Processing line: ~    since the click event.~
    +                                       player.y + player.tile_size.half - 10,
    +** Processing line: ~                                       40, 20]~
     - Inside source: true
     *** True Line Result
    -    since the click event.
    -** Processing line: ~~
    +                                       40, 20]
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +      else
    +** Processing line: ~        player.slash_collision_rect = [player.x - 32 - 8,~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +        player.slash_collision_rect = [player.x - 32 - 8,
    +** Processing line: ~                                       player.y + player.tile_size.half - 10,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # To determine whether a point is in a rect~
    +                                       player.y + player.tile_size.half - 10,
    +** Processing line: ~                                       40, 20]~
     - Inside source: true
     *** True Line Result
    -  # To determine whether a point is in a rect
    -** Processing line: ~  # Use point.inside_rect? rect~
    +                                       40, 20]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  # Use point.inside_rect? rect
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This is useful to determine if a click occurred in a rect~
    +** Processing line: ~      # recalc sword's slash state~
     - Inside source: true
     *** True Line Result
    -  # This is useful to determine if a click occurred in a rect
    +      # recalc sword's slash state
    +** Processing line: ~      player.slash_at = nil if slash_complete?~
    +- Inside source: true
    +*** True Line Result
    +      player.slash_at = nil if slash_complete?
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~      # determine collision if the sword is at it's point of damaging~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."~
    +      # determine collision if the sword is at it's point of damaging
    +** Processing line: ~      return unless slash_can_damage?~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to determing if a click happened inside a rectangle."
    +      return unless slash_can_damage?
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    x = 460~
    -- Inside source: true
    -*** True Line Result
    -    x = 460
    -** Processing line: ~~
    +** Processing line: ~      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")~
    +      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    box = [785, 370, 50, 50, 0, 0, 170]~
    +** Processing line: ~    def slash_complete?~
     - Inside source: true
     *** True Line Result
    -    box = [785, 370, 50, 50, 0, 0, 170]
    -** Processing line: ~    args.outputs.borders << box~
    +    def slash_complete?
    +** Processing line: ~      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << box
    +      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Saves the most recent click into args.state~
    +** Processing line: ~    def slash_can_damage?~
     - Inside source: true
     *** True Line Result
    -    # Saves the most recent click into args.state
    -** Processing line: ~    # Unlike the other components of args,~
    +    def slash_can_damage?
    +** Processing line: ~      # damage occurs half way into the slash animation~
     - Inside source: true
     *** True Line Result
    -    # Unlike the other components of args,
    -** Processing line: ~    # args.state does not reset every tick.~
    +      # damage occurs half way into the slash animation
    +** Processing line: ~      return false if slash_complete?~
     - Inside source: true
     *** True Line Result
    -    # args.state does not reset every tick.
    -** Processing line: ~    if args.inputs.mouse.click~
    +      return false if slash_complete?
    +** Processing line: ~      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click
    -** Processing line: ~      args.state.last_mouse_click = args.inputs.mouse.click~
    +      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count
    +** Processing line: ~      return true~
     - Inside source: true
     *** True Line Result
    -      args.state.last_mouse_click = args.inputs.mouse.click
    +      return true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -18328,146 +18751,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.last_mouse_click~
    -- Inside source: true
    -*** True Line Result
    -    if args.state.last_mouse_click
    -** Processing line: ~      if args.state.last_mouse_click.point.inside_rect? box~
    -- Inside source: true
    -*** True Line Result
    -      if args.state.last_mouse_click.point.inside_rect? box
    -** Processing line: ~        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")~
    -- Inside source: true
    -*** True Line Result
    -        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *inside* the box.")
    -** Processing line: ~      else~
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")~
    +    def calc
    +** Processing line: ~      # generate an enemy if there aren't any on the screen~
     - Inside source: true
     *** True Line Result
    -        args.outputs.labels << small_label(args, x, 16, "Mouse click happened *outside* the box.")
    -** Processing line: ~      end~
    +      # generate an enemy if there aren't any on the screen
    +** Processing line: ~      add_enemy if state.enemies.length == 0~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    else~
    +      add_enemy if state.enemies.length == 0
    +** Processing line: ~      calc_movement~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")~
    +      calc_movement
    +** Processing line: ~      calc_slash~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 16, "Mouse click has not occurred yet.")
    +      calc_slash
     ** 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 small_label args, x, row, message~
    +** Processing line: ~    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past~
     - Inside source: true
     *** True Line Result
    -  def small_label args, x, row, message
    -** Processing line: ~    [x, row_to_px(args, row), message, small_font]~
    +    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -    [x, row_to_px(args, row), message, small_font]
    -** Processing line: ~  end~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      defaults
    +** Processing line: ~      render_enemies~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def small_font~
    +      render_enemies
    +** Processing line: ~      render_player~
     - Inside source: true
     *** True Line Result
    -  def small_font
    -** Processing line: ~    [-2, 0, 0, 0, 0, 255]~
    +      render_player
    +** Processing line: ~      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]~
     - Inside source: true
     *** True Line Result
    -    [-2, 0, 0, 0, 0, 255]
    -** Processing line: ~  end~
    +      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]
    +** Processing line: ~      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]
    +** Processing line: ~      render_debug_layer~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def row_to_px args, row_number~
    +      render_debug_layer
    +** Processing line: ~      input~
     - Inside source: true
     *** True Line Result
    -  def row_to_px args, row_number
    -** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
    +      input
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    -** Processing line: ~  end~
    +      calc
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    -- Inside source: true
    -*** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    -- Inside source: true
    -*** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +** Processing line: ~    def player~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +    def player
    +** Processing line: ~      state.player~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      state.player
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +
    +** Processing line: ~  $game = Game.new~
     - Inside source: true
     *** True Line Result
    -    end
    +  $game = Game.new
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +  def tick args
    +** Processing line: ~    $game.args = args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +    $game.args = args
    +** Processing line: ~    $game.tick~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    $game.tick
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -18476,6 +18875,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~  $gtk.reset~
    +- Inside source: true
    +*** True Line Result
    +  $gtk.reset
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
     ** Processing line: ~#+end_src~
     - Line was identified as the end of a code block.
     *** True Line Result
    @@ -18484,122 +18891,154 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Input Basics - Mouse Rect To Rect - main.rb~
    +** Processing line: ~*** Rendering Sprites - Color And Rotation - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Input Basics - Mouse Rect To Rect - main.rb
    +*** Rendering Sprites - Color And Rotation - 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/02_input_basics/04_mouse_rect_to_rect/app/main.rb~
    +** Processing line: ~  # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/04_mouse_rect_to_rect/app/main.rb
    +  # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb
     ** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
       =begin
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +- Inside source: true
    +*** True Line Result
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  APIs that haven't been encountered in a previous sample apps:~
    +** Processing line: ~   - merge: Returns a hash containing the contents of two original hashes.~
     - Inside source: true
     *** True Line Result
    -  APIs that haven't been encountered in a previous sample apps:
    +   - merge: Returns a hash containing the contents of two original hashes.
    +** Processing line: ~     Merge does not allow duplicate keys, so the value of a repeated key~
    +- Inside source: true
    +*** True Line Result
    +     Merge does not allow duplicate keys, so the value of a repeated key
    +** Processing line: ~     will be overwritten.~
    +- Inside source: true
    +*** True Line Result
    +     will be overwritten.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  - args.outputs.borders: An array. Values in this array will be rendered as~
    +** Processing line: ~     For example, if we had two hashes~
     - Inside source: true
     *** True Line Result
    -  - args.outputs.borders: An array. Values in this array will be rendered as
    -** Processing line: ~    unfilled rectangles on the screen.~
    +     For example, if we had two hashes
    +** Processing line: ~     h1 = { "a" => 1, "b" => 2}~
     - Inside source: true
     *** True Line Result
    -    unfilled rectangles on the screen.
    -** Processing line: ~  - ARRAY#intersect_rect?: An array with at least four values is~
    +     h1 = { "a" => 1, "b" => 2}
    +** Processing line: ~     h2 = { "b" => 3, "c" => 3}~
     - Inside source: true
     *** True Line Result
    -  - ARRAY#intersect_rect?: An array with at least four values is
    -** Processing line: ~    considered a rect. The intersect_rect? function returns true~
    +     h2 = { "b" => 3, "c" => 3}
    +** Processing line: ~     and we called the command~
     - Inside source: true
     *** True Line Result
    -    considered a rect. The intersect_rect? function returns true
    -** Processing line: ~    or false depending on if the two rectangles intersect.~
    +     and we called the command
    +** Processing line: ~     h1.merge(h2)~
     - Inside source: true
     *** True Line Result
    -    or false depending on if the two rectangles intersect.
    +     h1.merge(h2)
    +** Processing line: ~     the result would the following hash~
    +- Inside source: true
    +*** True Line Result
    +     the result would the following hash
    +** Processing line: ~     { "a" => 1, "b" => 3, "c" => 3}.~
    +- Inside source: true
    +*** True Line Result
    +     { "a" => 1, "b" => 3, "c" => 3}.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    ```~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~    # Rect One: x: 100, y: 100, w: 100, h: 100~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Rect One: x: 100, y: 100, w: 100, h: 100
    -** Processing line: ~    # Rect Two: x: 0, y: 0, w: 500, h: 500~
    +
    +** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
     - Inside source: true
     *** True Line Result
    -    # Rect Two: x: 0, y: 0, w: 500, h: 500
    -** Processing line: ~    # Result:   true~
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +** Processing line: ~     using their keys.~
     - Inside source: true
     *** True Line Result
    -    # Result:   true
    +     using their keys.
    +** Processing line: ~     In this sample app, we're using a hash to create a sprite.~
    +- Inside source: true
    +*** True Line Result
    +     In this sample app, we're using a hash to create a sprite.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]~
    +** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
     - Inside source: true
     *** True Line Result
    -    [100, 100, 100, 100].intersect_rect? [0, 0, 500, 500]
    -** Processing line: ~    ```~
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~~
    +     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +** Processing line: ~     Before continuing with this sample app, it is HIGHLY recommended that you look~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    ```~
    +     Before continuing with this sample app, it is HIGHLY recommended that you look
    +** Processing line: ~     at mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -    ```
    -** Processing line: ~    # Rect One: x: 100, y: 100, w: 10, h: 10~
    +     at mygame/documentation/05-sprites.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Rect One: x: 100, y: 100, w: 10, h: 10
    -** Processing line: ~    # Rect Two: x: 500, y: 500, w: 10, h: 10~
    +
    +** Processing line: ~   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.~
     - Inside source: true
     *** True Line Result
    -    # Rect Two: x: 500, y: 500, w: 10, h: 10
    -** Processing line: ~    # Result:   false~
    +   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.
    +** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
     - Inside source: true
     *** True Line Result
    -    # Result:   false
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]~
    +** Processing line: ~   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.~
     - Inside source: true
     *** True Line Result
    -    [100, 100, 10, 10].intersect_rect? [500, 500, 10, 10]
    -** Processing line: ~    ```~
    +   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.
    +** Processing line: ~     For more information about the controller, go to mygame/documentation/08-controllers.md.~
     - Inside source: true
     *** True Line Result
    -    ```
    +     For more information about the controller, go to mygame/documentation/08-controllers.md.
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~   - num1.lesser(num2): Finds the lower value of the given options.~
    +- Inside source: true
    +*** True Line Result
    +   - num1.lesser(num2): Finds the lower value of the given options.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -18612,690 +19051,630 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Similarly, whether rects intersect can be found through~
    +** Processing line: ~  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,~
     - Inside source: true
     *** True Line Result
    -  # Similarly, whether rects intersect can be found through
    -** Processing line: ~  # rect1.intersect_rect? rect2~
    +  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,
    +** Processing line: ~  # and also can be moved in different directions through keyboard input from the user.~
     - Inside source: true
     *** True Line Result
    -  # rect1.intersect_rect? rect2
    +  # and also can be moved in different directions through keyboard input from the user.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~  # Calls the methods necessary for the game to run successfully.~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."~
    +  # Calls the methods necessary for the game to run successfully.
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to determine if two rectangles intersect."
    -** Processing line: ~    x = 460~
    +  def tick args
    +** Processing line: ~    default args~
     - Inside source: true
     *** True Line Result
    -    x = 460
    -** Processing line: ~~
    +    default args
    +** Processing line: ~    render args.grid, args.outputs, args.state~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")~
    +    render args.grid, args.outputs, args.state
    +** Processing line: ~    calc args.state~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << small_label(args, x, 3, "Click anywhere on the screen")
    -** Processing line: ~    # red_box = [460, 250, 355, 90, 170, 0, 0]~
    +    calc args.state
    +** Processing line: ~    process_inputs args~
     - Inside source: true
     *** True Line Result
    -    # red_box = [460, 250, 355, 90, 170, 0, 0]
    -** Processing line: ~    # args.outputs.borders << red_box~
    +    process_inputs args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # args.outputs.borders << red_box
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # args.state.box_collision_one and args.state.box_collision_two~
    -- Inside source: true
    -*** True Line Result
    -    # args.state.box_collision_one and args.state.box_collision_two
    -** Processing line: ~    # Are given values of a solid when they should be rendered~
    +** Processing line: ~  # Sets default values for the car sprite~
     - Inside source: true
     *** True Line Result
    -    # Are given values of a solid when they should be rendered
    -** Processing line: ~    # They are stored in game so that they do not get reset every tick~
    +  # Sets default values for the car sprite
    +** Processing line: ~  # Initialization ||= only happens in the first frame~
     - Inside source: true
     *** True Line Result
    -    # They are stored in game so that they do not get reset every tick
    -** Processing line: ~    if args.inputs.mouse.click~
    +  # Initialization ||= only happens in the first frame
    +** Processing line: ~  def default args~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click
    -** Processing line: ~      if !args.state.box_collision_one~
    +  def default args
    +** Processing line: ~    args.state.sprite.width    = 19~
     - Inside source: true
     *** True Line Result
    -      if !args.state.box_collision_one
    -** Processing line: ~        args.state.box_collision_one = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 180, 0,   0, 180]~
    +    args.state.sprite.width    = 19
    +** Processing line: ~    args.state.sprite.height   = 10~
     - Inside source: true
     *** True Line Result
    -        args.state.box_collision_one = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 180, 0,   0, 180]
    -** Processing line: ~      elsif !args.state.box_collision_two~
    +    args.state.sprite.height   = 10
    +** Processing line: ~    args.state.sprite.scale    = 4~
     - Inside source: true
     *** True Line Result
    -      elsif !args.state.box_collision_two
    -** Processing line: ~        args.state.box_collision_two = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125,   0, 0, 180, 180]~
    +    args.state.sprite.scale    = 4
    +** Processing line: ~    args.state.max_speed       = 5~
     - Inside source: true
     *** True Line Result
    -        args.state.box_collision_two = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125,   0, 0, 180, 180]
    -** Processing line: ~      else~
    +    args.state.max_speed       = 5
    +** Processing line: ~    args.state.x             ||= 100~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        args.state.box_collision_one = nil~
    +    args.state.x             ||= 100
    +** Processing line: ~    args.state.y             ||= 100~
     - Inside source: true
     *** True Line Result
    -        args.state.box_collision_one = nil
    -** Processing line: ~        args.state.box_collision_two = nil~
    +    args.state.y             ||= 100
    +** Processing line: ~    args.state.speed         ||= 1~
     - Inside source: true
     *** True Line Result
    -        args.state.box_collision_two = nil
    -** Processing line: ~      end~
    +    args.state.speed         ||= 1
    +** Processing line: ~    args.state.angle         ||= 0~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    args.state.angle         ||= 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.box_collision_one~
    +** Processing line: ~  # Outputs sprite onto screen~
     - Inside source: true
     *** True Line Result
    -    if args.state.box_collision_one
    -** Processing line: ~      args.outputs.solids << args.state.box_collision_one~
    +  # Outputs sprite onto screen
    +** Processing line: ~  def render grid, outputs, state~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << args.state.box_collision_one
    -** Processing line: ~    end~
    +  def render grid, outputs, state
    +** Processing line: ~    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background
    +** Processing line: ~    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.state.box_collision_two~
    +    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite
    +** Processing line: ~    'sprites/86.png', # image path of car~
     - Inside source: true
     *** True Line Result
    -    if args.state.box_collision_two
    -** Processing line: ~      args.outputs.solids << args.state.box_collision_two~
    +    'sprites/86.png', # image path of car
    +** Processing line: ~    state.angle,~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << args.state.box_collision_two
    -** Processing line: ~    end~
    +    state.angle,
    +** Processing line: ~    opacity, # transparency~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    opacity, # transparency
    +** Processing line: ~    saturation,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.state.box_collision_one && args.state.box_collision_two~
    +    saturation,
    +** Processing line: ~    source_rect(state), # sprite sub division/tile (tile x, y, w, h)~
     - Inside source: true
     *** True Line Result
    -    if args.state.box_collision_one && args.state.box_collision_two
    -** Processing line: ~      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two~
    +    source_rect(state), # sprite sub division/tile (tile x, y, w, h)
    +** Processing line: ~    false, false,  # don't flip sprites~
     - Inside source: true
     *** True Line Result
    -      if args.state.box_collision_one.intersect_rect? args.state.box_collision_two
    -** Processing line: ~        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')~
    +    false, false,  # don't flip sprites
    +** Processing line: ~    rotation_anchor]~
     - Inside source: true
     *** True Line Result
    -        args.outputs.labels << small_label(args, x, 4, 'The boxes intersect.')
    -** Processing line: ~      else~
    +    rotation_anchor]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')~
    +
    +** Processing line: ~    # also look at the create_sprite helper method~
     - Inside source: true
     *** True Line Result
    -        args.outputs.labels << small_label(args, x, 4, 'The boxes do not intersect.')
    -** Processing line: ~      end~
    +    # also look at the create_sprite helper method
    +** Processing line: ~    #~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    else~
    +    #
    +** Processing line: ~    # For example:~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.labels << small_label(args, x, 4, '--')~
    +    # For example:
    +** Processing line: ~    #~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << small_label(args, x, 4, '--')
    -** Processing line: ~    end~
    +    #
    +** Processing line: ~    # dest   = destination_rect(state)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +    # dest   = destination_rect(state)
    +** Processing line: ~    # source = source_rect(state),~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    # source = source_rect(state),
    +** Processing line: ~    # outputs.sprites << create_sprite(~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def small_label args, x, row, message~
    +    # outputs.sprites << create_sprite(
    +** Processing line: ~    #   'sprites/86.png',~
     - Inside source: true
     *** True Line Result
    -  def small_label args, x, row, message
    -** Processing line: ~    [x, row_to_px(args, row), message, small_font]~
    +    #   'sprites/86.png',
    +** Processing line: ~    #   x: dest.x,~
     - Inside source: true
     *** True Line Result
    -    [x, row_to_px(args, row), message, small_font]
    -** Processing line: ~  end~
    +    #   x: dest.x,
    +** Processing line: ~    #   y: dest.y,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    #   y: dest.y,
    +** Processing line: ~    #   w: dest.w,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def small_font~
    +    #   w: dest.w,
    +** Processing line: ~    #   h: dest.h,~
     - Inside source: true
     *** True Line Result
    -  def small_font
    -** Processing line: ~    [-2, 0, 0, 0, 0, 255]~
    +    #   h: dest.h,
    +** Processing line: ~    #   angle: state.angle,~
     - Inside source: true
     *** True Line Result
    -    [-2, 0, 0, 0, 0, 255]
    -** Processing line: ~  end~
    +    #   angle: state.angle,
    +** Processing line: ~    #   source_x: source.x,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    #   source_x: source.x,
    +** Processing line: ~    #   source_y: source.y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def row_to_px args, row_number~
    +    #   source_y: source.y,
    +** Processing line: ~    #   source_w: source.w,~
     - Inside source: true
     *** True Line Result
    -  def row_to_px args, row_number
    -** Processing line: ~    args.grid.top.shift_down(5).shift_down(20 * row_number)~
    +    #   source_w: source.w,
    +** Processing line: ~    #   source_h: source.h,~
     - Inside source: true
     *** True Line Result
    -    args.grid.top.shift_down(5).shift_down(20 * row_number)
    -** Processing line: ~  end~
    +    #   source_h: source.h,
    +** Processing line: ~    #   flip_h: false,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    #   flip_h: false,
    +** Processing line: ~    #   flip_v: false,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +    #   flip_v: false,
    +** Processing line: ~    #   rotation_anchor_x: 0.7,~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    #   rotation_anchor_x: 0.7,
    +** Processing line: ~    #   rotation_anchor_y: 0.5~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +    #   rotation_anchor_y: 0.5
    +** Processing line: ~    # )~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +    # )
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +
    +** Processing line: ~  # Creates sprite by setting values inside of a hash~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +  # Creates sprite by setting values inside of a hash
    +** Processing line: ~  def create_sprite path, options = {}~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +  def create_sprite path, options = {}
    +** Processing line: ~    options = {~
     - Inside source: true
     *** True Line Result
    -    end
    +    options = {
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~      # dest x, y, w, h~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +      # dest x, y, w, h
    +** Processing line: ~      x: 0,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      x: 0,
    +** Processing line: ~      y: 0,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      y: 0,
    +** Processing line: ~      w: 100,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      w: 100,
    +** Processing line: ~      h: 100,~
     - 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
    +      h: 100,
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Input Basics - Controller - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Input Basics - Controller - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +- Inside source: true
     *** True Line Result
     
    -*** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/02_input_basics/05_controller/app/main.rb~
    +** Processing line: ~      # angle, rotation~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/05_controller/app/main.rb
    -** Processing line: ~  =begin~
    +      # angle, rotation
    +** Processing line: ~      angle: 0,~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      angle: 0,
    +** Processing line: ~      rotation_anchor_x: 0.5,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      rotation_anchor_x: 0.5,
    +** Processing line: ~      rotation_anchor_y: 0.5,~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +      rotation_anchor_y: 0.5,
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key~
    -- Inside source: true
    -*** True Line Result
    -   - args.inputs.controller_one.key_held.KEY: Will check to see if a specific key
    -** Processing line: ~     is being held down on the controller.~
    -- Inside source: true
    -*** True Line Result
    -     is being held down on the controller.
    -** Processing line: ~     If there is more than one controller being used, they can be differentiated by~
    -- Inside source: true
    -*** True Line Result
    -     If there is more than one controller being used, they can be differentiated by
    -** Processing line: ~     using names like controller_one and controller_two.~
    +** Processing line: ~      # color saturation (red, green, blue), transparency~
     - Inside source: true
     *** True Line Result
    -     using names like controller_one and controller_two.
    -** Processing line: ~~
    +      # color saturation (red, green, blue), transparency
    +** Processing line: ~      r: 255,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.~
    +      r: 255,
    +** Processing line: ~      g: 255,~
     - Inside source: true
     *** True Line Result
    -     For a full listing of buttons, take a look at mygame/documentation/08-controllers.md.
    -** Processing line: ~~
    +      g: 255,
    +** Processing line: ~      b: 255,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminder:~
    +      b: 255,
    +** Processing line: ~      a: 255,~
     - Inside source: true
     *** True Line Result
    -   Reminder:
    +      a: 255,
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.state.PROPERTY: The state property on args is a dynamic~
    +** Processing line: ~      # source x, y, width, height~
     - Inside source: true
     *** True Line Result
    -   - args.state.PROPERTY: The state property on args is a dynamic
    -** Processing line: ~     structure. You can define ANY property here with ANY type of~
    +      # source x, y, width, height
    +** Processing line: ~      source_x: 0,~
     - Inside source: true
     *** True Line Result
    -     structure. You can define ANY property here with ANY type of
    -** Processing line: ~     arbitrary nesting. Properties defined on args.state will be retained~
    +      source_x: 0,
    +** Processing line: ~      source_y: 0,~
     - Inside source: true
     *** True Line Result
    -     arbitrary nesting. Properties defined on args.state will be retained
    -** Processing line: ~     across frames. If you attempt to access a property that doesn't exist~
    +      source_y: 0,
    +** Processing line: ~      source_w: -1,~
     - Inside source: true
     *** True Line Result
    -     across frames. If you attempt to access a property that doesn't exist
    -** Processing line: ~     on args.state, it will simply return nil (no exception will be thrown).~
    +      source_w: -1,
    +** Processing line: ~      source_h: -1,~
     - Inside source: true
     *** True Line Result
    -     on args.state, it will simply return nil (no exception will be thrown).
    +      source_h: -1,
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.~
    -- Inside source: true
    -*** True Line Result
    -     In this sample app, args.state.BUTTONS is an array that stores the buttons of the controller.
    -** Processing line: ~     The parameters of a button are:~
    -- Inside source: true
    -*** True Line Result
    -     The parameters of a button are:
    -** Processing line: ~     1. the position (x, y)~
    +** Processing line: ~      # flip horiztonally, flip vertically~
     - Inside source: true
     *** True Line Result
    -     1. the position (x, y)
    -** Processing line: ~     2. the input key held on the controller~
    +      # flip horiztonally, flip vertically
    +** Processing line: ~      flip_h: false,~
     - Inside source: true
     *** True Line Result
    -     2. the input key held on the controller
    -** Processing line: ~     3. the text or name of the button~
    +      flip_h: false,
    +** Processing line: ~      flip_v: false,~
     - Inside source: true
     *** True Line Result
    -     3. the text or name of the button
    +      flip_v: false,
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~    }.merge options~
     - Inside source: true
     *** True Line Result
    -  =end
    +    }.merge options
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This sample app provides a visual demonstration of a standard controller, including~
    -- Inside source: true
    -*** True Line Result
    -  # This sample app provides a visual demonstration of a standard controller, including
    -** Processing line: ~  # the placement and function of all buttons.~
    -- Inside source: true
    -*** True Line Result
    -  # the placement and function of all buttons.
    -** Processing line: ~~
    +** Processing line: ~    [~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  class ControllerDemo~
    +    [
    +** Processing line: ~      options[:x], options[:y], options[:w], options[:h], # dest rect keys~
     - Inside source: true
     *** True Line Result
    -  class ControllerDemo
    -** Processing line: ~    attr_accessor :inputs, :state, :outputs~
    +      options[:x], options[:y], options[:w], options[:h], # dest rect keys
    +** Processing line: ~      path,~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :inputs, :state, :outputs
    -** Processing line: ~~
    +      path,
    +** Processing line: ~      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls the methods necessary for the app to run successfully.~
    +      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha
    +** Processing line: ~      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys~
     - Inside source: true
     *** True Line Result
    -    # Calls the methods necessary for the app to run successfully.
    -** Processing line: ~    def tick~
    +      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys
    +** Processing line: ~      options[:flip_h], options[:flip_v], # flip~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      process_inputs~
    +      options[:flip_h], options[:flip_v], # flip
    +** Processing line: ~      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor~
     - Inside source: true
     *** True Line Result
    -      process_inputs
    -** Processing line: ~      render~
    +      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor
    +** Processing line: ~    ] # hash keys contain corresponding values~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~    end~
    +    ] # hash keys contain corresponding values
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Starts with an empty collection of buttons.~
    +** Processing line: ~  # Calls the calc_pos and calc_wrap methods.~
     - Inside source: true
     *** True Line Result
    -    # Starts with an empty collection of buttons.
    -** Processing line: ~    # Adds buttons that are on the controller to the collection.~
    +  # Calls the calc_pos and calc_wrap methods.
    +** Processing line: ~  def calc state~
     - Inside source: true
     *** True Line Result
    -    # Adds buttons that are on the controller to the collection.
    -** Processing line: ~    def process_inputs~
    +  def calc state
    +** Processing line: ~    calc_pos state~
     - Inside source: true
     *** True Line Result
    -    def process_inputs
    -** Processing line: ~      state.buttons = []~
    +    calc_pos state
    +** Processing line: ~    calc_wrap state~
     - Inside source: true
     *** True Line Result
    -      state.buttons = []
    +    calc_wrap state
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.buttons << [100, 500, inputs.controller_one.key_held.l1, "L1"]~
    +** Processing line: ~  # Changes sprite's position on screen~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [100, 500, inputs.controller_one.key_held.l1, "L1"]
    -** Processing line: ~      state.buttons << [100, 600, inputs.controller_one.key_held.l2, "L2"]~
    +  # Changes sprite's position on screen
    +** Processing line: ~  # Vectors have magnitude and direction, so the incremented x and y values give the car direction~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [100, 600, inputs.controller_one.key_held.l2, "L2"]
    -** Processing line: ~~
    +  # Vectors have magnitude and direction, so the incremented x and y values give the car direction
    +** Processing line: ~  def calc_pos state~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      state.buttons << [1100, 500, inputs.controller_one.key_held.r1, "R1"]~
    +  def calc_pos state
    +** Processing line: ~    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [1100, 500, inputs.controller_one.key_held.r1, "R1"]
    -** Processing line: ~      state.buttons << [1100, 600, inputs.controller_one.key_held.r2, "R2"]~
    +    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed
    +** Processing line: ~    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [1100, 600, inputs.controller_one.key_held.r2, "R2"]
    -** Processing line: ~~
    +    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed
    +** Processing line: ~    state.speed *= 1.1 # scales speed up~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      state.buttons << [540, 450, inputs.controller_one.key_held.select, "Select"]~
    +    state.speed *= 1.1 # scales speed up
    +** Processing line: ~    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [540, 450, inputs.controller_one.key_held.select, "Select"]
    -** Processing line: ~      state.buttons << [660, 450, inputs.controller_one.key_held.start, "Start"]~
    +    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [660, 450, inputs.controller_one.key_held.start, "Start"]
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.buttons << [200, 300, inputs.controller_one.key_held.left, "Left"]~
    -- Inside source: true
    -*** True Line Result
    -      state.buttons << [200, 300, inputs.controller_one.key_held.left, "Left"]
    -** Processing line: ~      state.buttons << [300, 400, inputs.controller_one.key_held.up, "Up"]~
    +** Processing line: ~  # The screen's dimensions are 1280x720. If the car goes out of scope,~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [300, 400, inputs.controller_one.key_held.up, "Up"]
    -** Processing line: ~      state.buttons << [400, 300, inputs.controller_one.key_held.right, "Right"]~
    +  # The screen's dimensions are 1280x720. If the car goes out of scope,
    +** Processing line: ~  # it loops back around on the screen.~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [400, 300, inputs.controller_one.key_held.right, "Right"]
    -** Processing line: ~      state.buttons << [300, 200, inputs.controller_one.key_held.down, "Down"]~
    +  # it loops back around on the screen.
    +** Processing line: ~  def calc_wrap state~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [300, 200, inputs.controller_one.key_held.down, "Down"]
    +  def calc_wrap state
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.buttons << [800, 300, inputs.controller_one.key_held.x, "X"]~
    -- Inside source: true
    -*** True Line Result
    -      state.buttons << [800, 300, inputs.controller_one.key_held.x, "X"]
    -** Processing line: ~      state.buttons << [900, 400, inputs.controller_one.key_held.y, "Y"]~
    +** Processing line: ~    # car returns to left side of screen if it disappears on right side of screen~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [900, 400, inputs.controller_one.key_held.y, "Y"]
    -** Processing line: ~      state.buttons << [1000, 300, inputs.controller_one.key_held.a, "A"]~
    +    # car returns to left side of screen if it disappears on right side of screen
    +** Processing line: ~    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [1000, 300, inputs.controller_one.key_held.a, "A"]
    -** Processing line: ~      state.buttons << [900, 200, inputs.controller_one.key_held.b, "B"]~
    +    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger
    +** Processing line: ~    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280~
     - Inside source: true
     *** True Line Result
    -      state.buttons << [900, 200, inputs.controller_one.key_held.b, "B"]
    +    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.buttons << [450 + inputs.controller_one.left_analog_x_perc * 100,~
    -- Inside source: true
    -*** True Line Result
    -      state.buttons << [450 + inputs.controller_one.left_analog_x_perc * 100,
    -** Processing line: ~                        100 + inputs.controller_one.left_analog_y_perc * 100,~
    -- Inside source: true
    -*** True Line Result
    -                        100 + inputs.controller_one.left_analog_y_perc * 100,
    -** Processing line: ~                        inputs.controller_one.key_held.l3,~
    +** Processing line: ~    # car wraps around to right side of screen if it disappears on the left side~
     - Inside source: true
     *** True Line Result
    -                        inputs.controller_one.key_held.l3,
    -** Processing line: ~                        "L3"]~
    +    # car wraps around to right side of screen if it disappears on the left side
    +** Processing line: ~    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0~
     - Inside source: true
     *** True Line Result
    -                        "L3"]
    +    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.buttons << [750 + inputs.controller_one.right_analog_x_perc * 100,~
    -- Inside source: true
    -*** True Line Result
    -      state.buttons << [750 + inputs.controller_one.right_analog_x_perc * 100,
    -** Processing line: ~                        100 + inputs.controller_one.right_analog_y_perc * 100,~
    -- Inside source: true
    -*** True Line Result
    -                        100 + inputs.controller_one.right_analog_y_perc * 100,
    -** Processing line: ~                        inputs.controller_one.key_held.r3,~
    +** Processing line: ~    # car wraps around to bottom of screen if it disappears at the top of the screen~
     - Inside source: true
     *** True Line Result
    -                        inputs.controller_one.key_held.r3,
    -** Processing line: ~                        "R3"]~
    +    # car wraps around to bottom of screen if it disappears at the top of the screen
    +** Processing line: ~    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)~
     - Inside source: true
     *** True Line Result
    -                        "R3"]
    -** Processing line: ~    end~
    +    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)
    +** Processing line: ~    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope~
     - Inside source: true
     *** True Line Result
    -    end
    +    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Gives each button a square shape.~
    +** Processing line: ~    # car wraps around to top of screen if it disappears at the bottom of the screen~
     - Inside source: true
     *** True Line Result
    -    # Gives each button a square shape.
    -** Processing line: ~    # If the button is being pressed or held (which means it is considered active),~
    +    # car wraps around to top of screen if it disappears at the bottom of the screen
    +** Processing line: ~    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0~
     - Inside source: true
     *** True Line Result
    -    # If the button is being pressed or held (which means it is considered active),
    -** Processing line: ~    # the square is filled in. Otherwise, the button simply has a border.~
    +    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # the square is filled in. Otherwise, the button simply has a border.
    -** Processing line: ~    def render~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      state.buttons.each do |x, y, active, text|~
    +
    +** Processing line: ~  # Changes angle of sprite based on user input from keyboard or controller~
     - Inside source: true
     *** True Line Result
    -      state.buttons.each do |x, y, active, text|
    -** Processing line: ~        rect = [x, y, 75, 75]~
    +  # Changes angle of sprite based on user input from keyboard or controller
    +** Processing line: ~  def process_inputs args~
     - Inside source: true
     *** True Line Result
    -        rect = [x, y, 75, 75]
    +  def process_inputs args
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        if active # if button is pressed~
    +** Processing line: ~    # NOTE: increasing the angle doesn't mean that the car will continue to go~
     - Inside source: true
     *** True Line Result
    -        if active # if button is pressed
    -** Processing line: ~          outputs.solids << rect # rect is output as solid (filled in)~
    +    # NOTE: increasing the angle doesn't mean that the car will continue to go
    +** Processing line: ~    # in a specific direction. The angle is increasing, which means that if the~
     - Inside source: true
     *** True Line Result
    -          outputs.solids << rect # rect is output as solid (filled in)
    -** Processing line: ~        else~
    +    # in a specific direction. The angle is increasing, which means that if the
    +** Processing line: ~    # left key was kept in the "down" state, the change in the angle would cause~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          outputs.borders << rect # otherwise, output as border~
    +    # left key was kept in the "down" state, the change in the angle would cause
    +** Processing line: ~    # the car to go in a counter-clockwise direction and form a circle (360 degrees)~
     - Inside source: true
     *** True Line Result
    -          outputs.borders << rect # otherwise, output as border
    -** Processing line: ~        end~
    +    # the car to go in a counter-clockwise direction and form a circle (360 degrees)
    +** Processing line: ~    if args.inputs.keyboard.key_held.left # if left key is pressed~
     - Inside source: true
     *** True Line Result
    -        end
    +    if args.inputs.keyboard.key_held.left # if left key is pressed
    +** Processing line: ~      args.state.angle += 2 # car's angle is incremented by 2~
    +- Inside source: true
    +*** True Line Result
    +      args.state.angle += 2 # car's angle is incremented by 2
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # Outputs the text of each button using labels.~
    +** Processing line: ~    # The same applies to decreasing the angle. If the right key was kept in the~
     - Inside source: true
     *** True Line Result
    -        # Outputs the text of each button using labels.
    -** Processing line: ~        outputs.labels << [x, y + 95, text] # add 95 to place label above button~
    +    # The same applies to decreasing the angle. If the right key was kept in the
    +** Processing line: ~    # "down" state, the decreasing angle would cause the car to go in a clockwise~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << [x, y + 95, text] # add 95 to place label above button
    -** Processing line: ~      end~
    +    # "down" state, the decreasing angle would cause the car to go in a clockwise
    +** Processing line: ~    # direction and form a circle (360 degrees)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    # direction and form a circle (360 degrees)
    +** Processing line: ~    elsif args.inputs.keyboard.key_held.right # if right key is pressed~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << [10, 60, "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)"]~
    +    elsif args.inputs.keyboard.key_held.right # if right key is pressed
    +** Processing line: ~      args.state.angle -= 2 # car's angle is decremented by 2~
    +- Inside source: true
    +*** True Line Result
    +      args.state.angle -= 2 # car's angle is decremented by 2
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 60, "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)"]
    -** Processing line: ~      outputs.labels << [10, 30, "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)"]~
    +
    +** Processing line: ~    # Input from a controller can also change the angle of the car~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 30, "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)"]
    -** Processing line: ~      outputs.labels << [900, 60, "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)"]~
    +    # Input from a controller can also change the angle of the car
    +** Processing line: ~    elsif args.inputs.controller_one.left_analog_x_perc != 0~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [900, 60, "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)"]
    -** Processing line: ~      outputs.labels << [900, 30, "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)"]~
    +    elsif args.inputs.controller_one.left_analog_x_perc != 0
    +** Processing line: ~      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [900, 30, "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)"]
    +      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -19308,38 +19687,50 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $controller_demo = ControllerDemo.new~
    +** Processing line: ~  # A sprite's center of rotation can be altered~
     - Inside source: true
     *** True Line Result
    -  $controller_demo = ControllerDemo.new
    -** Processing line: ~~
    +  # A sprite's center of rotation can be altered
    +** Processing line: ~  # Increasing either of these numbers would dramatically increase the~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +  # Increasing either of these numbers would dramatically increase the
    +** Processing line: ~  # car's drift when it turns!~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."~
    +  # car's drift when it turns!
    +** Processing line: ~  def rotation_anchor~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how controller input is handled. You'll need to connect a USB controller."
    -** Processing line: ~    $controller_demo.inputs = args.inputs~
    +  def rotation_anchor
    +** Processing line: ~    [0.7, 0.5]~
     - Inside source: true
     *** True Line Result
    -    $controller_demo.inputs = args.inputs
    -** Processing line: ~    $controller_demo.state = args.state~
    +    [0.7, 0.5]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    $controller_demo.state = args.state
    -** Processing line: ~    $controller_demo.outputs = args.outputs~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    $controller_demo.outputs = args.outputs
    -** Processing line: ~    $controller_demo.tick~
    +
    +** Processing line: ~  # Sets opacity value of sprite to 255 so that it is not transparent at all~
     - Inside source: true
     *** True Line Result
    -    $controller_demo.tick
    +  # Sets opacity value of sprite to 255 so that it is not transparent at all
    +** Processing line: ~  # Change it to 0 and you won't be able to see the car sprite on the screen~
    +- Inside source: true
    +*** True Line Result
    +  # Change it to 0 and you won't be able to see the car sprite on the screen
    +** Processing line: ~  def opacity~
    +- Inside source: true
    +*** True Line Result
    +  def opacity
    +** Processing line: ~    255~
    +- Inside source: true
    +*** True Line Result
    +    255
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -19348,18 +19739,18 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Resets the app.~
    +** Processing line: ~  # Sets the color of the sprite to white.~
     - Inside source: true
     *** True Line Result
    -  # Resets the app.
    -** Processing line: ~  def r~
    +  # Sets the color of the sprite to white.
    +** Processing line: ~  def saturation~
     - Inside source: true
     *** True Line Result
    -  def r
    -** Processing line: ~    $gtk.reset~
    +  def saturation
    +** Processing line: ~    [255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -    $gtk.reset
    +    [255, 255, 255]
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -19368,54 +19759,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 tick_instructions args, text, y = 715~
    +** Processing line: ~  # Sets definition of destination_rect (used to define the car sprite)~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +  # Sets definition of destination_rect (used to define the car sprite)
    +** Processing line: ~  def destination_rect state~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +  def destination_rect state
    +** Processing line: ~    [state.x, state.y,~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +    [state.x, state.y,
    +** Processing line: ~    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size
    +** Processing line: ~    state.sprite.height * state.sprite.scale]~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +    state.sprite.height * state.sprite.scale]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +
    +** Processing line: ~  # Portion of a sprite (a tile)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  # Portion of a sprite (a tile)
    +** Processing line: ~  # Sub division of sprite is denoted as a rectangle directly related to original size of .png~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +  # Sub division of sprite is denoted as a rectangle directly related to original size of .png
    +** Processing line: ~  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)
    +** Processing line: ~  def source_rect state~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +  def source_rect state
    +** Processing line: ~    [0, 0, state.sprite.width, state.sprite.height]~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    [0, 0, state.sprite.width, state.sprite.height]
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -19432,358 +19823,354 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Input Basics - Touch - main.rb~
    +** Processing line: ~*** Physics And Collisions - Simple - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Input Basics - Touch - main.rb
    +*** Physics And Collisions - Simple - 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/02_input_basics/06_touch/app/main.rb~
    +** Processing line: ~  # ./samples/04_physics_and_collisions/01_simple/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/02_input_basics/06_touch/app/main.rb
    -** Processing line: ~  def tick args~
    +  # ./samples/04_physics_and_collisions/01_simple/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.outputs.background_color = [ 0, 0, 0 ]~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [ 0, 0, 0 ]
    -** Processing line: ~    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [640, 700, "Touch your screen.", 5, 1, 255, 255, 255].label
    +   Reminders:
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
    +- Inside source: true
    +*** True Line Result
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # If you don't want to get fancy, you can just look for finger_one~
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -    # If you don't want to get fancy, you can just look for finger_one
    -** Processing line: ~    #  (and _two, if you like), which are assigned in the order new touches hit~
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -    #  (and _two, if you like), which are assigned in the order new touches hit
    -** Processing line: ~    #  the screen. If not nil, they are touching right now, and are just~
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #  the screen. If not nil, they are touching right now, and are just
    -** Processing line: ~    #  references to specific items in the args.input.touch hash.~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -    #  references to specific items in the args.input.touch hash.
    -** Processing line: ~    # If finger_one lifts off, it will become nil, but finger_two, if it was~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # If finger_one lifts off, it will become nil, but finger_two, if it was
    -** Processing line: ~    #  touching, remains until it also lifts off. When all fingers lift off, the~
    +
    +** Processing line: ~  # This sample app shows collisions between two boxes.~
     - Inside source: true
     *** True Line Result
    -    #  touching, remains until it also lifts off. When all fingers lift off, the
    -** Processing line: ~    #  the next new touch will be finger_one again, but until then, new touches~
    +  # This sample app shows collisions between two boxes.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #  the next new touch will be finger_one again, but until then, new touches
    -** Processing line: ~    #  don't fill in earlier slots.~
    +
    +** Processing line: ~  # Runs methods needed for game to run properly.~
     - Inside source: true
     *** True Line Result
    -    #  don't fill in earlier slots.
    -** Processing line: ~    if !args.inputs.finger_one.nil?~
    +  # Runs methods needed for game to run properly.
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    if !args.inputs.finger_one.nil?
    -** Processing line: ~      args.outputs.primitives << [640, 650, "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).", 5, 1, 255, 255, 255].label~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how to move a square over time and determine collision."~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [640, 650, "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).", 5, 1, 255, 255, 255].label
    -** Processing line: ~    end~
    +    tick_instructions args, "Sample app shows how to move a square over time and determine collision."
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    if !args.inputs.finger_two.nil?~
    +    defaults args
    +** Processing line: ~    render args~
     - Inside source: true
     *** True Line Result
    -    if !args.inputs.finger_two.nil?
    -** Processing line: ~      args.outputs.primitives << [640, 600, "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).", 5, 1, 255, 255, 255].label~
    +    render args
    +** Processing line: ~    calc args~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [640, 600, "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).", 5, 1, 255, 255, 255].label
    -** Processing line: ~    end~
    +    calc args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Here's the more flexible interface: this will report as many simultaneous~
    +** Processing line: ~  # Sets default values.~
     - Inside source: true
     *** True Line Result
    -    # Here's the more flexible interface: this will report as many simultaneous
    -** Processing line: ~    #  touches as the system can handle, but it's a little more effort to track~
    +  # Sets default values.
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -    #  touches as the system can handle, but it's a little more effort to track
    -** Processing line: ~    #  them. Each item in the args.input.touch hash has a unique key (an~
    +  def defaults args
    +** Processing line: ~    # These values represent the moving box.~
     - Inside source: true
     *** True Line Result
    -    #  them. Each item in the args.input.touch hash has a unique key (an
    -** Processing line: ~    #  incrementing integer) that exists until the finger lifts off. You can~
    +    # These values represent the moving box.
    +** Processing line: ~    args.state.moving_box_speed   = 10~
     - Inside source: true
     *** True Line Result
    -    #  incrementing integer) that exists until the finger lifts off. You can
    -** Processing line: ~    #  tell which order the touches happened globally by the key value, or~
    +    args.state.moving_box_speed   = 10
    +** Processing line: ~    args.state.moving_box_size    = 100~
     - Inside source: true
     *** True Line Result
    -    #  tell which order the touches happened globally by the key value, or
    -** Processing line: ~    #  by the touch[id].touch_order field, which resets to zero each time all~
    +    args.state.moving_box_size    = 100
    +** Processing line: ~    args.state.moving_box_dx    ||=  1~
     - Inside source: true
     *** True Line Result
    -    #  by the touch[id].touch_order field, which resets to zero each time all
    -** Processing line: ~    #  touches have lifted.~
    +    args.state.moving_box_dx    ||=  1
    +** Processing line: ~    args.state.moving_box_dy    ||=  1~
     - Inside source: true
     *** True Line Result
    -    #  touches have lifted.
    +    args.state.moving_box_dy    ||=  1
    +** Processing line: ~    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height~
    +- Inside source: true
    +*** True Line Result
    +    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.colors ||= [~
    +** Processing line: ~    # These values represent the center box.~
     - Inside source: true
     *** True Line Result
    -    args.state.colors ||= [
    -** Processing line: ~      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF~
    +    # These values represent the center box.
    +** Processing line: ~    args.state.center_box ||= [540, 260, 200, 200, 180]~
     - Inside source: true
     *** True Line Result
    -      0xFF0000, 0x00FF00, 0x1010FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF
    -** Processing line: ~    ]~
    +    args.state.center_box ||= [540, 260, 200, 200, 180]
    +** Processing line: ~    args.state.center_box_collision ||= false # initially no collision~
     - Inside source: true
     *** True Line Result
    -    ]
    +    args.state.center_box_collision ||= false # initially no collision
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    size = 100~
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -    size = 100
    -** Processing line: ~    args.inputs.touch.each { |k,v|~
    +  def render args
    +** Processing line: ~    # If the game state denotes that a collision has occured,~
     - Inside source: true
     *** True Line Result
    -    args.inputs.touch.each { |k,v|
    -** Processing line: ~      color = args.state.colors[v.touch_order % 7]~
    +    # If the game state denotes that a collision has occured,
    +** Processing line: ~    # render a solid square, otherwise render a border instead.~
     - Inside source: true
     *** True Line Result
    -      color = args.state.colors[v.touch_order % 7]
    -** Processing line: ~      r = (color & 0xFF0000) >> 16~
    +    # render a solid square, otherwise render a border instead.
    +** Processing line: ~    if args.state.center_box_collision~
     - Inside source: true
     *** True Line Result
    -      r = (color & 0xFF0000) >> 16
    -** Processing line: ~      g = (color & 0x00FF00) >> 8~
    +    if args.state.center_box_collision
    +** Processing line: ~      args.outputs.solids << args.state.center_box~
     - Inside source: true
     *** True Line Result
    -      g = (color & 0x00FF00) >> 8
    -** Processing line: ~      b = (color & 0x0000FF)~
    +      args.outputs.solids << args.state.center_box
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      b = (color & 0x0000FF)
    -** Processing line: ~      args.outputs.primitives << [v.x - (size / 2), v.y + (size / 2), size, size, r, g, b, 255].solid~
    +    else
    +** Processing line: ~      args.outputs.borders << args.state.center_box~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [v.x - (size / 2), v.y + (size / 2), size, size, r, g, b, 255].solid
    -** Processing line: ~      args.outputs.primitives << [v.x, v.y + size, k.to_s, 0, 1, 0, 0, 0].label~
    +      args.outputs.borders << args.state.center_box
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      args.outputs.primitives << [v.x, v.y + size, k.to_s, 0, 1, 0, 0, 0].label
    -** Processing line: ~    }~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    }
    -** Processing line: ~  end~
    +
    +** Processing line: ~    # Then render the moving box.~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    # Then render the moving box.
    +** Processing line: ~    args.outputs.solids << args.state.moving_box~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +    args.outputs.solids << args.state.moving_box
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +  end
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Rendering Sprites - Animation Using Separate Pngs - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Rendering Sprites - Animation Using Separate Pngs - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +- Inside source: true
     *** True Line Result
     
    -*** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb~
    +** Processing line: ~  # Generally in a pipeline for a game engine, you have rendering,~
     - Inside source: true
     *** True Line Result
    -  # ./samples/03_rendering_sprites/01_animation_using_separate_pngs/app/main.rb
    -** Processing line: ~  =begin~
    +  # Generally in a pipeline for a game engine, you have rendering,
    +** Processing line: ~  # game simulation (calculation), and input processing.~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +  # game simulation (calculation), and input processing.
    +** Processing line: ~  # This fuction represents the game simulation.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +  # This fuction represents the game simulation.
    +** Processing line: ~  def calc args~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +  def calc args
    +** Processing line: ~    position_moving_box args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
    +    position_moving_box args
    +** Processing line: ~    determine_collision_center_box args~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +    determine_collision_center_box args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     In this sample app, we're using string interpolation to iterate through images in the~
    +** Processing line: ~  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,~
     - Inside source: true
     *** True Line Result
    -     In this sample app, we're using string interpolation to iterate through images in the
    -** Processing line: ~     sprites folder using their image path names.~
    +  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,
    +** Processing line: ~  # and adding it to the current position.~
     - Inside source: true
     *** True Line Result
    -     sprites folder using their image path names.
    -** Processing line: ~~
    +  # and adding it to the current position.
    +** Processing line: ~  # dx and dy are positive if the box is moving right and up, respectively~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.~
    +  # dx and dy are positive if the box is moving right and up, respectively
    +** Processing line: ~  # dx and dy are negative if the box is moving left and down, respectively~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.sprites: An array. Values in this array generate sprites on the screen.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]~
    +  # dx and dy are negative if the box is moving left and down, respectively
    +** Processing line: ~  def position_moving_box args~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]
    -** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
    +  def position_moving_box args
    +** Processing line: ~    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed~
     - Inside source: true
     *** True Line Result
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed
    +** Processing line: ~    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed~
    +- Inside source: true
    +*** True Line Result
    +    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.labels: An array. Values in the array generate labels on the screen.~
    +** Processing line: ~    # 1280x720 are the virtual pixels you work with (essentially 720p).~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +    # 1280x720 are the virtual pixels you work with (essentially 720p).
    +** Processing line: ~    screen_width  = 1280~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +    screen_width  = 1280
    +** Processing line: ~    screen_height = 720~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +    screen_height = 720
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.~
    +** Processing line: ~    # Position of the box is denoted by the bottom left hand corner, in~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.keyboard.key_down.KEY: Determines if a key is in the down state, or pressed.
    -** Processing line: ~     Stores the frame that key was pressed on.~
    +    # Position of the box is denoted by the bottom left hand corner, in
    +** Processing line: ~    # that case, we have to subtract the width of the box so that it stays~
     - Inside source: true
     *** True Line Result
    -     Stores the frame that key was pressed on.
    -** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
    +    # that case, we have to subtract the width of the box so that it stays
    +** Processing line: ~    # in the scene (you can try deleting the subtraction to see how it~
     - Inside source: true
     *** True Line Result
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    -** Processing line: ~~
    +    # in the scene (you can try deleting the subtraction to see how it
    +** Processing line: ~    # impacts the box's movement).~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +    # impacts the box's movement).
    +** Processing line: ~    if args.state.moving_box.x > screen_width - args.state.moving_box_size~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +    if args.state.moving_box.x > screen_width - args.state.moving_box_size
    +** Processing line: ~      args.state.moving_box_dx = -1 # moves left~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app demonstrates how sprite animations work.~
    +      args.state.moving_box_dx = -1 # moves left
    +** Processing line: ~    elsif args.state.moving_box.x < 0~
     - Inside source: true
     *** True Line Result
    -  # This sample app demonstrates how sprite animations work.
    -** Processing line: ~  # There are two sprites that animate forever and one sprite~
    +    elsif args.state.moving_box.x < 0
    +** Processing line: ~      args.state.moving_box_dx =  1 # moves right~
     - Inside source: true
     *** True Line Result
    -  # There are two sprites that animate forever and one sprite
    -** Processing line: ~  # that *only* animates when you press the "f" key on the keyboard.~
    +      args.state.moving_box_dx =  1 # moves right
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # that *only* animates when you press the "f" key on the keyboard.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This is the entry point to your game. The `tick` method~
    -- Inside source: true
    -*** True Line Result
    -  # This is the entry point to your game. The `tick` method
    -** Processing line: ~  # executes at 60 frames per second. There are two methods~
    +** Processing line: ~    # Here, we're making sure the moving box remains within the vertical scope of the screen~
     - Inside source: true
     *** True Line Result
    -  # executes at 60 frames per second. There are two methods
    -** Processing line: ~  # in this tick "entry point": `looping_animation`, and the~
    +    # Here, we're making sure the moving box remains within the vertical scope of the screen
    +** Processing line: ~    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high~
     - Inside source: true
     *** True Line Result
    -  # in this tick "entry point": `looping_animation`, and the
    -** Processing line: ~  # second method is `one_time_animation`.~
    +    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high
    +** Processing line: ~      args.state.moving_box_dy = -1 # moves down~
     - Inside source: true
     *** True Line Result
    -  # second method is `one_time_animation`.
    -** Processing line: ~  def tick args~
    +      args.state.moving_box_dy = -1 # moves down
    +** Processing line: ~    elsif args.state.moving_box.y < 0 # if the box moves too low~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    looping_animation args~
    +    elsif args.state.moving_box.y < 0 # if the box moves too low
    +** Processing line: ~      args.state.moving_box_dy =  1 # moves up~
     - Inside source: true
     *** True Line Result
    -    looping_animation args
    -** Processing line: ~    one_time_animation args~
    +      args.state.moving_box_dy =  1 # moves up
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    one_time_animation args
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -19792,602 +20179,598 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This function shows how to animate a sprite that loops forever.~
    +** Processing line: ~  def determine_collision_center_box args~
     - Inside source: true
     *** True Line Result
    -  # This function shows how to animate a sprite that loops forever.
    -** Processing line: ~  def looping_animation args~
    +  def determine_collision_center_box args
    +** Processing line: ~    # Collision is handled by the engine. You simply have to call the~
     - Inside source: true
     *** True Line Result
    -  def looping_animation args
    -** Processing line: ~    # Here we define a few local variables that will be sent~
    +    # Collision is handled by the engine. You simply have to call the
    +** Processing line: ~    # `intersect_rect?` function.~
     - Inside source: true
     *** True Line Result
    -    # Here we define a few local variables that will be sent
    -** Processing line: ~    # into the magic function that gives us the correct sprite image~
    +    # `intersect_rect?` function.
    +** Processing line: ~    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect~
     - Inside source: true
     *** True Line Result
    -    # into the magic function that gives us the correct sprite image
    -** Processing line: ~    # over time. There are four things we need in order to figure~
    +    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect
    +** Processing line: ~      args.state.center_box_collision = true # then a collision happened~
     - Inside source: true
     *** True Line Result
    -    # over time. There are four things we need in order to figure
    -** Processing line: ~    # out which sprite to show.~
    +      args.state.center_box_collision = true # then a collision happened
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -    # out which sprite to show.
    -** Processing line: ~~
    +    else
    +** Processing line: ~      args.state.center_box_collision = false # otherwise, no collision happened~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # 1. When to start the animation.~
    +      args.state.center_box_collision = false # otherwise, no collision happened
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    # 1. When to start the animation.
    -** Processing line: ~    start_looping_at = 0~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    start_looping_at = 0
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # 2. The number of pngs that represent the full animation.~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    # 2. The number of pngs that represent the full animation.
    -** Processing line: ~    number_of_sprites = 6~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -    number_of_sprites = 6
    -** Processing line: ~~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # 3. How long to show each png.~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -    # 3. How long to show each png.
    -** Processing line: ~    number_of_frames_to_show_each_sprite = 4~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -    number_of_frames_to_show_each_sprite = 4
    -** Processing line: ~~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # 4. Whether the animation should loop once, or forever.~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -    # 4. Whether the animation should loop once, or forever.
    -** Processing line: ~    does_sprite_loop = true~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    does_sprite_loop = true
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # With the variables defined above, we can get a number~
    -- Inside source: true
    -*** True Line Result
    -    # With the variables defined above, we can get a number
    -** Processing line: ~    # which represents the sprite to show by calling the `frame_index` function.~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    # which represents the sprite to show by calling the `frame_index` function.
    -** Processing line: ~    # In this case the number will be between 0, and 5 (you can see the sprites~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -    # In this case the number will be between 0, and 5 (you can see the sprites
    -** Processing line: ~    # in the ./sprites directory).~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -    # in the ./sprites directory).
    -** Processing line: ~    sprite_index = start_looping_at.frame_index number_of_sprites,~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    sprite_index = start_looping_at.frame_index number_of_sprites,
    -** Processing line: ~                                                number_of_frames_to_show_each_sprite,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                                number_of_frames_to_show_each_sprite,
    -** Processing line: ~                                                does_sprite_loop~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -                                                does_sprite_loop
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    # Now that we have `sprite_index, we can present the correct file.~
    -- Inside source: true
    +** Processing line: ~*** Physics And Collisions - Moving Objects - main.rb~
    +- Header detected.
     *** True Line Result
    -    # Now that we have `sprite_index, we can present the correct file.
    -** Processing line: ~    args.outputs.sprites << [100, 100, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]~
    -- Inside source: true
    +
     *** True Line Result
    -    args.outputs.sprites << [100, 100, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    -** Processing line: ~~
    -- Inside source: true
    +*** Physics And Collisions - Moving Objects - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~    # Try changing the numbers below to see how the animation changes:~
    -- Inside source: true
     *** True Line Result
    -    # Try changing the numbers below to see how the animation changes:
    -** Processing line: ~    args.outputs.sprites << [100, 200, 100, 100, "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png"]~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [100, 200, 100, 100, "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png"]
    -** Processing line: ~  end~
    +  # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -  end
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This function shows how to animate a sprite that executes~
    -- Inside source: true
    -*** True Line Result
    -  # This function shows how to animate a sprite that executes
    -** Processing line: ~  # only once when the "f" key is pressed.~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -  # only once when the "f" key is pressed.
    -** Processing line: ~  def one_time_animation args~
    +   APIs listing that haven't been encountered in previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def one_time_animation args
    -** Processing line: ~    # This is just a label the shows instructions within the game.~
    +
    +** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
     - Inside source: true
     *** True Line Result
    -    # This is just a label the shows instructions within the game.
    -** Processing line: ~    args.outputs.labels << [220, 350, "(press f to animate)"]~
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +** Processing line: ~     using their keys.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [220, 350, "(press f to animate)"]
    +     using their keys.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # If "f" is pressed on the keyboard...~
    +** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
     - Inside source: true
     *** True Line Result
    -    # If "f" is pressed on the keyboard...
    -** Processing line: ~    if args.inputs.keyboard.key_down.f~
    +     For example, if we have a "numbers" hash that stores numbers in English as the
    +** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.key_down.f
    -** Processing line: ~      # Print the frame that "f" was pressed on.~
    +     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
     - Inside source: true
     *** True Line Result
    -      # Print the frame that "f" was pressed on.
    -** Processing line: ~      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.inputs.keyboard.key_down.f}"~
    +     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +** Processing line: ~     and on it goes.~
     - Inside source: true
     *** True Line Result
    -      puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.inputs.keyboard.key_down.f}"
    +     and on it goes.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # And MOST IMPORTANTLY set the point it time to start the animation,~
    +** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
     - Inside source: true
     *** True Line Result
    -      # And MOST IMPORTANTLY set the point it time to start the animation,
    -** Processing line: ~      # equal to "now" which is represented as args.state.tick_count.~
    +     Now if we wanted to find the corresponding value of the "one" key, we could say
    +** Processing line: ~     puts numbers["one"]~
     - Inside source: true
     *** True Line Result
    -      # equal to "now" which is represented as args.state.tick_count.
    +     puts numbers["one"]
    +** Processing line: ~     which would print "uno" to the console.~
    +- Inside source: true
    +*** True Line Result
    +     which would print "uno" to the console.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Also IMPORTANT, you'll notice that the value of when to start looping~
    +** Processing line: ~   - num1.greater(num2): Returns the greater value.~
     - Inside source: true
     *** True Line Result
    -      # Also IMPORTANT, you'll notice that the value of when to start looping
    -** Processing line: ~      # is stored in `args.state`. This construct's values are retained across~
    +   - num1.greater(num2): Returns the greater value.
    +** Processing line: ~     For example, if we have the command~
     - Inside source: true
     *** True Line Result
    -      # is stored in `args.state`. This construct's values are retained across
    -** Processing line: ~      # executions of the `tick` method.~
    +     For example, if we have the command
    +** Processing line: ~     puts 4.greater(3)~
     - Inside source: true
     *** True Line Result
    -      # executions of the `tick` method.
    -** Processing line: ~      args.state.start_looping_at = args.state.tick_count~
    +     puts 4.greater(3)
    +** Processing line: ~     the number 4 would be printed to the console since it has a greater value than 3.~
     - Inside source: true
     *** True Line Result
    -      args.state.start_looping_at = args.state.tick_count
    -** Processing line: ~    end~
    +     the number 4 would be printed to the console since it has a greater value than 3.
    +** Processing line: ~     Similar to lesser, which returns the lesser value.~
     - Inside source: true
     *** True Line Result
    -    end
    +     Similar to lesser, which returns the lesser value.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # These are the same local variables that were defined~
    +** Processing line: ~   - num1.lesser(num2): Finds the lower value of the given options.~
     - Inside source: true
     *** True Line Result
    -    # These are the same local variables that were defined
    -** Processing line: ~    # for the `looping_animation` function.~
    +   - num1.lesser(num2): Finds the lower value of the given options.
    +** Processing line: ~     For example, in the statement~
     - Inside source: true
     *** True Line Result
    -    # for the `looping_animation` function.
    -** Processing line: ~    number_of_sprites = 6~
    +     For example, in the statement
    +** Processing line: ~     a = 4.lesser(3)~
     - Inside source: true
     *** True Line Result
    -    number_of_sprites = 6
    -** Processing line: ~    number_of_frames_to_show_each_sprite = 4~
    +     a = 4.lesser(3)
    +** Processing line: ~     3 has a lower value than 4, which means that the value of a would be set to 3,~
     - Inside source: true
     *** True Line Result
    -    number_of_frames_to_show_each_sprite = 4
    +     3 has a lower value than 4, which means that the value of a would be set to 3,
    +** Processing line: ~     but if the statement had been~
    +- Inside source: true
    +*** True Line Result
    +     but if the statement had been
    +** Processing line: ~     a = 4.lesser(5)~
    +- Inside source: true
    +*** True Line Result
    +     a = 4.lesser(5)
    +** Processing line: ~     4 has a lower value than 5, which means that the value of a would be set to 4.~
    +- Inside source: true
    +*** True Line Result
    +     4 has a lower value than 5, which means that the value of a would be set to 4.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Except this sprite does not loop again. If the animation time has passed,~
    +** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -    # Except this sprite does not loop again. If the animation time has passed,
    -** Processing line: ~    # then the frame_index function returns nil.~
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +** Processing line: ~     For example, you can derive an array of odd numbers from an original array of~
     - Inside source: true
     *** True Line Result
    -    # then the frame_index function returns nil.
    -** Processing line: ~    does_sprite_loop = false~
    +     For example, you can derive an array of odd numbers from an original array of
    +** Processing line: ~     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).~
     - Inside source: true
     *** True Line Result
    -    does_sprite_loop = false
    +     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    sprite_index = args.state~
    +** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
     - Inside source: true
     *** True Line Result
    -    sprite_index = args.state
    -** Processing line: ~                       .start_looping_at~
    +   - find_all: Finds all values that satisfy specific requirements.
    +** Processing line: ~     For example, you can find all elements of a collection that are divisible by 2~
     - Inside source: true
     *** True Line Result
    -                       .start_looping_at
    -** Processing line: ~                       .frame_index number_of_sprites,~
    +     For example, you can find all elements of a collection that are divisible by 2
    +** Processing line: ~     or find all objects that have intersected with another object.~
     - Inside source: true
     *** True Line Result
    -                       .frame_index number_of_sprites,
    -** Processing line: ~                                    number_of_frames_to_show_each_sprite,~
    +     or find all objects that have intersected with another object.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                    number_of_frames_to_show_each_sprite,
    -** Processing line: ~                                    does_sprite_loop~
    +
    +** Processing line: ~   - abs: Returns the absolute value.~
     - Inside source: true
     *** True Line Result
    -                                    does_sprite_loop
    -** Processing line: ~~
    +   - abs: Returns the absolute value.
    +** Processing line: ~     For example, the command~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # This line sets the frame index to zero, if~
    +     For example, the command
    +** Processing line: ~     (-30).abs~
     - Inside source: true
     *** True Line Result
    -    # This line sets the frame index to zero, if
    -** Processing line: ~    # the animation duration has passed (frame_index returned nil).~
    +     (-30).abs
    +** Processing line: ~     would return 30 as a result.~
     - Inside source: true
     *** True Line Result
    -    # the animation duration has passed (frame_index returned nil).
    +     would return 30 as a result.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Remeber: we are not looping forever here.~
    +** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
     - Inside source: true
     *** True Line Result
    -    # Remeber: we are not looping forever here.
    -** Processing line: ~    sprite_index ||= 0~
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
     - Inside source: true
     *** True Line Result
    -    sprite_index ||= 0
    -** Processing line: ~~
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +** Processing line: ~     each element by 2 or declaring every element as a new entity.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Present the sprite.~
    +     each element by 2 or declaring every element as a new entity.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Present the sprite.
    -** Processing line: ~    args.outputs.sprites << [100, 300, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [100, 300, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."~
    +** Processing line: ~   - args.inputs.keyboard.KEY: Determines if a key has been pressed.~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."
    -** Processing line: ~  end~
    +   - args.inputs.keyboard.KEY: Determines if a key has been pressed.
    +** Processing line: ~     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.~
     - Inside source: true
     *** True Line Result
    -  end
    +     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    -- Inside source: true
    -*** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -    end
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~  # Calls methods needed for game to run properly~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +  # Calls methods needed for game to run properly
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    defaults args
    +** Processing line: ~    render args~
     - 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.
    +    render args
    +** Processing line: ~    calc args~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Rendering Sprites - Animation Using Sprite Sheet - main.rb~
    -- Header detected.
    +    calc args
    +** Processing line: ~    input args~
    +- Inside source: true
     *** True Line Result
    -
    +    input args
    +** Processing line: ~  end~
    +- Inside source: true
     *** True Line Result
    -*** Rendering Sprites - Animation Using Sprite Sheet - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +  end
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    -*** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb~
    +** Processing line: ~  # sets default values and creates empty collections~
     - Inside source: true
     *** True Line Result
    -  # ./samples/03_rendering_sprites/02_animation_using_sprite_sheet/app/main.rb
    -** Processing line: ~  def tick args~
    +  # sets default values and creates empty collections
    +** Processing line: ~  # initialization only happens in the first frame~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.player.x ||= 100~
    +  # initialization only happens in the first frame
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x ||= 100
    -** Processing line: ~    args.state.player.y ||= 100~
    +  def defaults args
    +** Processing line: ~    fiddle args~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y ||= 100
    -** Processing line: ~    args.state.player.w ||= 64~
    +    fiddle args
    +** Processing line: ~    args.state.enemy.hammers ||= []~
     - Inside source: true
     *** True Line Result
    -    args.state.player.w ||= 64
    -** Processing line: ~    args.state.player.h ||= 64~
    +    args.state.enemy.hammers ||= []
    +** Processing line: ~    args.state.enemy.hammer_queue ||= []~
     - Inside source: true
     *** True Line Result
    -    args.state.player.h ||= 64
    -** Processing line: ~    args.state.player.direction ||= 1~
    +    args.state.enemy.hammer_queue ||= []
    +** Processing line: ~    args.state.tick_count = args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    args.state.player.direction ||= 1
    -** Processing line: ~~
    +    args.state.tick_count = args.state.tick_count
    +** Processing line: ~    args.state.bridge_top = 128~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.player.is_moving = false~
    +    args.state.bridge_top = 128
    +** Processing line: ~    args.state.player.x  ||= 0                        # initializes player's properties~
     - Inside source: true
     *** True Line Result
    -    args.state.player.is_moving = false
    -** Processing line: ~~
    +    args.state.player.x  ||= 0                        # initializes player's properties
    +** Processing line: ~    args.state.player.y  ||= args.state.bridge_top~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # get the keyboard input and set player properties~
    +    args.state.player.y  ||= args.state.bridge_top
    +** Processing line: ~    args.state.player.w  ||= 64~
     - Inside source: true
     *** True Line Result
    -    # get the keyboard input and set player properties
    -** Processing line: ~    if args.inputs.keyboard.right~
    +    args.state.player.w  ||= 64
    +** Processing line: ~    args.state.player.h  ||= 64~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.right
    -** Processing line: ~      args.state.player.x += 3~
    +    args.state.player.h  ||= 64
    +** Processing line: ~    args.state.player.dy ||= 0~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x += 3
    -** Processing line: ~      args.state.player.direction = 1~
    +    args.state.player.dy ||= 0
    +** Processing line: ~    args.state.player.dx ||= 0~
     - Inside source: true
     *** True Line Result
    -      args.state.player.direction = 1
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +    args.state.player.dx ||= 0
    +** Processing line: ~    args.state.enemy.x   ||= 800                      # initializes enemy's properties~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    elsif args.inputs.keyboard.left~
    +    args.state.enemy.x   ||= 800                      # initializes enemy's properties
    +** Processing line: ~    args.state.enemy.y   ||= 0~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.left
    -** Processing line: ~      args.state.player.x -= 3~
    +    args.state.enemy.y   ||= 0
    +** Processing line: ~    args.state.enemy.w   ||= 128~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x -= 3
    -** Processing line: ~      args.state.player.direction = -1~
    +    args.state.enemy.w   ||= 128
    +** Processing line: ~    args.state.enemy.h   ||= 128~
     - Inside source: true
     *** True Line Result
    -      args.state.player.direction = -1
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +    args.state.enemy.h   ||= 128
    +** Processing line: ~    args.state.enemy.dy  ||= 0~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    end~
    +    args.state.enemy.dy  ||= 0
    +** Processing line: ~    args.state.enemy.dx  ||= 0~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.enemy.dx  ||= 0
    +** Processing line: ~    args.state.game_over_at ||= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.inputs.keyboard.up~
    +    args.state.game_over_at ||= 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.up
    -** Processing line: ~      args.state.player.y += 1~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y += 1
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +
    +** Processing line: ~  # sets enemy, player, hammer values~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    elsif args.inputs.keyboard.down~
    +  # sets enemy, player, hammer values
    +** Processing line: ~  def fiddle args~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.down
    -** Processing line: ~      args.state.player.y -= 1~
    +  def fiddle args
    +** Processing line: ~    args.state.gravity                     = -0.3~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y -= 1
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +    args.state.gravity                     = -0.3
    +** Processing line: ~    args.state.enemy_jump_power            = 10       # sets enemy values~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    end~
    +    args.state.enemy_jump_power            = 10       # sets enemy values
    +** Processing line: ~    args.state.enemy_jump_interval         = 60~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.enemy_jump_interval         = 60
    +** Processing line: ~    args.state.hammer_throw_interval       = 40       # sets hammer values~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # if no arrow keys are being pressed, set the player as not moving~
    +    args.state.hammer_throw_interval       = 40       # sets hammer values
    +** Processing line: ~    args.state.hammer_launch_power_default = 5~
     - Inside source: true
     *** True Line Result
    -    # if no arrow keys are being pressed, set the player as not moving
    -** Processing line: ~    if !args.inputs.keyboard.directional_vector~
    +    args.state.hammer_launch_power_default = 5
    +** Processing line: ~    args.state.hammer_launch_power_near    = 2~
     - Inside source: true
     *** True Line Result
    -    if !args.inputs.keyboard.directional_vector
    -** Processing line: ~      args.state.player.started_running_at = nil~
    +    args.state.hammer_launch_power_near    = 2
    +** Processing line: ~    args.state.hammer_launch_power_far     = 7~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at = nil
    -** Processing line: ~    end~
    +    args.state.hammer_launch_power_far     = 7
    +** Processing line: ~    args.state.hammer_upward_launch_power  = 15~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.hammer_upward_launch_power  = 15
    +** Processing line: ~    args.state.max_hammers_per_volley      = 10~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # wrap player around the stage~
    +    args.state.max_hammers_per_volley      = 10
    +** Processing line: ~    args.state.gap_between_hammers         = 10~
     - Inside source: true
     *** True Line Result
    -    # wrap player around the stage
    -** Processing line: ~    if args.state.player.x > 1280~
    +    args.state.gap_between_hammers         = 10
    +** Processing line: ~    args.state.player_jump_power           = 10       # sets player values~
     - Inside source: true
     *** True Line Result
    -    if args.state.player.x > 1280
    -** Processing line: ~      args.state.player.x = -64~
    +    args.state.player_jump_power           = 10       # sets player values
    +** Processing line: ~    args.state.player_jump_power_duration  = 10~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x = -64
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +    args.state.player_jump_power_duration  = 10
    +** Processing line: ~    args.state.player_max_run_speed        = 10~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    elsif args.state.player.x < -64~
    +    args.state.player_max_run_speed        = 10
    +** Processing line: ~    args.state.player_speed_slowdown_rate  = 0.9~
     - Inside source: true
     *** True Line Result
    -    elsif args.state.player.x < -64
    -** Processing line: ~      args.state.player.x = 1280~
    +    args.state.player_speed_slowdown_rate  = 0.9
    +** Processing line: ~    args.state.player_acceleration         = 1~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x = 1280
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +    args.state.player_acceleration         = 1
    +** Processing line: ~    args.state.hammer_size                 = 32~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    end~
    +    args.state.hammer_size                 = 32
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.player.y > 720~
    +** Processing line: ~  # outputs objects onto the screen~
     - Inside source: true
     *** True Line Result
    -    if args.state.player.y > 720
    -** Processing line: ~      args.state.player.y = -64~
    +  # outputs objects onto the screen
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y = -64
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +  def render args
    +** Processing line: ~    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    -** Processing line: ~    elsif args.state.player.y < -64~
    +    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    +** Processing line: ~      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)~
     - Inside source: true
     *** True Line Result
    -    elsif args.state.player.y < -64
    -** Processing line: ~      args.state.player.y = 720~
    +      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)
    +** Processing line: ~      # subtracts 64 from bridge_top because position is denoted by bottom left corner~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y = 720
    -** Processing line: ~      args.state.player.started_running_at ||= args.state.tick_count~
    +      # subtracts 64 from bridge_top because position is denoted by bottom left corner
    +** Processing line: ~      [i * 64, args.state.bridge_top - 64, 64, 64]~
     - Inside source: true
     *** True Line Result
    -      args.state.player.started_running_at ||= args.state.tick_count
    +      [i * 64, args.state.bridge_top - 64, 64, 64]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -20396,34 +20779,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # render player as standing or running~
    -- Inside source: true
    -*** True Line Result
    -    # render player as standing or running
    -** Processing line: ~    if args.state.player.started_running_at~
    -- Inside source: true
    -*** True Line Result
    -    if args.state.player.started_running_at
    -** Processing line: ~      args.outputs.sprites << running_sprite(args)~
    -- Inside source: true
    -*** True Line Result
    -      args.outputs.sprites << running_sprite(args)
    -** Processing line: ~    else~
    +** Processing line: ~    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.sprites << standing_sprite(args)~
    +    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]
    +** Processing line: ~    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << standing_sprite(args)
    -** Processing line: ~    end~
    +    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)
    +** Processing line: ~    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    args.outputs.labels << [30, 700, "Use arrow keys to move around."]~
    +    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)
    +** Processing line: ~    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [30, 700, "Use arrow keys to move around."]
    +    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -20432,342 +20803,338 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def standing_sprite args~
    -- Inside source: true
    -*** True Line Result
    -  def standing_sprite args
    -** Processing line: ~    {~
    +** Processing line: ~  # Performs calculations to move objects on the screen~
     - Inside source: true
     *** True Line Result
    -    {
    -** Processing line: ~      x: args.state.player.x,~
    +  # Performs calculations to move objects on the screen
    +** Processing line: ~  def calc args~
     - Inside source: true
     *** True Line Result
    -      x: args.state.player.x,
    -** Processing line: ~      y: args.state.player.y,~
    +  def calc args
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: args.state.player.y,
    -** Processing line: ~      w: args.state.player.w,~
    +
    +** Processing line: ~    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.~
     - Inside source: true
     *** True Line Result
    -      w: args.state.player.w,
    -** Processing line: ~      h: args.state.player.h,~
    +    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    +** Processing line: ~    args.state.player.x  += args.state.player.dx~
     - Inside source: true
     *** True Line Result
    -      h: args.state.player.h,
    -** Processing line: ~      path: "sprites/horizontal-stand.png",~
    +    args.state.player.x  += args.state.player.dx
    +** Processing line: ~    args.state.player.y  += args.state.player.dy~
     - Inside source: true
     *** True Line Result
    -      path: "sprites/horizontal-stand.png",
    -** Processing line: ~      flip_horizontally: args.state.player.direction > 0~
    +    args.state.player.y  += args.state.player.dy
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      flip_horizontally: args.state.player.direction > 0
    -** Processing line: ~    }~
    +
    +** Processing line: ~    # Since acceleration is the change in velocity, the change in y (dy) increases every frame~
     - Inside source: true
     *** True Line Result
    -    }
    -** Processing line: ~  end~
    +    # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    +** Processing line: ~    args.state.player.dy += args.state.gravity~
     - Inside source: true
     *** True Line Result
    -  end
    +    args.state.player.dy += args.state.gravity
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def running_sprite args~
    +** Processing line: ~    # player's y position is either current y position or y position of top of~
     - Inside source: true
     *** True Line Result
    -  def running_sprite args
    -** Processing line: ~    if !args.state.player.started_running_at~
    +    # player's y position is either current y position or y position of top of
    +** Processing line: ~    # bridge, whichever has a greater value~
     - Inside source: true
     *** True Line Result
    -    if !args.state.player.started_running_at
    -** Processing line: ~      tile_index = 0~
    +    # bridge, whichever has a greater value
    +** Processing line: ~    # ensures that the player never goes below the bridge~
     - Inside source: true
     *** True Line Result
    -      tile_index = 0
    -** Processing line: ~    else~
    +    # ensures that the player never goes below the bridge
    +** Processing line: ~    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      how_many_frames_in_sprite_sheet = 6~
    +    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      how_many_frames_in_sprite_sheet = 6
    -** Processing line: ~      how_many_ticks_to_hold_each_frame = 3~
    +
    +** Processing line: ~    # player's x position is either the current x position or 0, whichever has a greater value~
     - Inside source: true
     *** True Line Result
    -      how_many_ticks_to_hold_each_frame = 3
    -** Processing line: ~      should_the_index_repeat = true~
    +    # player's x position is either the current x position or 0, whichever has a greater value
    +** Processing line: ~    # ensures that the player doesn't go too far left (out of the screen's scope)~
     - Inside source: true
     *** True Line Result
    -      should_the_index_repeat = true
    -** Processing line: ~      tile_index = args.state~
    +    # ensures that the player doesn't go too far left (out of the screen's scope)
    +** Processing line: ~    args.state.player.x  = args.state.player.x.greater(0)~
     - Inside source: true
     *** True Line Result
    -      tile_index = args.state
    -** Processing line: ~                       .player~
    +    args.state.player.x  = args.state.player.x.greater(0)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                       .player
    -** Processing line: ~                       .started_running_at~
    +
    +** Processing line: ~    # player is not falling if it is located on the top of the bridge~
     - Inside source: true
     *** True Line Result
    -                       .started_running_at
    -** Processing line: ~                       .frame_index(how_many_frames_in_sprite_sheet,~
    +    # player is not falling if it is located on the top of the bridge
    +** Processing line: ~    args.state.player.falling = false if args.state.player.y == args.state.bridge_top~
     - Inside source: true
     *** True Line Result
    -                       .frame_index(how_many_frames_in_sprite_sheet,
    -** Processing line: ~                                    how_many_ticks_to_hold_each_frame,~
    +    args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    +** Processing line: ~    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player~
     - Inside source: true
     *** True Line Result
    -                                    how_many_ticks_to_hold_each_frame,
    -** Processing line: ~                                    should_the_index_repeat)~
    +    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                    should_the_index_repeat)
    -** Processing line: ~    end~
    +
    +** Processing line: ~    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx
    +** Processing line: ~    args.state.enemy.y += args.state.enemy.dy # same with y and dy~
    +- Inside source: true
    +*** True Line Result
    +    args.state.enemy.y += args.state.enemy.dy # same with y and dy
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    {~
    +** Processing line: ~    # ensures that the enemy never goes below the bridge~
     - Inside source: true
     *** True Line Result
    -    {
    -** Processing line: ~      x: args.state.player.x,~
    +    # ensures that the enemy never goes below the bridge
    +** Processing line: ~    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)~
     - Inside source: true
     *** True Line Result
    -      x: args.state.player.x,
    -** Processing line: ~      y: args.state.player.y,~
    +    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: args.state.player.y,
    -** Processing line: ~      w: args.state.player.w,~
    +
    +** Processing line: ~    # ensures that the enemy never goes too far left (outside the screen's scope)~
     - Inside source: true
     *** True Line Result
    -      w: args.state.player.w,
    -** Processing line: ~      h: args.state.player.h,~
    +    # ensures that the enemy never goes too far left (outside the screen's scope)
    +** Processing line: ~    args.state.enemy.x  = args.state.enemy.x.greater(0)~
     - Inside source: true
     *** True Line Result
    -      h: args.state.player.h,
    -** Processing line: ~      path: 'sprites/horizontal-run.png',~
    +    args.state.enemy.x  = args.state.enemy.x.greater(0)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      path: 'sprites/horizontal-run.png',
    -** Processing line: ~      tile_x: 0 + (tile_index * args.state.player.w),~
    +
    +** Processing line: ~    # objects that go up must come down because of gravity~
     - Inside source: true
     *** True Line Result
    -      tile_x: 0 + (tile_index * args.state.player.w),
    -** Processing line: ~      tile_y: 0,~
    +    # objects that go up must come down because of gravity
    +** Processing line: ~    args.state.enemy.dy += args.state.gravity~
     - Inside source: true
     *** True Line Result
    -      tile_y: 0,
    -** Processing line: ~      tile_w: args.state.player.w,~
    +    args.state.enemy.dy += args.state.gravity
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      tile_w: args.state.player.w,
    -** Processing line: ~      tile_h: args.state.player.h,~
    +
    +** Processing line: ~    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)~
     - Inside source: true
     *** True Line Result
    -      tile_h: args.state.player.h,
    -** Processing line: ~      flip_horizontally: args.state.player.direction > 0,~
    +    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      flip_horizontally: args.state.player.direction > 0,
    -** Processing line: ~    }~
    +
    +** Processing line: ~    #sets definition of enemy~
     - Inside source: true
     *** True Line Result
    -    }
    -** Processing line: ~  end~
    +    #sets definition of enemy
    +** Processing line: ~    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]~
     - Inside source: true
     *** True Line Result
    -  end
    +    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]
     ** 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.
    +** Processing line: ~    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Rendering Sprites - Animation States - main.rb~
    -- Header detected.
    +    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge
    +** Processing line: ~      args.state.enemy.dy = 0 # there is no change in y~
    +- Inside source: true
     *** True Line Result
    -
    +      args.state.enemy.dy = 0 # there is no change in y
    +** Processing line: ~    end~
    +- Inside source: true
     *** True Line Result
    -*** Rendering Sprites - Animation States - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    end
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~    # if 60 frames have passed and the enemy is not moving vertically~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb~
    +    # if 60 frames have passed and the enemy is not moving vertically
    +** Processing line: ~    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0~
     - Inside source: true
     *** True Line Result
    -  # ./samples/03_rendering_sprites/03_animation_states/app/main.rb
    -** Processing line: ~  class Game~
    +    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0
    +** Processing line: ~      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up~
     - Inside source: true
     *** True Line Result
    -  class Game
    -** Processing line: ~    attr_gtk~
    +      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    attr_gtk
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def defaults~
    +** Processing line: ~    # if 40 frames have passed or 5 frames have passed since the game ended~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      state.show_debug_layer  = true if state.tick_count == 0~
    +    # if 40 frames have passed or 5 frames have passed since the game ended
    +** Processing line: ~    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5~
     - Inside source: true
     *** True Line Result
    -      state.show_debug_layer  = true if state.tick_count == 0
    -** Processing line: ~      player.tile_size        = 64~
    +    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5
    +** Processing line: ~      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)~
     - Inside source: true
     *** True Line Result
    -      player.tile_size        = 64
    -** Processing line: ~      player.speed            = 3~
    +      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)
    +** Processing line: ~      # that is why we're adding 1, to include the max possibility~
     - Inside source: true
     *** True Line Result
    -      player.speed            = 3
    -** Processing line: ~      player.slash_frames     = 15~
    +      # that is why we're adding 1, to include the max possibility
    +** Processing line: ~      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)~
     - Inside source: true
     *** True Line Result
    -      player.slash_frames     = 15
    -** Processing line: ~      player.x              ||= 50~
    +      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      player.x              ||= 50
    -** Processing line: ~      player.y              ||= 400~
    +
    +** Processing line: ~      # if the horizontal distance between the player and enemy is less than 128 pixels~
     - Inside source: true
     *** True Line Result
    -      player.y              ||= 400
    -** Processing line: ~      player.dir_x          ||=  1~
    +      # if the horizontal distance between the player and enemy is less than 128 pixels
    +** Processing line: ~      if (args.state.player.x - args.state.enemy.x).abs < 128~
     - Inside source: true
     *** True Line Result
    -      player.dir_x          ||=  1
    -** Processing line: ~      player.dir_y          ||= -1~
    +      if (args.state.player.x - args.state.enemy.x).abs < 128
    +** Processing line: ~        # the change in x won't be that great since the enemy and player are closer to each other~
     - Inside source: true
     *** True Line Result
    -      player.dir_y          ||= -1
    -** Processing line: ~      player.is_moving      ||= false~
    +        # the change in x won't be that great since the enemy and player are closer to each other
    +** Processing line: ~        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1~
     - Inside source: true
     *** True Line Result
    -      player.is_moving      ||= false
    -** Processing line: ~      state.watch_list      ||= {}~
    +        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      state.watch_list      ||= {}
    -** Processing line: ~      state.enemies         ||= []~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.enemies         ||= []
    -** Processing line: ~    end~
    +
    +** Processing line: ~      # if the horizontal distance between the player and enemy is greater than 300 pixels~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      # if the horizontal distance between the player and enemy is greater than 300 pixels
    +** Processing line: ~      if (args.state.player.x - args.state.enemy.x).abs > 300~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def add_enemy~
    +      if (args.state.player.x - args.state.enemy.x).abs > 300
    +** Processing line: ~        # change in x will be more drastic since player and enemy are so far apart~
     - Inside source: true
     *** True Line Result
    -    def add_enemy
    -** Processing line: ~      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }~
    +        # change in x will be more drastic since player and enemy are so far apart
    +** Processing line: ~        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change~
     - Inside source: true
     *** True Line Result
    -      state.enemies << { x: 1200 * rand, y: 600 * rand, w: 64, h: 64 }
    -** Processing line: ~    end~
    +        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def sprite_horizontal_run~
    -- Inside source: true
    -*** True Line Result
    -    def sprite_horizontal_run
    -** Processing line: ~      tile_index = 0.frame_index(6, 3, true)~
    +** Processing line: ~      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|~
     - Inside source: true
     *** True Line Result
    -      tile_index = 0.frame_index(6, 3, true)
    -** Processing line: ~      tile_index = 0 if !player.is_moving~
    +      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|
    +** Processing line: ~        args.state.enemy.hammer_queue << { # stores hammer values in a hash~
     - Inside source: true
     *** True Line Result
    -      tile_index = 0 if !player.is_moving
    -** Processing line: ~~
    +        args.state.enemy.hammer_queue << { # stores hammer values in a hash
    +** Processing line: ~          x: args.state.enemy.x,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      {~
    +          x: args.state.enemy.x,
    +** Processing line: ~          w: args.state.hammer_size,~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x: player.x,~
    +          w: args.state.hammer_size,
    +** Processing line: ~          h: args.state.hammer_size,~
     - Inside source: true
     *** True Line Result
    -        x: player.x,
    -** Processing line: ~        y: player.y,~
    +          h: args.state.hammer_size,
    +** Processing line: ~          dx: volley_dx, # change in horizontal position~
     - Inside source: true
     *** True Line Result
    -        y: player.y,
    -** Processing line: ~        w: player.tile_size,~
    +          dx: volley_dx, # change in horizontal position
    +** Processing line: ~          # multiplication operator takes precedence over addition operator~
     - Inside source: true
     *** True Line Result
    -        w: player.tile_size,
    -** Processing line: ~        h: player.tile_size,~
    +          # multiplication operator takes precedence over addition operator
    +** Processing line: ~          throw_at: args.state.tick_count + i * args.state.gap_between_hammers~
     - Inside source: true
     *** True Line Result
    -        h: player.tile_size,
    -** Processing line: ~        path: 'sprites/horizontal-run.png',~
    +          throw_at: args.state.tick_count + i * args.state.gap_between_hammers
    +** Processing line: ~        }~
     - Inside source: true
     *** True Line Result
    -        path: 'sprites/horizontal-run.png',
    -** Processing line: ~        tile_x: 0 + (tile_index * player.tile_size),~
    +        }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        tile_x: 0 + (tile_index * player.tile_size),
    -** Processing line: ~        tile_y: 0,~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        tile_y: 0,
    -** Processing line: ~        tile_w: player.tile_size,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        tile_w: player.tile_size,
    -** Processing line: ~        tile_h: player.tile_size,~
    +
    +** Processing line: ~    # add elements from hammer_queue collection to the hammers collection by~
     - Inside source: true
     *** True Line Result
    -        tile_h: player.tile_size,
    -** Processing line: ~        flip_horizontally: player.dir_x > 0,~
    +    # add elements from hammer_queue collection to the hammers collection by
    +** Processing line: ~    # finding all hammers that were thrown before the current frame (have already been thrown)~
     - Inside source: true
     *** True Line Result
    -        flip_horizontally: player.dir_x > 0,
    -** Processing line: ~        # a: 40~
    +    # finding all hammers that were thrown before the current frame (have already been thrown)
    +** Processing line: ~    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|~
     - Inside source: true
     *** True Line Result
    -        # a: 40
    -** Processing line: ~      }~
    +    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|
    +** Processing line: ~      h[:throw_at] < args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -      }
    +      h[:throw_at] < args.state.tick_count
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -20776,46 +21143,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 sprite_horizontal_stand~
    +** Processing line: ~    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection~
     - Inside source: true
     *** True Line Result
    -    def sprite_horizontal_stand
    -** Processing line: ~      {~
    +    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection
    +** Processing line: ~      h[:y]  ||= args.state.enemy.y + 130~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x: player.x,~
    +      h[:y]  ||= args.state.enemy.y + 130
    +** Processing line: ~      h[:dy] ||= args.state.hammer_upward_launch_power~
     - Inside source: true
     *** True Line Result
    -        x: player.x,
    -** Processing line: ~        y: player.y,~
    +      h[:dy] ||= args.state.hammer_upward_launch_power
    +** Processing line: ~      h[:dy]  += args.state.gravity # acceleration is change in gravity~
     - Inside source: true
     *** True Line Result
    -        y: player.y,
    -** Processing line: ~        w: player.tile_size,~
    +      h[:dy]  += args.state.gravity # acceleration is change in gravity
    +** Processing line: ~      h[:x]   += h[:dx] # incremented by change in position~
     - Inside source: true
     *** True Line Result
    -        w: player.tile_size,
    -** Processing line: ~        h: player.tile_size,~
    +      h[:x]   += h[:dx] # incremented by change in position
    +** Processing line: ~      h[:y]   += h[:dy]~
     - Inside source: true
     *** True Line Result
    -        h: player.tile_size,
    -** Processing line: ~        path: 'sprites/horizontal-stand.png',~
    +      h[:y]   += h[:dy]
    +** Processing line: ~      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect~
     - Inside source: true
     *** True Line Result
    -        path: 'sprites/horizontal-stand.png',
    -** Processing line: ~        flip_horizontally: player.dir_x > 0,~
    +      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        flip_horizontally: player.dir_x > 0,
    -** Processing line: ~        # a: 40~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        # a: 40
    -** Processing line: ~      }~
    +
    +** Processing line: ~    # reject hammers that have been thrown before current frame (have already been thrown)~
     - Inside source: true
     *** True Line Result
    -      }
    +    # reject hammers that have been thrown before current frame (have already been thrown)
    +** Processing line: ~    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|~
    +- Inside source: true
    +*** True Line Result
    +    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|
    +** Processing line: ~      h[:throw_at] < args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +      h[:throw_at] < args.state.tick_count
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -20824,158 +21199,158 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def sprite_horizontal_slash~
    -- Inside source: true
    -*** True Line Result
    -    def sprite_horizontal_slash
    -** Processing line: ~      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0~
    +** Processing line: ~    # any hammers with a y position less than 0 are rejected from the hammers collection~
     - Inside source: true
     *** True Line Result
    -      tile_index   = player.slash_at.frame_index(5, player.slash_frames.idiv(5), false) || 0
    -** Processing line: ~~
    +    # any hammers with a y position less than 0 are rejected from the hammers collection
    +** Processing line: ~    # since they have gone too far down (outside the scope's screen)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      {~
    +    # since they have gone too far down (outside the scope's screen)
    +** Processing line: ~    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x: player.x - 41.25,~
    +    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        x: player.x - 41.25,
    -** Processing line: ~        y: player.y - 41.25,~
    +
    +** Processing line: ~    # if there are any hammers that intersect with (or hit) the player,~
     - Inside source: true
     *** True Line Result
    -        y: player.y - 41.25,
    -** Processing line: ~        w: 165,~
    +    # if there are any hammers that intersect with (or hit) the player,
    +** Processing line: ~    # the reset_player method is called (so the game can start over)~
     - Inside source: true
     *** True Line Result
    -        w: 165,
    -** Processing line: ~        h: 165,~
    +    # the reset_player method is called (so the game can start over)
    +** Processing line: ~    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }~
     - Inside source: true
     *** True Line Result
    -        h: 165,
    -** Processing line: ~        path: 'sprites/horizontal-slash.png',~
    +    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }
    +** Processing line: ~      reset_player args~
     - Inside source: true
     *** True Line Result
    -        path: 'sprites/horizontal-slash.png',
    -** Processing line: ~        tile_x: 0 + (tile_index * 128),~
    +      reset_player args
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        tile_x: 0 + (tile_index * 128),
    -** Processing line: ~        tile_y: 0,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        tile_y: 0,
    -** Processing line: ~        tile_w: 128,~
    +
    +** Processing line: ~    # if the enemy's rect intersects with (or hits) the player,~
     - Inside source: true
     *** True Line Result
    -        tile_w: 128,
    -** Processing line: ~        tile_h: 128,~
    +    # if the enemy's rect intersects with (or hits) the player,
    +** Processing line: ~    # the reset_player method is called (so the game can start over)~
     - Inside source: true
     *** True Line Result
    -        tile_h: 128,
    -** Processing line: ~        flip_horizontally: player.dir_x > 0~
    +    # the reset_player method is called (so the game can start over)
    +** Processing line: ~    if args.state.enemy.rect.intersect_rect? args.state.player.rect~
     - Inside source: true
     *** True Line Result
    -        flip_horizontally: player.dir_x > 0
    -** Processing line: ~      }~
    +    if args.state.enemy.rect.intersect_rect? args.state.player.rect
    +** Processing line: ~      reset_player args~
     - Inside source: true
     *** True Line Result
    -      }
    +      reset_player args
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_player~
    +** Processing line: ~  # Resets the player by changing its properties back to the values they had at initialization~
     - Inside source: true
     *** True Line Result
    -    def render_player
    -** Processing line: ~      if player.slash_at~
    +  # Resets the player by changing its properties back to the values they had at initialization
    +** Processing line: ~  def reset_player args~
     - Inside source: true
     *** True Line Result
    -      if player.slash_at
    -** Processing line: ~        outputs.sprites << sprite_horizontal_slash~
    +  def reset_player args
    +** Processing line: ~    args.state.player.x = 0~
     - Inside source: true
     *** True Line Result
    -        outputs.sprites << sprite_horizontal_slash
    -** Processing line: ~      elsif player.is_moving~
    +    args.state.player.x = 0
    +** Processing line: ~    args.state.player.y = args.state.bridge_top~
     - Inside source: true
     *** True Line Result
    -      elsif player.is_moving
    -** Processing line: ~        outputs.sprites << sprite_horizontal_run~
    +    args.state.player.y = args.state.bridge_top
    +** Processing line: ~    args.state.player.dy = 0~
     - Inside source: true
     *** True Line Result
    -        outputs.sprites << sprite_horizontal_run
    -** Processing line: ~      else~
    +    args.state.player.dy = 0
    +** Processing line: ~    args.state.player.dx = 0~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        outputs.sprites << sprite_horizontal_stand~
    +    args.state.player.dx = 0
    +** Processing line: ~    args.state.enemy.hammers.clear # empties hammer collection~
     - Inside source: true
     *** True Line Result
    -        outputs.sprites << sprite_horizontal_stand
    -** Processing line: ~      end~
    +    args.state.enemy.hammers.clear # empties hammer collection
    +** Processing line: ~    args.state.enemy.hammer_queue.clear # empties hammer_queue~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    args.state.enemy.hammer_queue.clear # empties hammer_queue
    +** Processing line: ~    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_enemies~
    +** Processing line: ~  # Processes input from the user to move the player~
     - Inside source: true
     *** True Line Result
    -    def render_enemies
    -** Processing line: ~      outputs.borders << state.enemies~
    +  # Processes input from the user to move the player
    +** Processing line: ~  def input args~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.enemies
    -** Processing line: ~    end~
    +  def input args
    +** Processing line: ~    if args.inputs.keyboard.space # if the user presses the space bar~
     - Inside source: true
     *** True Line Result
    -    end
    +    if args.inputs.keyboard.space # if the user presses the space bar
    +** Processing line: ~      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame~
    +- Inside source: true
    +*** True Line Result
    +      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_debug_layer~
    +** Processing line: ~      # if the time that has passed since the jump is less than the player's jump duration and~
     - Inside source: true
     *** True Line Result
    -    def render_debug_layer
    -** Processing line: ~      return if !state.show_debug_layer~
    +      # if the time that has passed since the jump is less than the player's jump duration and
    +** Processing line: ~      # the player is not falling~
     - Inside source: true
     *** True Line Result
    -      return if !state.show_debug_layer
    -** Processing line: ~      outputs.labels << state.watch_list.map.with_index do |(k, v), i|~
    +      # the player is not falling
    +** Processing line: ~      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << state.watch_list.map.with_index do |(k, v), i|
    -** Processing line: ~         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]~
    +      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    +** Processing line: ~        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump~
     - Inside source: true
     *** True Line Result
    -         [30, 710 - i * 28, "#{k}: #{v || "(nil)"}"]
    +        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~      outputs.borders << player.slash_collision_rect~
    -- Inside source: true
    -*** True Line Result
    -      outputs.borders << player.slash_collision_rect
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -20984,18 +21359,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def slash_initiate?~
    +** Processing line: ~    # if the space bar is in the "up" state (or not being pressed down)~
     - Inside source: true
     *** True Line Result
    -    def slash_initiate?
    -** Processing line: ~      # buffalo usb controller has a button and b button swapped lol~
    +    # if the space bar is in the "up" state (or not being pressed down)
    +** Processing line: ~    if args.inputs.keyboard.key_up.space~
     - Inside source: true
     *** True Line Result
    -      # buffalo usb controller has a button and b button swapped lol
    -** Processing line: ~      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j~
    +    if args.inputs.keyboard.key_up.space
    +** Processing line: ~      args.state.player.jumped_at = nil # jumped_at is empty~
     - Inside source: true
     *** True Line Result
    -      inputs.controller_one.key_down.a || inputs.keyboard.key_down.j
    +      args.state.player.jumped_at = nil # jumped_at is empty
    +** Processing line: ~      args.state.player.falling = true # the player is falling~
    +- Inside source: true
    +*** True Line Result
    +      args.state.player.falling = true # the player is falling
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -21004,86 +21383,98 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def input~
    +** Processing line: ~    if args.inputs.keyboard.left # if left key is pressed~
     - Inside source: true
     *** True Line Result
    -    def input
    -** Processing line: ~      # player movement~
    +    if args.inputs.keyboard.left # if left key is pressed
    +** Processing line: ~      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)~
     - Inside source: true
     *** True Line Result
    -      # player movement
    -** Processing line: ~      if slash_complete? && (vector = inputs.directional_vector)~
    +      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)
    +** Processing line: ~      # dx is either set to current dx or the negative max run speed (which would be -10),~
     - Inside source: true
     *** True Line Result
    -      if slash_complete? && (vector = inputs.directional_vector)
    -** Processing line: ~        player.x += vector.x * player.speed~
    +      # dx is either set to current dx or the negative max run speed (which would be -10),
    +** Processing line: ~      # whichever has a greater value~
     - Inside source: true
     *** True Line Result
    -        player.x += vector.x * player.speed
    -** Processing line: ~        player.y += vector.y * player.speed~
    +      # whichever has a greater value
    +** Processing line: ~      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)~
     - Inside source: true
     *** True Line Result
    -        player.y += vector.y * player.speed
    -** Processing line: ~      end~
    +      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)
    +** Processing line: ~    elsif args.inputs.keyboard.right # if right key is pressed~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      player.slash_at = slash_initiate? if slash_initiate?~
    +    elsif args.inputs.keyboard.right # if right key is pressed
    +** Processing line: ~      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)~
     - Inside source: true
     *** True Line Result
    -      player.slash_at = slash_initiate? if slash_initiate?
    -** Processing line: ~    end~
    +      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)
    +** Processing line: ~      # dx is either set to current dx or max run speed (which would be 10),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      # dx is either set to current dx or max run speed (which would be 10),
    +** Processing line: ~      # whichever has a lesser value~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_movement~
    +      # whichever has a lesser value
    +** Processing line: ~      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)~
     - Inside source: true
     *** True Line Result
    -    def calc_movement
    -** Processing line: ~      # movement~
    +      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      # movement
    -** Processing line: ~      if vector = inputs.directional_vector~
    +    else
    +** Processing line: ~      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down~
     - Inside source: true
     *** True Line Result
    -      if vector = inputs.directional_vector
    -** Processing line: ~        state.debug_label = vector~
    +      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.debug_label = vector
    -** Processing line: ~        player.dir_x = vector.x~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        player.dir_x = vector.x
    -** Processing line: ~        player.dir_y = vector.y~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        player.dir_y = vector.y
    -** Processing line: ~        player.is_moving = true~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -        player.is_moving = true
    -** Processing line: ~      else~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        state.debug_label = vector~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -        state.debug_label = vector
    -** Processing line: ~        player.is_moving = false~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -        player.is_moving = false
    -** Processing line: ~      end~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -      end
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.space ||~
    +- Inside source: true
    +*** True Line Result
    +       args.inputs.keyboard.key_down.space ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +- Inside source: true
    +*** True Line Result
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
    +- Inside source: true
    +*** True Line Result
    +      args.state.key_event_occurred = true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -21092,222 +21483,218 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_slash~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    def calc_slash
    -** Processing line: ~      # re-calc the location of the swords collision box~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      # re-calc the location of the swords collision box
    -** Processing line: ~      if player.dir_x.positive?~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      if player.dir_x.positive?
    -** Processing line: ~        player.slash_collision_rect = [player.x + player.tile_size,~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        player.slash_collision_rect = [player.x + player.tile_size,
    -** Processing line: ~                                       player.y + player.tile_size.half - 10,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                       player.y + player.tile_size.half - 10,
    -** Processing line: ~                                       40, 20]~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -                                       40, 20]
    -** Processing line: ~      else~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -      else
    -** Processing line: ~        player.slash_collision_rect = [player.x - 32 - 8,~
    -- Inside source: true
    +
    +** Processing line: ~*** Physics And Collisions - Entities - main.rb~
    +- Header detected.
     *** True Line Result
    -        player.slash_collision_rect = [player.x - 32 - 8,
    -** Processing line: ~                                       player.y + player.tile_size.half - 10,~
    -- Inside source: true
    +
     *** True Line Result
    -                                       player.y + player.tile_size.half - 10,
    -** Processing line: ~                                       40, 20]~
    +*** Physics And Collisions - Entities - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/03_entities/app/main.rb~
     - Inside source: true
     *** True Line Result
    -                                       40, 20]
    -** Processing line: ~      end~
    +  # ./samples/04_physics_and_collisions/03_entities/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -      end
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # recalc sword's slash state~
    -- Inside source: true
    -*** True Line Result
    -      # recalc sword's slash state
    -** Processing line: ~      player.slash_at = nil if slash_complete?~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -      player.slash_at = nil if slash_complete?
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # determine collision if the sword is at it's point of damaging~
    +** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
     - Inside source: true
     *** True Line Result
    -      # determine collision if the sword is at it's point of damaging
    -** Processing line: ~      return unless slash_can_damage?~
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
     - Inside source: true
     *** True Line Result
    -      return unless slash_can_damage?
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +** Processing line: ~     each element by 2 or declaring every element as a new entity.~
    +- Inside source: true
    +*** True Line Result
    +     each element by 2 or declaring every element as a new entity.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }~
    +** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -      state.enemies.reject! { |e| e.intersect_rect? player.slash_collision_rect }
    -** Processing line: ~    end~
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +** Processing line: ~     For example, you can derive an array of odd numbers from an original array of~
     - Inside source: true
     *** True Line Result
    -    end
    +     For example, you can derive an array of odd numbers from an original array of
    +** Processing line: ~     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).~
    +- Inside source: true
    +*** True Line Result
    +     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def slash_complete?~
    +** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
     - Inside source: true
     *** True Line Result
    -    def slash_complete?
    -** Processing line: ~      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)~
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +** Processing line: ~     In this sample app, new_entity is used to define the properties of enemies and bullets.~
     - Inside source: true
     *** True Line Result
    -      !player.slash_at || player.slash_at.elapsed?(player.slash_frames)
    -** Processing line: ~    end~
    +     In this sample app, new_entity is used to define the properties of enemies and bullets.
    +** Processing line: ~     (Remember, you can use state to define ANY property and it will be retained across frames.)~
     - Inside source: true
     *** True Line Result
    -    end
    +     (Remember, you can use state to define ANY property and it will be retained across frames.)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def slash_can_damage?~
    +** Processing line: ~   - args.outputs.labels: An array. The values generate a label on the screen.~
     - Inside source: true
     *** True Line Result
    -    def slash_can_damage?
    -** Processing line: ~      # damage occurs half way into the slash animation~
    +   - args.outputs.labels: An array. The values generate a label on the screen.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -      # damage occurs half way into the slash animation
    -** Processing line: ~      return false if slash_complete?~
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      return false if slash_complete?
    -** Processing line: ~      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count~
    -- Inside source: true
    -*** True Line Result
    -      return false if (player.slash_at + player.slash_frames.idiv(2)) != state.tick_count
    -** Processing line: ~      return true~
    -- Inside source: true
    -*** True Line Result
    -      return true
    -** Processing line: ~    end~
    +
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -    end
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc~
    +** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      # generate an enemy if there aren't any on the screen~
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # generate an enemy if there aren't any on the screen
    -** Processing line: ~      add_enemy if state.enemies.length == 0~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      add_enemy if state.enemies.length == 0
    -** Processing line: ~      calc_movement~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc_movement
    -** Processing line: ~      calc_slash~
    +
    +** Processing line: ~  # This sample app shows enemies that contain an id value and the time they were created.~
     - Inside source: true
     *** True Line Result
    -      calc_slash
    -** Processing line: ~    end~
    +  # This sample app shows enemies that contain an id value and the time they were created.
    +** Processing line: ~  # These enemies can be removed by shooting at them with bullets.~
     - Inside source: true
     *** True Line Result
    -    end
    +  # These enemies can be removed by shooting at them with bullets.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past~
    -- Inside source: true
    -*** True Line Result
    -    # source is at http://github.com/amirrajan/dragonruby-link-to-the-past
    -** Processing line: ~    def tick~
    +** Processing line: ~  # Calls all methods necessary for the game to function properly.~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +  # Calls all methods necessary for the game to function properly.
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render_enemies~
    +  def tick args
    +** Processing line: ~    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."~
     - Inside source: true
     *** True Line Result
    -      render_enemies
    -** Processing line: ~      render_player~
    +    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -      render_player
    -** Processing line: ~      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]~
    +    defaults args
    +** Processing line: ~    render args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [30, 30, "Gamepad: D-Pad to move. B button to attack."]
    -** Processing line: ~      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]~
    +    render args
    +** Processing line: ~    calc args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [30, 52, "Keyboard: WASD/Arrow keys to move. J to attack."]
    -** Processing line: ~      render_debug_layer~
    +    calc args
    +** Processing line: ~    process_inputs args~
     - Inside source: true
     *** True Line Result
    -      render_debug_layer
    -** Processing line: ~      input~
    +    process_inputs args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      input
    -** Processing line: ~      calc~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~    end~
    +
    +** Processing line: ~  # Sets default values~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  # Sets default values
    +** Processing line: ~  # Enemies and bullets start off as empty collections~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def player~
    +  # Enemies and bullets start off as empty collections
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -    def player
    -** Processing line: ~      state.player~
    +  def defaults args
    +** Processing line: ~    args.state.enemies ||= []~
     - Inside source: true
     *** True Line Result
    -      state.player
    -** Processing line: ~    end~
    +    args.state.enemies ||= []
    +** Processing line: ~    args.state.bullets ||= []~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.bullets ||= []
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -21316,298 +21703,282 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $game = Game.new~
    +** Processing line: ~  # Provides each enemy in enemies collection with rectangular border,~
     - Inside source: true
     *** True Line Result
    -  $game = Game.new
    -** Processing line: ~~
    +  # Provides each enemy in enemies collection with rectangular border,
    +** Processing line: ~  # as well as a label showing id and when they were created~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +  # as well as a label showing id and when they were created
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $game.args = args~
    +  def render args
    +** Processing line: ~    # When you're calling a method that takes no arguments, you can use this & syntax on map.~
     - Inside source: true
     *** True Line Result
    -    $game.args = args
    -** Processing line: ~    $game.tick~
    +    # When you're calling a method that takes no arguments, you can use this & syntax on map.
    +** Processing line: ~    # Numbers are being added to x and y in order to keep the text within the enemy's borders.~
     - Inside source: true
     *** True Line Result
    -    $game.tick
    -** Processing line: ~  end~
    +    # Numbers are being added to x and y in order to keep the text within the enemy's borders.
    +** Processing line: ~    args.outputs.borders << args.state.enemies.map(&:rect)~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    args.outputs.borders << args.state.enemies.map(&:rect)
    +** Processing line: ~    args.outputs.labels  << args.state.enemies.flat_map do |enemy|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  $gtk.reset~
    +    args.outputs.labels  << args.state.enemies.flat_map do |enemy|
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset
    -** Processing line: ~~
    +      [
    +** Processing line: ~        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],~
     - 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: ~*** Rendering Sprites - Color And Rotation - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Rendering Sprites - Color And Rotation - 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/03_rendering_sprites/04_color_and_rotation/app/main.rb~
    +        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],
    +** Processing line: ~        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created~
     - Inside source: true
     *** True Line Result
    -  # ./samples/03_rendering_sprites/04_color_and_rotation/app/main.rb
    -** Processing line: ~  =begin~
    +        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - merge: Returns a hash containing the contents of two original hashes.~
    +** Processing line: ~    # Outputs bullets in bullets collection as rectangular solids~
     - Inside source: true
     *** True Line Result
    -   - merge: Returns a hash containing the contents of two original hashes.
    -** Processing line: ~     Merge does not allow duplicate keys, so the value of a repeated key~
    +    # Outputs bullets in bullets collection as rectangular solids
    +** Processing line: ~    args.outputs.solids << args.state.bullets.map(&:rect)~
     - Inside source: true
     *** True Line Result
    -     Merge does not allow duplicate keys, so the value of a repeated key
    -** Processing line: ~     will be overwritten.~
    +    args.outputs.solids << args.state.bullets.map(&:rect)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     will be overwritten.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     For example, if we had two hashes~
    +** Processing line: ~  # Calls all methods necessary for performing calculations~
     - Inside source: true
     *** True Line Result
    -     For example, if we had two hashes
    -** Processing line: ~     h1 = { "a" => 1, "b" => 2}~
    +  # Calls all methods necessary for performing calculations
    +** Processing line: ~  def calc args~
     - Inside source: true
     *** True Line Result
    -     h1 = { "a" => 1, "b" => 2}
    -** Processing line: ~     h2 = { "b" => 3, "c" => 3}~
    +  def calc args
    +** Processing line: ~    add_new_enemies_if_needed args~
     - Inside source: true
     *** True Line Result
    -     h2 = { "b" => 3, "c" => 3}
    -** Processing line: ~     and we called the command~
    +    add_new_enemies_if_needed args
    +** Processing line: ~    move_bullets args~
     - Inside source: true
     *** True Line Result
    -     and we called the command
    -** Processing line: ~     h1.merge(h2)~
    +    move_bullets args
    +** Processing line: ~    calculate_collisions args~
     - Inside source: true
     *** True Line Result
    -     h1.merge(h2)
    -** Processing line: ~     the result would the following hash~
    +    calculate_collisions args
    +** Processing line: ~    remove_bullets_of_screen args~
     - Inside source: true
     *** True Line Result
    -     the result would the following hash
    -** Processing line: ~     { "a" => 1, "b" => 3, "c" => 3}.~
    +    remove_bullets_of_screen args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     { "a" => 1, "b" => 3, "c" => 3}.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    -- Inside source: true
    -*** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +** Processing line: ~  # Adds enemies to the enemies collection and sets their values~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
    +  # Adds enemies to the enemies collection and sets their values
    +** Processing line: ~  def add_new_enemies_if_needed args~
     - Inside source: true
     *** True Line Result
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -** Processing line: ~     using their keys.~
    +  def add_new_enemies_if_needed args
    +** Processing line: ~    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added~
     - Inside source: true
     *** True Line Result
    -     using their keys.
    -** Processing line: ~     In this sample app, we're using a hash to create a sprite.~
    +    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added
    +** Processing line: ~    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added~
     - Inside source: true
     *** True Line Result
    -     In this sample app, we're using a hash to create a sprite.
    +    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
    +** Processing line: ~    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
    +    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total
    +** Processing line: ~      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -** Processing line: ~     Before continuing with this sample app, it is HIGHLY recommended that you look~
    +      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity
    +** Processing line: ~        e.x = 640 + 500 * rand # each enemy is given random position on screen~
     - Inside source: true
     *** True Line Result
    -     Before continuing with this sample app, it is HIGHLY recommended that you look
    -** Processing line: ~     at mygame/documentation/05-sprites.md.~
    +        e.x = 640 + 500 * rand # each enemy is given random position on screen
    +** Processing line: ~        e.y = 600 * rand + 50~
     - Inside source: true
     *** True Line Result
    -     at mygame/documentation/05-sprites.md.
    -** Processing line: ~~
    +        e.y = 600 * rand + 50
    +** Processing line: ~        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.~
    +        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.keyboard.key_held.KEY: Determines if a key is being pressed.
    -** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.~
    +** Processing line: ~  # Moves bullets across screen~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.controller_one: Takes input from the controller based on what key is pressed.
    -** Processing line: ~     For more information about the controller, go to mygame/documentation/08-controllers.md.~
    +  # Moves bullets across screen
    +** Processing line: ~  # Sets definition of the bullets~
     - Inside source: true
     *** True Line Result
    -     For more information about the controller, go to mygame/documentation/08-controllers.md.
    -** Processing line: ~~
    +  # Sets definition of the bullets
    +** Processing line: ~  def move_bullets args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - num1.lesser(num2): Finds the lower value of the given options.~
    +  def move_bullets args
    +** Processing line: ~    args.state.bullets.each do |bullet| # perform action on each bullet in collection~
     - Inside source: true
     *** True Line Result
    -   - num1.lesser(num2): Finds the lower value of the given options.
    +    args.state.bullets.each do |bullet| # perform action on each bullet in collection
    +** Processing line: ~      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)~
    +- Inside source: true
    +*** True Line Result
    +      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out
    +** Processing line: ~      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,~
    +      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to
    +** Processing line: ~      # see what happens to the bullet's movement.~
     - Inside source: true
     *** True Line Result
    -  # This sample app shows a car moving across the screen. It loops back around if it exceeds the dimensions of the screen,
    -** Processing line: ~  # and also can be moved in different directions through keyboard input from the user.~
    +      # see what happens to the bullet's movement.
    +** Processing line: ~      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)~
     - Inside source: true
     *** True Line Result
    -  # and also can be moved in different directions through keyboard input from the user.
    -** Processing line: ~~
    +      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)
    +** Processing line: ~      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Calls the methods necessary for the game to run successfully.~
    +      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # Calls the methods necessary for the game to run successfully.
    -** Processing line: ~  def tick args~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    default args~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    default args
    -** Processing line: ~    render args.grid, args.outputs, args.state~
    +
    +** Processing line: ~  # Determines if a bullet hits an enemy~
     - Inside source: true
     *** True Line Result
    -    render args.grid, args.outputs, args.state
    -** Processing line: ~    calc args.state~
    +  # Determines if a bullet hits an enemy
    +** Processing line: ~  def calculate_collisions args~
     - Inside source: true
     *** True Line Result
    -    calc args.state
    -** Processing line: ~    process_inputs args~
    +  def calculate_collisions args
    +** Processing line: ~    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections~
     - Inside source: true
     *** True Line Result
    -    process_inputs args
    -** Processing line: ~  end~
    +    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections
    +** Processing line: ~      args.state.enemies.each do |enemy|~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      args.state.enemies.each do |enemy|
    +** Processing line: ~        # if bullet has not exploded yet and the bullet hits an enemy~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Sets default values for the car sprite~
    +        # if bullet has not exploded yet and the bullet hits an enemy
    +** Processing line: ~        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)~
     - Inside source: true
     *** True Line Result
    -  # Sets default values for the car sprite
    -** Processing line: ~  # Initialization ||= only happens in the first frame~
    +        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)
    +** Processing line: ~          bullet.exploded = true # bullet explodes~
     - Inside source: true
     *** True Line Result
    -  # Initialization ||= only happens in the first frame
    -** Processing line: ~  def default args~
    +          bullet.exploded = true # bullet explodes
    +** Processing line: ~          enemy.dead = true # enemy is killed~
     - Inside source: true
     *** True Line Result
    -  def default args
    -** Processing line: ~    args.state.sprite.width    = 19~
    +          enemy.dead = true # enemy is killed
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    args.state.sprite.width    = 19
    -** Processing line: ~    args.state.sprite.height   = 10~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    args.state.sprite.height   = 10
    -** Processing line: ~    args.state.sprite.scale    = 4~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.sprite.scale    = 4
    -** Processing line: ~    args.state.max_speed       = 5~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.max_speed       = 5
    -** Processing line: ~    args.state.x             ||= 100~
    +
    +** Processing line: ~    # All exploded bullets are rejected or removed from the bullets collection~
     - Inside source: true
     *** True Line Result
    -    args.state.x             ||= 100
    -** Processing line: ~    args.state.y             ||= 100~
    +    # All exploded bullets are rejected or removed from the bullets collection
    +** Processing line: ~    # and any dead enemy is rejected from the enemies collection.~
     - Inside source: true
     *** True Line Result
    -    args.state.y             ||= 100
    -** Processing line: ~    args.state.speed         ||= 1~
    +    # and any dead enemy is rejected from the enemies collection.
    +** Processing line: ~    args.state.bullets = args.state.bullets.reject(&:exploded)~
     - Inside source: true
     *** True Line Result
    -    args.state.speed         ||= 1
    -** Processing line: ~    args.state.angle         ||= 0~
    +    args.state.bullets = args.state.bullets.reject(&:exploded)
    +** Processing line: ~    args.state.enemies = args.state.enemies.reject(&:dead)~
     - Inside source: true
     *** True Line Result
    -    args.state.angle         ||= 0
    +    args.state.enemies = args.state.enemies.reject(&:dead)
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -21616,142 +21987,146 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Outputs sprite onto screen~
    +** Processing line: ~  # Bullets are rejected from bullets collection once their position exceeds the width of screen~
     - Inside source: true
     *** True Line Result
    -  # Outputs sprite onto screen
    -** Processing line: ~  def render grid, outputs, state~
    +  # Bullets are rejected from bullets collection once their position exceeds the width of screen
    +** Processing line: ~  def remove_bullets_of_screen args~
     - Inside source: true
     *** True Line Result
    -  def render grid, outputs, state
    -** Processing line: ~    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background~
    +  def remove_bullets_of_screen args
    +** Processing line: ~    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280~
     - Inside source: true
     *** True Line Result
    -    outputs.solids  <<  [grid.rect, 70, 70, 70] # outputs gray background
    -** Processing line: ~    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite~
    +    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    outputs.sprites <<  [destination_rect(state), # sets first four parameters of car sprite
    -** Processing line: ~    'sprites/86.png', # image path of car~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    'sprites/86.png', # image path of car
    -** Processing line: ~    state.angle,~
    +
    +** Processing line: ~  # Calls fire_bullet method~
     - Inside source: true
     *** True Line Result
    -    state.angle,
    -** Processing line: ~    opacity, # transparency~
    +  # Calls fire_bullet method
    +** Processing line: ~  def process_inputs args~
     - Inside source: true
     *** True Line Result
    -    opacity, # transparency
    -** Processing line: ~    saturation,~
    +  def process_inputs args
    +** Processing line: ~    fire_bullet args~
     - Inside source: true
     *** True Line Result
    -    saturation,
    -** Processing line: ~    source_rect(state), # sprite sub division/tile (tile x, y, w, h)~
    +    fire_bullet args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    source_rect(state), # sprite sub division/tile (tile x, y, w, h)
    -** Processing line: ~    false, false,  # don't flip sprites~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    false, false,  # don't flip sprites
    -** Processing line: ~    rotation_anchor]~
    +
    +** Processing line: ~  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection~
     - Inside source: true
     *** True Line Result
    -    rotation_anchor]
    -** Processing line: ~~
    +  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection
    +** Processing line: ~  def fire_bullet args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # also look at the create_sprite helper method~
    +  def fire_bullet args
    +** Processing line: ~    return unless args.inputs.mouse.click # return unless mouse is clicked~
     - Inside source: true
     *** True Line Result
    -    # also look at the create_sprite helper method
    -** Processing line: ~    #~
    +    return unless args.inputs.mouse.click # return unless mouse is clicked
    +** Processing line: ~    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity~
     - Inside source: true
     *** True Line Result
    -    #
    -** Processing line: ~    # For example:~
    +    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity
    +** Processing line: ~      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked~
     - Inside source: true
     *** True Line Result
    -    # For example:
    -** Processing line: ~    #~
    +      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked
    +** Processing line: ~      bullet.x = 0 # starts on the left side of the screen~
     - Inside source: true
     *** True Line Result
    -    #
    -** Processing line: ~    # dest   = destination_rect(state)~
    +      bullet.x = 0 # starts on the left side of the screen
    +** Processing line: ~      bullet.size = 10~
     - Inside source: true
     *** True Line Result
    -    # dest   = destination_rect(state)
    -** Processing line: ~    # source = source_rect(state),~
    +      bullet.size = 10
    +** Processing line: ~      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized~
     - Inside source: true
     *** True Line Result
    -    # source = source_rect(state),
    -** Processing line: ~    # outputs.sprites << create_sprite(~
    +      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized
    +** Processing line: ~      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set~
     - Inside source: true
     *** True Line Result
    -    # outputs.sprites << create_sprite(
    -** Processing line: ~    #   'sprites/86.png',~
    +      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    #   'sprites/86.png',
    -** Processing line: ~    #   x: dest.x,~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    #   x: dest.x,
    -** Processing line: ~    #   y: dest.y,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #   y: dest.y,
    -** Processing line: ~    #   w: dest.w,~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    #   w: dest.w,
    -** Processing line: ~    #   h: dest.h,~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -    #   h: dest.h,
    -** Processing line: ~    #   angle: state.angle,~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -    #   angle: state.angle,
    -** Processing line: ~    #   source_x: source.x,~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -    #   source_x: source.x,
    -** Processing line: ~    #   source_y: source.y,~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -    #   source_y: source.y,
    -** Processing line: ~    #   source_w: source.w,~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.space ||~
     - Inside source: true
     *** True Line Result
    -    #   source_w: source.w,
    -** Processing line: ~    #   source_h: source.h,~
    +       args.inputs.keyboard.key_down.space ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -    #   source_h: source.h,
    -** Processing line: ~    #   flip_h: false,~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -    #   flip_h: false,
    -** Processing line: ~    #   flip_v: false,~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    #   flip_v: false,
    -** Processing line: ~    #   rotation_anchor_x: 0.7,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #   rotation_anchor_x: 0.7,
    -** Processing line: ~    #   rotation_anchor_y: 0.5~
    +
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    #   rotation_anchor_y: 0.5
    -** Processing line: ~    # )~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -    # )
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -21760,718 +22135,766 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Creates sprite by setting values inside of a hash~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  # Creates sprite by setting values inside of a hash
    -** Processing line: ~  def create_sprite path, options = {}~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -  def create_sprite path, options = {}
    -** Processing line: ~    options = {~
    -- Inside source: true
    +
    +** Processing line: ~*** Physics And Collisions - Box Collision - main.rb~
    +- Header detected.
     *** True Line Result
    -    options = {
    -** Processing line: ~~
    -- Inside source: true
    +
    +*** True Line Result
    +*** Physics And Collisions - Box Collision - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~      # dest x, y, w, h~
    -- Inside source: true
     *** True Line Result
    -      # dest x, y, w, h
    -** Processing line: ~      x: 0,~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      x: 0,
    -** Processing line: ~      y: 0,~
    +  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -      y: 0,
    -** Processing line: ~      w: 100,~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      w: 100,
    -** Processing line: ~      h: 100,~
    +
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -      h: 100,
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # angle, rotation~
    +** Processing line: ~   - first: Returns the first element of the array.~
     - Inside source: true
     *** True Line Result
    -      # angle, rotation
    -** Processing line: ~      angle: 0,~
    +   - first: Returns the first element of the array.
    +** Processing line: ~     For example, if we have an array~
     - Inside source: true
     *** True Line Result
    -      angle: 0,
    -** Processing line: ~      rotation_anchor_x: 0.5,~
    +     For example, if we have an array
    +** Processing line: ~     numbers = [1, 2, 3, 4, 5]~
     - Inside source: true
     *** True Line Result
    -      rotation_anchor_x: 0.5,
    -** Processing line: ~      rotation_anchor_y: 0.5,~
    +     numbers = [1, 2, 3, 4, 5]
    +** Processing line: ~     and we call first by saying~
     - Inside source: true
     *** True Line Result
    -      rotation_anchor_y: 0.5,
    +     and we call first by saying
    +** Processing line: ~     numbers.first~
    +- Inside source: true
    +*** True Line Result
    +     numbers.first
    +** Processing line: ~     the number 1 will be returned because it is the first element of the numbers array.~
    +- Inside source: true
    +*** True Line Result
    +     the number 1 will be returned because it is the first element of the numbers array.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # color saturation (red, green, blue), transparency~
    +** Processing line: ~   - num1.idiv(num2): Divides two numbers and returns an integer.~
     - Inside source: true
     *** True Line Result
    -      # color saturation (red, green, blue), transparency
    -** Processing line: ~      r: 255,~
    +   - num1.idiv(num2): Divides two numbers and returns an integer.
    +** Processing line: ~     For example,~
     - Inside source: true
     *** True Line Result
    -      r: 255,
    -** Processing line: ~      g: 255,~
    +     For example,
    +** Processing line: ~     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.~
     - Inside source: true
     *** True Line Result
    -      g: 255,
    -** Processing line: ~      b: 255,~
    +     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.
    +** Processing line: ~     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.~
     - Inside source: true
     *** True Line Result
    -      b: 255,
    -** Processing line: ~      a: 255,~
    +     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      a: 255,
    +
    +** Processing line: ~   Reminders:~
    +- Inside source: true
    +*** True Line Result
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # source x, y, width, height~
    +** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
     - Inside source: true
     *** True Line Result
    -      # source x, y, width, height
    -** Processing line: ~      source_x: 0,~
    +   - find_all: Finds all values that satisfy specific requirements.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      source_x: 0,
    -** Processing line: ~      source_y: 0,~
    +
    +** Processing line: ~   - ARRAY#intersect_rect?: An array with at least four values is~
     - Inside source: true
     *** True Line Result
    -      source_y: 0,
    -** Processing line: ~      source_w: -1,~
    +   - ARRAY#intersect_rect?: An array with at least four values is
    +** Processing line: ~     considered a rect. The intersect_rect? function returns true~
     - Inside source: true
     *** True Line Result
    -      source_w: -1,
    -** Processing line: ~      source_h: -1,~
    +     considered a rect. The intersect_rect? function returns true
    +** Processing line: ~     or false depending on if the two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -      source_h: -1,
    +     or false depending on if the two rectangles intersect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # flip horiztonally, flip vertically~
    +** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -      # flip horiztonally, flip vertically
    -** Processing line: ~      flip_h: false,~
    +   - reject: Removes elements from a collection if they meet certain requirements.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      flip_h: false,
    -** Processing line: ~      flip_v: false,~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      flip_v: false,
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    }.merge options~
    +** Processing line: ~  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.~
     - Inside source: true
     *** True Line Result
    -    }.merge options
    +  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.
    +** Processing line: ~  # The player can then move and maneuver around them.~
    +- Inside source: true
    +*** True Line Result
    +  # The player can then move and maneuver around them.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    [~
    +** Processing line: ~  class PoorManPlatformerPhysics~
     - Inside source: true
     *** True Line Result
    -    [
    -** Processing line: ~      options[:x], options[:y], options[:w], options[:h], # dest rect keys~
    +  class PoorManPlatformerPhysics
    +** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
     - Inside source: true
     *** True Line Result
    -      options[:x], options[:y], options[:w], options[:h], # dest rect keys
    -** Processing line: ~      path,~
    +    attr_accessor :grid, :inputs, :state, :outputs
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      path,
    -** Processing line: ~      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha~
    +
    +** Processing line: ~    # Calls all methods necessary for the app to run successfully.~
     - Inside source: true
     *** True Line Result
    -      options[:angle], options[:a], options[:r], options[:g], options[:b], # angle, color, alpha
    -** Processing line: ~      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys~
    +    # Calls all methods necessary for the app to run successfully.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -      options[:source_x], options[:source_y], options[:source_w], options[:source_h], # source rect keys
    -** Processing line: ~      options[:flip_h], options[:flip_v], # flip~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -      options[:flip_h], options[:flip_v], # flip
    -** Processing line: ~      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -      options[:rotation_anchor_x], options[:rotation_anchor_y], # rotation anchor
    -** Processing line: ~    ] # hash keys contain corresponding values~
    +      render
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -    ] # hash keys contain corresponding values
    -** Processing line: ~  end~
    +      calc
    +** Processing line: ~      process_inputs~
     - Inside source: true
     *** True Line Result
    -  end
    +      process_inputs
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Calls the calc_pos and calc_wrap methods.~
    +** Processing line: ~    # Sets default values for variables.~
     - Inside source: true
     *** True Line Result
    -  # Calls the calc_pos and calc_wrap methods.
    -** Processing line: ~  def calc state~
    +    # Sets default values for variables.
    +** Processing line: ~    # The ||= sign means that the variable will only be set to the value following the = sign if the value has~
     - Inside source: true
     *** True Line Result
    -  def calc state
    -** Processing line: ~    calc_pos state~
    +    # The ||= sign means that the variable will only be set to the value following the = sign if the value has
    +** Processing line: ~    # not already been set before. Intialization happens only in the first frame.~
     - Inside source: true
     *** True Line Result
    -    calc_pos state
    -** Processing line: ~    calc_wrap state~
    +    # not already been set before. Intialization happens only in the first frame.
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -    calc_wrap state
    -** Processing line: ~  end~
    +    def defaults
    +** Processing line: ~      state.tile_size               = 64~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      state.tile_size               = 64
    +** Processing line: ~      state.gravity                 = -0.2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Changes sprite's position on screen~
    +      state.gravity                 = -0.2
    +** Processing line: ~      state.previous_tile_size    ||= state.tile_size~
     - Inside source: true
     *** True Line Result
    -  # Changes sprite's position on screen
    -** Processing line: ~  # Vectors have magnitude and direction, so the incremented x and y values give the car direction~
    +      state.previous_tile_size    ||= state.tile_size
    +** Processing line: ~      state.x                     ||= 0~
     - Inside source: true
     *** True Line Result
    -  # Vectors have magnitude and direction, so the incremented x and y values give the car direction
    -** Processing line: ~  def calc_pos state~
    +      state.x                     ||= 0
    +** Processing line: ~      state.y                     ||= 800~
     - Inside source: true
     *** True Line Result
    -  def calc_pos state
    -** Processing line: ~    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed~
    +      state.y                     ||= 800
    +** Processing line: ~      state.dy                    ||= 0~
     - Inside source: true
     *** True Line Result
    -    state.x     += state.angle.vector_x * state.speed # increments x by product of angle's x vector and speed
    -** Processing line: ~    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed~
    +      state.dy                    ||= 0
    +** Processing line: ~      state.dx                    ||= 0~
     - Inside source: true
     *** True Line Result
    -    state.y     += state.angle.vector_y * state.speed # increments y by product of angle's y vector and speed
    -** Processing line: ~    state.speed *= 1.1 # scales speed up~
    +      state.dx                    ||= 0
    +** Processing line: ~      state.world                 ||= []~
     - Inside source: true
     *** True Line Result
    -    state.speed *= 1.1 # scales speed up
    -** Processing line: ~    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)~
    +      state.world                 ||= []
    +** Processing line: ~      state.world_lookup          ||= {}~
     - Inside source: true
     *** True Line Result
    -    state.speed  = state.speed.lesser(state.max_speed) # speed is either current speed or max speed, whichever has a lesser value (ensures that the car doesn't go too fast or exceed the max speed)
    -** Processing line: ~  end~
    +      state.world_lookup          ||= {}
    +** Processing line: ~      state.world_collision_rects ||= []~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      state.world_collision_rects ||= []
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # The screen's dimensions are 1280x720. If the car goes out of scope,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # The screen's dimensions are 1280x720. If the car goes out of scope,
    -** Processing line: ~  # it loops back around on the screen.~
    +
    +** Processing line: ~    # Outputs solids and borders of different colors for the world and collision_rects collections.~
     - Inside source: true
     *** True Line Result
    -  # it loops back around on the screen.
    -** Processing line: ~  def calc_wrap state~
    +    # Outputs solids and borders of different colors for the world and collision_rects collections.
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -  def calc_wrap state
    +    def render
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # car returns to left side of screen if it disappears on right side of screen~
    +** Processing line: ~      # Sets a black background on the screen (Comment this line out and the background will become white.)~
     - Inside source: true
     *** True Line Result
    -    # car returns to left side of screen if it disappears on right side of screen
    -** Processing line: ~    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger~
    +      # Sets a black background on the screen (Comment this line out and the background will become white.)
    +** Processing line: ~      # Also note that black is the default color for when no color is assigned.~
     - Inside source: true
     *** True Line Result
    -    # sprite.width refers to tile's size, which is multipled by scale (4) to make it bigger
    -** Processing line: ~    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280~
    +      # Also note that black is the default color for when no color is assigned.
    +** Processing line: ~      outputs.solids << grid.rect~
     - Inside source: true
     *** True Line Result
    -    state.x = -state.sprite.width * state.sprite.scale if state.x - 20 > 1280
    +      outputs.solids << grid.rect
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # car wraps around to right side of screen if it disappears on the left side~
    +** Processing line: ~      # The position, size, and color (white) are set for borders given to the world collection.~
     - Inside source: true
     *** True Line Result
    -    # car wraps around to right side of screen if it disappears on the left side
    -** Processing line: ~    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0~
    +      # The position, size, and color (white) are set for borders given to the world collection.
    +** Processing line: ~      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.~
     - Inside source: true
     *** True Line Result
    -    state.x = 1280 if state.x + state.sprite.width * state.sprite.scale + 20 < 0
    -** Processing line: ~~
    +      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.
    +** Processing line: ~      outputs.borders << state.world.map do |x, y|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # car wraps around to bottom of screen if it disappears at the top of the screen~
    +      outputs.borders << state.world.map do |x, y|
    +** Processing line: ~        [x * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    # car wraps around to bottom of screen if it disappears at the top of the screen
    -** Processing line: ~    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)~
    +        [x * state.tile_size,
    +** Processing line: ~         y * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    # if you subtract 520 pixels instead of 20 pixels, the car takes longer to reappear (try it!)
    -** Processing line: ~    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope~
    +         y * state.tile_size,
    +** Processing line: ~         state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    state.y = 0    if state.y - 20 > 720 # if 20 pixels less than car's y position is greater than vertical scope
    -** Processing line: ~~
    +         state.tile_size,
    +** Processing line: ~         state.tile_size, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # car wraps around to top of screen if it disappears at the bottom of the screen~
    +         state.tile_size, 255, 255, 255]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    # car wraps around to top of screen if it disappears at the bottom of the screen
    -** Processing line: ~    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    state.y = 720  if state.y + state.sprite.height * state.sprite.scale + 20 < 0
    -** Processing line: ~  end~
    +
    +** Processing line: ~      # The top, bottom, and sides of the borders for collision_rects are different colors.~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      # The top, bottom, and sides of the borders for collision_rects are different colors.
    +** Processing line: ~      outputs.borders << state.world_collision_rects.map do |e|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Changes angle of sprite based on user input from keyboard or controller~
    +      outputs.borders << state.world_collision_rects.map do |e|
    +** Processing line: ~        [~
     - Inside source: true
     *** True Line Result
    -  # Changes angle of sprite based on user input from keyboard or controller
    -** Processing line: ~  def process_inputs args~
    +        [
    +** Processing line: ~          [e[:top],                             0, 170,   0], # top is a shade of green~
     - Inside source: true
     *** True Line Result
    -  def process_inputs args
    -** Processing line: ~~
    +          [e[:top],                             0, 170,   0], # top is a shade of green
    +** Processing line: ~          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # NOTE: increasing the angle doesn't mean that the car will continue to go~
    +          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue
    +** Processing line: ~          [e[:left_right],                    170,   0,   0], # left and right are a shade of red~
     - Inside source: true
     *** True Line Result
    -    # NOTE: increasing the angle doesn't mean that the car will continue to go
    -** Processing line: ~    # in a specific direction. The angle is increasing, which means that if the~
    +          [e[:left_right],                    170,   0,   0], # left and right are a shade of red
    +** Processing line: ~        ]~
     - Inside source: true
     *** True Line Result
    -    # in a specific direction. The angle is increasing, which means that if the
    -** Processing line: ~    # left key was kept in the "down" state, the change in the angle would cause~
    +        ]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    # left key was kept in the "down" state, the change in the angle would cause
    -** Processing line: ~    # the car to go in a counter-clockwise direction and form a circle (360 degrees)~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # the car to go in a counter-clockwise direction and form a circle (360 degrees)
    -** Processing line: ~    if args.inputs.keyboard.key_held.left # if left key is pressed~
    +
    +** Processing line: ~      # Sets the position, size, and color (a shade of green) of the borders of only the player's~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.key_held.left # if left key is pressed
    -** Processing line: ~      args.state.angle += 2 # car's angle is incremented by 2~
    +      # Sets the position, size, and color (a shade of green) of the borders of only the player's
    +** Processing line: ~      # box and outputs it. If you change the 180 to 0, the player's box will be black and you~
     - Inside source: true
     *** True Line Result
    -      args.state.angle += 2 # car's angle is incremented by 2
    -** Processing line: ~~
    +      # box and outputs it. If you change the 180 to 0, the player's box will be black and you
    +** Processing line: ~      # won't be able to see it (because it will match the black background).~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # The same applies to decreasing the angle. If the right key was kept in the~
    +      # won't be able to see it (because it will match the black background).
    +** Processing line: ~      outputs.borders << [state.x,~
     - Inside source: true
     *** True Line Result
    -    # The same applies to decreasing the angle. If the right key was kept in the
    -** Processing line: ~    # "down" state, the decreasing angle would cause the car to go in a clockwise~
    +      outputs.borders << [state.x,
    +** Processing line: ~                          state.y,~
     - Inside source: true
     *** True Line Result
    -    # "down" state, the decreasing angle would cause the car to go in a clockwise
    -** Processing line: ~    # direction and form a circle (360 degrees)~
    +                          state.y,
    +** Processing line: ~                          state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    # direction and form a circle (360 degrees)
    -** Processing line: ~    elsif args.inputs.keyboard.key_held.right # if right key is pressed~
    +                          state.tile_size,
    +** Processing line: ~                          state.tile_size,  0, 180, 0]~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.key_held.right # if right key is pressed
    -** Processing line: ~      args.state.angle -= 2 # car's angle is decremented by 2~
    +                          state.tile_size,  0, 180, 0]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      args.state.angle -= 2 # car's angle is decremented by 2
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Input from a controller can also change the angle of the car~
    +** Processing line: ~    # Calls methods needed to perform calculations.~
     - Inside source: true
     *** True Line Result
    -    # Input from a controller can also change the angle of the car
    -** Processing line: ~    elsif args.inputs.controller_one.left_analog_x_perc != 0~
    +    # Calls methods needed to perform calculations.
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.controller_one.left_analog_x_perc != 0
    -** Processing line: ~      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1~
    +    def calc
    +** Processing line: ~      calc_world_lookup~
     - Inside source: true
     *** True Line Result
    -      args.state.angle += 2 * args.inputs.controller_one.left_analog_x_perc * -1
    +      calc_world_lookup
    +** Processing line: ~      calc_player~
    +- Inside source: true
    +*** True Line Result
    +      calc_player
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~  end~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  end
    +
    +** Processing line: ~    # Performs calculations on world_lookup and sets values.~
    +- Inside source: true
    +*** True Line Result
    +    # Performs calculations on world_lookup and sets values.
    +** Processing line: ~    def calc_world_lookup~
    +- Inside source: true
    +*** True Line Result
    +    def calc_world_lookup
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # A sprite's center of rotation can be altered~
    +** Processing line: ~      # If the tile size isn't equal to the previous tile size,~
     - Inside source: true
     *** True Line Result
    -  # A sprite's center of rotation can be altered
    -** Processing line: ~  # Increasing either of these numbers would dramatically increase the~
    +      # If the tile size isn't equal to the previous tile size,
    +** Processing line: ~      # the previous tile size is set to the tile size,~
     - Inside source: true
     *** True Line Result
    -  # Increasing either of these numbers would dramatically increase the
    -** Processing line: ~  # car's drift when it turns!~
    +      # the previous tile size is set to the tile size,
    +** Processing line: ~      # and world_lookup hash is set to empty.~
     - Inside source: true
     *** True Line Result
    -  # car's drift when it turns!
    -** Processing line: ~  def rotation_anchor~
    +      # and world_lookup hash is set to empty.
    +** Processing line: ~      if state.tile_size != state.previous_tile_size~
     - Inside source: true
     *** True Line Result
    -  def rotation_anchor
    -** Processing line: ~    [0.7, 0.5]~
    +      if state.tile_size != state.previous_tile_size
    +** Processing line: ~        state.previous_tile_size = state.tile_size~
     - Inside source: true
     *** True Line Result
    -    [0.7, 0.5]
    -** Processing line: ~  end~
    +        state.previous_tile_size = state.tile_size
    +** Processing line: ~        state.world_lookup = {} # empty hash~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        state.world_lookup = {} # empty hash
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Sets opacity value of sprite to 255 so that it is not transparent at all~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # Sets opacity value of sprite to 255 so that it is not transparent at all
    -** Processing line: ~  # Change it to 0 and you won't be able to see the car sprite on the screen~
    +
    +** Processing line: ~      # return if the world_lookup hash has keys (or, in other words, is not empty)~
     - Inside source: true
     *** True Line Result
    -  # Change it to 0 and you won't be able to see the car sprite on the screen
    -** Processing line: ~  def opacity~
    +      # return if the world_lookup hash has keys (or, in other words, is not empty)
    +** Processing line: ~      # return unless the world collection has values inside of it (or is not empty)~
     - Inside source: true
     *** True Line Result
    -  def opacity
    -** Processing line: ~    255~
    +      # return unless the world collection has values inside of it (or is not empty)
    +** Processing line: ~      return if state.world_lookup.keys.length > 0~
     - Inside source: true
     *** True Line Result
    -    255
    -** Processing line: ~  end~
    +      return if state.world_lookup.keys.length > 0
    +** Processing line: ~      return unless state.world.length > 0~
     - Inside source: true
     *** True Line Result
    -  end
    +      return unless state.world.length > 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Sets the color of the sprite to white.~
    +** Processing line: ~      # Starts with an empty hash for world_lookup.~
     - Inside source: true
     *** True Line Result
    -  # Sets the color of the sprite to white.
    -** Processing line: ~  def saturation~
    +      # Starts with an empty hash for world_lookup.
    +** Processing line: ~      # Searches through the world and finds the coordinates that exist.~
     - Inside source: true
     *** True Line Result
    -  def saturation
    -** Processing line: ~    [255, 255, 255]~
    +      # Searches through the world and finds the coordinates that exist.
    +** Processing line: ~      state.world_lookup = {}~
     - Inside source: true
     *** True Line Result
    -    [255, 255, 255]
    -** Processing line: ~  end~
    +      state.world_lookup = {}
    +** Processing line: ~      state.world.each { |x, y| state.world_lookup[[x, y]] = true }~
     - Inside source: true
     *** True Line Result
    -  end
    +      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Sets definition of destination_rect (used to define the car sprite)~
    +** Processing line: ~      # Assigns world_collision_rects for every sprite drawn.~
     - Inside source: true
     *** True Line Result
    -  # Sets definition of destination_rect (used to define the car sprite)
    -** Processing line: ~  def destination_rect state~
    +      # Assigns world_collision_rects for every sprite drawn.
    +** Processing line: ~      state.world_collision_rects =~
     - Inside source: true
     *** True Line Result
    -  def destination_rect state
    -** Processing line: ~    [state.x, state.y,~
    +      state.world_collision_rects =
    +** Processing line: ~        state.world_lookup~
     - Inside source: true
     *** True Line Result
    -    [state.x, state.y,
    -** Processing line: ~    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size~
    +        state.world_lookup
    +** Processing line: ~            .keys~
     - Inside source: true
     *** True Line Result
    -    state.sprite.width  * state.sprite.scale, # multiplies by 4 to set size
    -** Processing line: ~    state.sprite.height * state.sprite.scale]~
    +            .keys
    +** Processing line: ~            .map do |coord_x, coord_y|~
     - Inside source: true
     *** True Line Result
    -    state.sprite.height * state.sprite.scale]
    -** Processing line: ~  end~
    +            .map do |coord_x, coord_y|
    +** Processing line: ~              s = state.tile_size~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +              s = state.tile_size
    +** Processing line: ~              # multiply by tile size so the grid coordinates; sets pixel value~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Portion of a sprite (a tile)~
    +              # multiply by tile size so the grid coordinates; sets pixel value
    +** Processing line: ~              # don't forget that position is denoted by bottom left corner~
     - Inside source: true
     *** True Line Result
    -  # Portion of a sprite (a tile)
    -** Processing line: ~  # Sub division of sprite is denoted as a rectangle directly related to original size of .png~
    +              # don't forget that position is denoted by bottom left corner
    +** Processing line: ~              # set x = coord_x or y = coord_y and see what happens!~
     - Inside source: true
     *** True Line Result
    -  # Sub division of sprite is denoted as a rectangle directly related to original size of .png
    -** Processing line: ~  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)~
    +              # set x = coord_x or y = coord_y and see what happens!
    +** Processing line: ~              x = s * coord_x~
     - Inside source: true
     *** True Line Result
    -  # Tile is located at bottom left corner within a 19x10 pixel rectangle (based on sprite.width, sprite.height)
    -** Processing line: ~  def source_rect state~
    +              x = s * coord_x
    +** Processing line: ~              y = s * coord_y~
     - Inside source: true
     *** True Line Result
    -  def source_rect state
    -** Processing line: ~    [0, 0, state.sprite.width, state.sprite.height]~
    +              y = s * coord_y
    +** Processing line: ~              {~
     - Inside source: true
     *** True Line Result
    -    [0, 0, state.sprite.width, state.sprite.height]
    -** Processing line: ~  end~
    +              {
    +** Processing line: ~                # The values added to x, y, and s position the world_collision_rects so they all appear~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                # The values added to x, y, and s position the world_collision_rects so they all appear
    +** Processing line: ~                # stacked (on top of world rects) but don't directly overlap.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +                # stacked (on top of world rects) but don't directly overlap.
    +** Processing line: ~                # Remove these added values and mess around with the rect placement!~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    +                # Remove these added values and mess around with the rect placement!
    +** Processing line: ~                args:       [coord_x, coord_y],~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Simple - main.rb~
    -- Header detected.
    +                args:       [coord_x, coord_y],
    +** Processing line: ~                left_right: [x,     y + 4, s,     s - 6], # hash keys and values~
    +- Inside source: true
     *** True Line Result
    -
    +                left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    +** Processing line: ~                top:        [x + 4, y + 6, s - 8, s - 6],~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Simple - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +                top:        [x + 4, y + 6, s - 8, s - 6],
    +** Processing line: ~                bottom:     [x + 1, y - 1, s - 2, s - 8],~
    +- Inside source: true
     *** True Line Result
    -
    +                bottom:     [x + 1, y - 1, s - 2, s - 8],
    +** Processing line: ~              }~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/01_simple/app/main.rb~
    +              }
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/01_simple/app/main.rb
    -** Processing line: ~  =begin~
    +            end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  =begin
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~    # Performs calculations to change the x and y values of the player's box.~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
    +    # Performs calculations to change the x and y values of the player's box.
    +** Processing line: ~    def calc_player~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +    def calc_player
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
    +** Processing line: ~      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array. The values generate a solid.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
    +      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.
    +** Processing line: ~      # What goes up must come down because of gravity.~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +      # What goes up must come down because of gravity.
    +** Processing line: ~      state.dy += state.gravity~
    +- Inside source: true
    +*** True Line Result
    +      state.dy += state.gravity
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~      # Calls the calc_box_collision and calc_edge_collision methods.~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      # Calls the calc_box_collision and calc_edge_collision methods.
    +** Processing line: ~      calc_box_collision~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app shows collisions between two boxes.~
    +      calc_box_collision
    +** Processing line: ~      calc_edge_collision~
     - Inside source: true
     *** True Line Result
    -  # This sample app shows collisions between two boxes.
    +      calc_edge_collision
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Runs methods needed for game to run properly.~
    +** Processing line: ~      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.~
     - Inside source: true
     *** True Line Result
    -  # Runs methods needed for game to run properly.
    -** Processing line: ~  def tick args~
    +      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.
    +** Processing line: ~      state.y += state.dy~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how to move a square over time and determine collision."~
    +      state.y += state.dy
    +** Processing line: ~      state.x += state.dx~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to move a square over time and determine collision."
    -** Processing line: ~    defaults args~
    +      state.x += state.dx
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +
    +** Processing line: ~      # Scales dx down.~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +      # Scales dx down.
    +** Processing line: ~      state.dx *= 0.8~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~  end~
    +      state.dx *= 0.8
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Sets default values.~
    +** Processing line: ~    # Calls methods needed to determine collisions between player and world_collision rects.~
     - Inside source: true
     *** True Line Result
    -  # Sets default values.
    -** Processing line: ~  def defaults args~
    +    # Calls methods needed to determine collisions between player and world_collision rects.
    +** Processing line: ~    def calc_box_collision~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    # These values represent the moving box.~
    +    def calc_box_collision
    +** Processing line: ~      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key~
     - Inside source: true
     *** True Line Result
    -    # These values represent the moving box.
    -** Processing line: ~    args.state.moving_box_speed   = 10~
    +      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    +** Processing line: ~      collision_floor!~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box_speed   = 10
    -** Processing line: ~    args.state.moving_box_size    = 100~
    +      collision_floor!
    +** Processing line: ~      collision_left!~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box_size    = 100
    -** Processing line: ~    args.state.moving_box_dx    ||=  1~
    +      collision_left!
    +** Processing line: ~      collision_right!~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box_dx    ||=  1
    -** Processing line: ~    args.state.moving_box_dy    ||=  1~
    +      collision_right!
    +** Processing line: ~      collision_ceiling!~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box_dy    ||=  1
    -** Processing line: ~    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height~
    +      collision_ceiling!
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box       ||= [0, 0, args.state.moving_box_size, args.state.moving_box_size] # moving_box_size is set as the width and height
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # These values represent the center box.~
    +** Processing line: ~    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -    # These values represent the center box.
    -** Processing line: ~    args.state.center_box ||= [540, 260, 200, 200, 180]~
    +    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    +** Processing line: ~    def collision_floor!~
     - Inside source: true
     *** True Line Result
    -    args.state.center_box ||= [540, 260, 200, 200, 180]
    -** Processing line: ~    args.state.center_box_collision ||= false # initially no collision~
    +    def collision_floor!
    +** Processing line: ~      return unless state.dy <= 0 # return unless player is going down or is as far down as possible~
     - Inside source: true
     *** True Line Result
    -    args.state.center_box_collision ||= false # initially no collision
    -** Processing line: ~  end~
    +      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    +** Processing line: ~      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player~
     - Inside source: true
     *** True Line Result
    -  end
    +      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render args~
    +** Processing line: ~      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    # If the game state denotes that a collision has occured,~
    +      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and
    +** Processing line: ~      # the top of a world_collision_rect (hence the "-0.1" above)~
     - Inside source: true
     *** True Line Result
    -    # If the game state denotes that a collision has occured,
    -** Processing line: ~    # render a solid square, otherwise render a border instead.~
    +      # the top of a world_collision_rect (hence the "-0.1" above)
    +** Processing line: ~      floor_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -    # render a solid square, otherwise render a border instead.
    -** Processing line: ~    if args.state.center_box_collision~
    +      floor_collisions = state.world_collision_rects
    +** Processing line: ~                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }~
     - Inside source: true
     *** True Line Result
    -    if args.state.center_box_collision
    -** Processing line: ~      args.outputs.solids << args.state.center_box~
    +                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }
    +** Processing line: ~                             .first~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << args.state.center_box
    -** Processing line: ~    else~
    +                             .first
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.outputs.borders << args.state.center_box~
    +
    +** Processing line: ~      return unless floor_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -      args.outputs.borders << args.state.center_box
    +      return unless floor_collisions # return unless collision occurred
    +** Processing line: ~      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect~
    +- Inside source: true
    +*** True Line Result
    +      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect
    +** Processing line: ~      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked~
    +- Inside source: true
    +*** True Line Result
    +      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -22480,242 +22903,218 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Then render the moving box.~
    -- Inside source: true
    -*** True Line Result
    -    # Then render the moving box.
    -** Processing line: ~    args.outputs.solids << args.state.moving_box~
    +** Processing line: ~    # Finds collisions between the player's left side and the right side of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.moving_box
    -** Processing line: ~  end~
    +    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    +** Processing line: ~    def collision_left!~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    def collision_left!
    +** Processing line: ~      return unless state.dx < 0 # return unless player is moving left~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Generally in a pipeline for a game engine, you have rendering,~
    +      return unless state.dx < 0 # return unless player is moving left
    +** Processing line: ~      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]~
     - Inside source: true
     *** True Line Result
    -  # Generally in a pipeline for a game engine, you have rendering,
    -** Processing line: ~  # game simulation (calculation), and input processing.~
    +      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # game simulation (calculation), and input processing.
    -** Processing line: ~  # This fuction represents the game simulation.~
    +
    +** Processing line: ~      # Goes through world_collision_rects to find all intersections beween the player's left side and the~
     - Inside source: true
     *** True Line Result
    -  # This fuction represents the game simulation.
    -** Processing line: ~  def calc args~
    +      # Goes through world_collision_rects to find all intersections beween the player's left side and the
    +** Processing line: ~      # right side of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    position_moving_box args~
    +      # right side of a world_collision_rect.
    +** Processing line: ~      left_side_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -    position_moving_box args
    -** Processing line: ~    determine_collision_center_box args~
    +      left_side_collisions = state.world_collision_rects
    +** Processing line: ~                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }~
     - Inside source: true
     *** True Line Result
    -    determine_collision_center_box args
    -** Processing line: ~  end~
    +                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    +** Processing line: ~                                 .first~
     - Inside source: true
     *** True Line Result
    -  end
    +                                 .first
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,~
    -- Inside source: true
    -*** True Line Result
    -  # Changes the position of the moving box on the screen by multiplying the change in x (dx) and change in y (dy) by the speed,
    -** Processing line: ~  # and adding it to the current position.~
    +** Processing line: ~      return unless left_side_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -  # and adding it to the current position.
    -** Processing line: ~  # dx and dy are positive if the box is moving right and up, respectively~
    +      return unless left_side_collisions # return unless collision occurred
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # dx and dy are positive if the box is moving right and up, respectively
    -** Processing line: ~  # dx and dy are negative if the box is moving left and down, respectively~
    +
    +** Processing line: ~      # player's x is set to the value of the x of the collided rect's right side~
     - Inside source: true
     *** True Line Result
    -  # dx and dy are negative if the box is moving left and down, respectively
    -** Processing line: ~  def position_moving_box args~
    +      # player's x is set to the value of the x of the collided rect's right side
    +** Processing line: ~      state.x = left_side_collisions[:left_right].right~
     - Inside source: true
     *** True Line Result
    -  def position_moving_box args
    -** Processing line: ~    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed~
    +      state.x = left_side_collisions[:left_right].right
    +** Processing line: ~      state.dx = 0 # player isn't moving left because its path is blocked~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box.x += args.state.moving_box_dx * args.state.moving_box_speed
    -** Processing line: ~    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed~
    +      state.dx = 0 # player isn't moving left because its path is blocked
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.moving_box.y += args.state.moving_box_dy * args.state.moving_box_speed
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # 1280x720 are the virtual pixels you work with (essentially 720p).~
    -- Inside source: true
    -*** True Line Result
    -    # 1280x720 are the virtual pixels you work with (essentially 720p).
    -** Processing line: ~    screen_width  = 1280~
    +** Processing line: ~    # Finds collisions between the right side of the player and the left side of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -    screen_width  = 1280
    -** Processing line: ~    screen_height = 720~
    +    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    +** Processing line: ~    def collision_right!~
     - Inside source: true
     *** True Line Result
    -    screen_height = 720
    -** Processing line: ~~
    +    def collision_right!
    +** Processing line: ~      return unless state.dx > 0 # return unless player is moving right~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Position of the box is denoted by the bottom left hand corner, in~
    +      return unless state.dx > 0 # return unless player is moving right
    +** Processing line: ~      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]~
     - Inside source: true
     *** True Line Result
    -    # Position of the box is denoted by the bottom left hand corner, in
    -** Processing line: ~    # that case, we have to subtract the width of the box so that it stays~
    +      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # that case, we have to subtract the width of the box so that it stays
    -** Processing line: ~    # in the scene (you can try deleting the subtraction to see how it~
    +
    +** Processing line: ~      # Goes through world_collision_rects to find all intersections between the player's right side~
     - Inside source: true
     *** True Line Result
    -    # in the scene (you can try deleting the subtraction to see how it
    -** Processing line: ~    # impacts the box's movement).~
    +      # Goes through world_collision_rects to find all intersections between the player's right side
    +** Processing line: ~      # and the left side of a world_collision_rect (hence the "+0.1" above)~
     - Inside source: true
     *** True Line Result
    -    # impacts the box's movement).
    -** Processing line: ~    if args.state.moving_box.x > screen_width - args.state.moving_box_size~
    +      # and the left side of a world_collision_rect (hence the "+0.1" above)
    +** Processing line: ~      right_side_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -    if args.state.moving_box.x > screen_width - args.state.moving_box_size
    -** Processing line: ~      args.state.moving_box_dx = -1 # moves left~
    +      right_side_collisions = state.world_collision_rects
    +** Processing line: ~                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }~
     - Inside source: true
     *** True Line Result
    -      args.state.moving_box_dx = -1 # moves left
    -** Processing line: ~    elsif args.state.moving_box.x < 0~
    +                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    +** Processing line: ~                                  .first~
     - Inside source: true
     *** True Line Result
    -    elsif args.state.moving_box.x < 0
    -** Processing line: ~      args.state.moving_box_dx =  1 # moves right~
    +                                  .first
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.moving_box_dx =  1 # moves right
    -** Processing line: ~    end~
    +
    +** Processing line: ~      return unless right_side_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -    end
    +      return unless right_side_collisions # return unless collision occurred
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Here, we're making sure the moving box remains within the vertical scope of the screen~
    -- Inside source: true
    -*** True Line Result
    -    # Here, we're making sure the moving box remains within the vertical scope of the screen
    -** Processing line: ~    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high~
    +** Processing line: ~      # player's x is set to the value of the collided rect's left, minus the size of a rect~
     - Inside source: true
     *** True Line Result
    -    if args.state.moving_box.y > screen_height - args.state.moving_box_size # if the box moves too high
    -** Processing line: ~      args.state.moving_box_dy = -1 # moves down~
    +      # player's x is set to the value of the collided rect's left, minus the size of a rect
    +** Processing line: ~      # tile size is subtracted because player's position is denoted by bottom left corner~
     - Inside source: true
     *** True Line Result
    -      args.state.moving_box_dy = -1 # moves down
    -** Processing line: ~    elsif args.state.moving_box.y < 0 # if the box moves too low~
    +      # tile size is subtracted because player's position is denoted by bottom left corner
    +** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size~
     - Inside source: true
     *** True Line Result
    -    elsif args.state.moving_box.y < 0 # if the box moves too low
    -** Processing line: ~      args.state.moving_box_dy =  1 # moves up~
    +      state.x = right_side_collisions[:left_right].left - state.tile_size
    +** Processing line: ~      state.dx = 0 # player isn't moving right because its path is blocked~
     - Inside source: true
     *** True Line Result
    -      args.state.moving_box_dy =  1 # moves up
    +      state.dx = 0 # player isn't moving right because its path is blocked
     ** 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 determine_collision_center_box args~
    -- Inside source: true
    -*** True Line Result
    -  def determine_collision_center_box args
    -** Processing line: ~    # Collision is handled by the engine. You simply have to call the~
    +** Processing line: ~    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -    # Collision is handled by the engine. You simply have to call the
    -** Processing line: ~    # `intersect_rect?` function.~
    +    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    +** Processing line: ~    def collision_ceiling!~
     - Inside source: true
     *** True Line Result
    -    # `intersect_rect?` function.
    -** Processing line: ~    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect~
    +    def collision_ceiling!
    +** Processing line: ~      return unless state.dy > 0 # return unless player is moving up~
     - Inside source: true
     *** True Line Result
    -    if args.state.moving_box.intersect_rect? args.state.center_box # if the two boxes intersect
    -** Processing line: ~      args.state.center_box_collision = true # then a collision happened~
    +      return unless state.dy > 0 # return unless player is moving up
    +** Processing line: ~      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]~
     - Inside source: true
     *** True Line Result
    -      args.state.center_box_collision = true # then a collision happened
    -** Processing line: ~    else~
    +      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.state.center_box_collision = false # otherwise, no collision happened~
    +
    +** Processing line: ~      # Goes through world_collision_rects to find intersections between the bottom of a~
     - Inside source: true
     *** True Line Result
    -      args.state.center_box_collision = false # otherwise, no collision happened
    -** Processing line: ~    end~
    +      # Goes through world_collision_rects to find intersections between the bottom of a
    +** Processing line: ~      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)
    +** Processing line: ~      ceil_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      ceil_collisions = state.world_collision_rects
    +** Processing line: ~                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }
    +** Processing line: ~                            .first~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +                            .first
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +
    +** Processing line: ~      return unless ceil_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      return unless ceil_collisions # return unless collision occurred
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +
    +** Processing line: ~      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect
    +** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +      state.y = ceil_collisions[:bottom].y - state.tile_size
    +** Processing line: ~      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -22724,318 +23123,286 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    -- Inside source: true
    -*** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    -- Inside source: true
    -*** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +** Processing line: ~    # Makes sure the player remains within the screen's dimensions.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +    # Makes sure the player remains within the screen's dimensions.
    +** Processing line: ~    def calc_edge_collision~
     - Inside source: true
     *** True Line Result
    -  end
    +    def calc_edge_collision
     ** 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: ~*** Physics And Collisions - Moving Objects - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Moving Objects - 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/04_physics_and_collisions/02_moving_objects/app/main.rb~
    +** Processing line: ~      #Ensures that the player doesn't fall below the map.~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/02_moving_objects/app/main.rb
    -** Processing line: ~  =begin~
    +      #Ensures that the player doesn't fall below the map.
    +** Processing line: ~      if state.y < 0~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      if state.y < 0
    +** Processing line: ~        state.y = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +        state.y = 0
    +** Processing line: ~        state.dy = 0~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +        state.dy = 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
    +** Processing line: ~      #Ensures that the player doesn't go too high.~
     - Inside source: true
     *** True Line Result
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -** Processing line: ~     using their keys.~
    +      #Ensures that the player doesn't go too high.
    +** Processing line: ~      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the~
     - Inside source: true
     *** True Line Result
    -     using their keys.
    -** Processing line: ~~
    +      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the
    +** Processing line: ~      # size of the player's box (so it remains visible on the screen)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
    +      # size of the player's box (so it remains visible on the screen)
    +** Processing line: ~      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen~
     - Inside source: true
     *** True Line Result
    -     For example, if we have a "numbers" hash that stores numbers in English as the
    -** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
    +      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen
    +** Processing line: ~        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen~
     - Inside source: true
     *** True Line Result
    -     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
    +        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen
    +** Processing line: ~        state.dy = 0~
     - Inside source: true
     *** True Line Result
    -     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -** Processing line: ~     and on it goes.~
    +        state.dy = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     and on it goes.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
    +** Processing line: ~      # Ensures that the player remains in the horizontal range that it is supposed to.~
     - Inside source: true
     *** True Line Result
    -     Now if we wanted to find the corresponding value of the "one" key, we could say
    -** Processing line: ~     puts numbers["one"]~
    +      # Ensures that the player remains in the horizontal range that it is supposed to.
    +** Processing line: ~      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right~
     - Inside source: true
     *** True Line Result
    -     puts numbers["one"]
    -** Processing line: ~     which would print "uno" to the console.~
    +      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right
    +** Processing line: ~        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen~
     - Inside source: true
     *** True Line Result
    -     which would print "uno" to the console.
    -** Processing line: ~~
    +        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - num1.greater(num2): Returns the greater value.~
    +        state.dx = 0
    +** Processing line: ~      elsif state.x <= 0 && state.dx < 0 # if player moves too far left~
     - Inside source: true
     *** True Line Result
    -   - num1.greater(num2): Returns the greater value.
    -** Processing line: ~     For example, if we have the command~
    +      elsif state.x <= 0 && state.dx < 0 # if player moves too far left
    +** Processing line: ~        state.x = 0 # player will remain as left as possible while remaining on screen~
     - Inside source: true
     *** True Line Result
    -     For example, if we have the command
    -** Processing line: ~     puts 4.greater(3)~
    +        state.x = 0 # player will remain as left as possible while remaining on screen
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -     puts 4.greater(3)
    -** Processing line: ~     the number 4 would be printed to the console since it has a greater value than 3.~
    +        state.dx = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     the number 4 would be printed to the console since it has a greater value than 3.
    -** Processing line: ~     Similar to lesser, which returns the lesser value.~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     Similar to lesser, which returns the lesser value.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - num1.lesser(num2): Finds the lower value of the given options.~
    -- Inside source: true
    -*** True Line Result
    -   - num1.lesser(num2): Finds the lower value of the given options.
    -** Processing line: ~     For example, in the statement~
    -- Inside source: true
    -*** True Line Result
    -     For example, in the statement
    -** Processing line: ~     a = 4.lesser(3)~
    +** Processing line: ~    # Processes input from the user on the keyboard.~
     - Inside source: true
     *** True Line Result
    -     a = 4.lesser(3)
    -** Processing line: ~     3 has a lower value than 4, which means that the value of a would be set to 3,~
    +    # Processes input from the user on the keyboard.
    +** Processing line: ~    def process_inputs~
     - Inside source: true
     *** True Line Result
    -     3 has a lower value than 4, which means that the value of a would be set to 3,
    -** Processing line: ~     but if the statement had been~
    +    def process_inputs
    +** Processing line: ~      if inputs.mouse.down~
     - Inside source: true
     *** True Line Result
    -     but if the statement had been
    -** Processing line: ~     a = 4.lesser(5)~
    +      if inputs.mouse.down
    +** Processing line: ~        state.world_lookup = {}~
     - Inside source: true
     *** True Line Result
    -     a = 4.lesser(5)
    -** Processing line: ~     4 has a lower value than 5, which means that the value of a would be set to 4.~
    +        state.world_lookup = {}
    +** Processing line: ~        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid~
     - Inside source: true
     *** True Line Result
    -     4 has a lower value than 5, which means that the value of a would be set to 4.
    +        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
    -- Inside source: true
    -*** True Line Result
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -** Processing line: ~     For example, you can derive an array of odd numbers from an original array of~
    +** Processing line: ~        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate~
     - Inside source: true
     *** True Line Result
    -     For example, you can derive an array of odd numbers from an original array of
    -** Processing line: ~     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).~
    +        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate
    +** Processing line: ~          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space~
     - Inside source: true
     *** True Line Result
    -     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
    -** Processing line: ~~
    +          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
    +        else
    +** Processing line: ~          state.world << [x, y] # If no duplicates, adds to world collection~
     - Inside source: true
     *** True Line Result
    -   - find_all: Finds all values that satisfy specific requirements.
    -** Processing line: ~     For example, you can find all elements of a collection that are divisible by 2~
    +          state.world << [x, y] # If no duplicates, adds to world collection
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -     For example, you can find all elements of a collection that are divisible by 2
    -** Processing line: ~     or find all objects that have intersected with another object.~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     or find all objects that have intersected with another object.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - abs: Returns the absolute value.~
    +** Processing line: ~      # Sets dx to 0 if the player lets go of arrow keys.~
     - Inside source: true
     *** True Line Result
    -   - abs: Returns the absolute value.
    -** Processing line: ~     For example, the command~
    +      # Sets dx to 0 if the player lets go of arrow keys.
    +** Processing line: ~      if inputs.keyboard.key_up.right~
     - Inside source: true
     *** True Line Result
    -     For example, the command
    -** Processing line: ~     (-30).abs~
    +      if inputs.keyboard.key_up.right
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -     (-30).abs
    -** Processing line: ~     would return 30 as a result.~
    +        state.dx = 0
    +** Processing line: ~      elsif inputs.keyboard.key_up.left~
     - Inside source: true
     *** True Line Result
    -     would return 30 as a result.
    -** Processing line: ~~
    +      elsif inputs.keyboard.key_up.left
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
    +        state.dx = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -** Processing line: ~     each element by 2 or declaring every element as a new entity.~
    +
    +** Processing line: ~      # Sets dx to 3 in whatever direction the player chooses.~
     - Inside source: true
     *** True Line Result
    -     each element by 2 or declaring every element as a new entity.
    -** Processing line: ~~
    +      # Sets dx to 3 in whatever direction the player chooses.
    +** Processing line: ~      if inputs.keyboard.key_held.right # if right key is pressed~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +      if inputs.keyboard.key_held.right # if right key is pressed
    +** Processing line: ~        state.dx =  3~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +        state.dx =  3
    +** Processing line: ~      elsif inputs.keyboard.key_held.left # if left key is pressed~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.keyboard.KEY: Determines if a key has been pressed.~
    +      elsif inputs.keyboard.key_held.left # if left key is pressed
    +** Processing line: ~        state.dx = -3~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.keyboard.KEY: Determines if a key has been pressed.
    -** Processing line: ~     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.~
    +        state.dx = -3
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     For more information about the keyboard, take a look at mygame/documentation/06-keyboard.md.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
    +** Processing line: ~      #Sets dy to 5 to make the player ~fly~ when they press the space bar~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    -** Processing line: ~~
    +      #Sets dy to 5 to make the player ~fly~ when they press the space bar
    +** Processing line: ~      if inputs.keyboard.key_held.space~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
    +      if inputs.keyboard.key_held.space
    +** Processing line: ~        state.dy = 5~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array. The values generate a solid.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
    +        state.dy = 5
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    -** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~    def to_coord point~
     - Inside source: true
     *** True Line Result
    -  =end
    +    def to_coord point
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Calls methods needed for game to run properly~
    +** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
     - Inside source: true
     *** True Line Result
    -  # Calls methods needed for game to run properly
    -** Processing line: ~  def tick args~
    +      # Integer divides (idiv) point.x to turn into grid
    +** Processing line: ~      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."~
    +      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.
    +** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."
    -** Processing line: ~    defaults args~
    +      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +
    +** Processing line: ~    # Represents the tolerance for a collision between the player's rect and another rect.~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~    input args~
    +    # Represents the tolerance for a collision between the player's rect and another rect.
    +** Processing line: ~    def collision_tollerance~
     - Inside source: true
     *** True Line Result
    -    input args
    +    def collision_tollerance
    +** Processing line: ~      0.0~
    +- Inside source: true
    +*** True Line Result
    +      0.0
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -23044,90 +23411,98 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # sets default values and creates empty collections~
    +** Processing line: ~  $platformer_physics = PoorManPlatformerPhysics.new~
     - Inside source: true
     *** True Line Result
    -  # sets default values and creates empty collections
    -** Processing line: ~  # initialization only happens in the first frame~
    +  $platformer_physics = PoorManPlatformerPhysics.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # initialization only happens in the first frame
    -** Processing line: ~  def defaults args~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    fiddle args~
    +  def tick args
    +** Processing line: ~    $platformer_physics.grid    = args.grid~
     - Inside source: true
     *** True Line Result
    -    fiddle args
    -** Processing line: ~    args.state.enemy.hammers ||= []~
    +    $platformer_physics.grid    = args.grid
    +** Processing line: ~    $platformer_physics.inputs  = args.inputs~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammers ||= []
    -** Processing line: ~    args.state.enemy.hammer_queue ||= []~
    +    $platformer_physics.inputs  = args.inputs
    +** Processing line: ~    $platformer_physics.state    = args.state~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammer_queue ||= []
    -** Processing line: ~    args.state.tick_count = args.state.tick_count~
    +    $platformer_physics.state    = args.state
    +** Processing line: ~    $platformer_physics.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -    args.state.tick_count = args.state.tick_count
    -** Processing line: ~    args.state.bridge_top = 128~
    +    $platformer_physics.outputs = args.outputs
    +** Processing line: ~    $platformer_physics.tick~
     - Inside source: true
     *** True Line Result
    -    args.state.bridge_top = 128
    -** Processing line: ~    args.state.player.x  ||= 0                        # initializes player's properties~
    +    $platformer_physics.tick
    +** Processing line: ~    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x  ||= 0                        # initializes player's properties
    -** Processing line: ~    args.state.player.y  ||= args.state.bridge_top~
    +    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y  ||= args.state.bridge_top
    -** Processing line: ~    args.state.player.w  ||= 64~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.player.w  ||= 64
    -** Processing line: ~    args.state.player.h  ||= 64~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -    args.state.player.h  ||= 64
    -** Processing line: ~    args.state.player.dy ||= 0~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -    args.state.player.dy ||= 0
    -** Processing line: ~    args.state.player.dx ||= 0~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -    args.state.player.dx ||= 0
    -** Processing line: ~    args.state.enemy.x   ||= 800                      # initializes enemy's properties~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.x   ||= 800                      # initializes enemy's properties
    -** Processing line: ~    args.state.enemy.y   ||= 0~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.y   ||= 0
    -** Processing line: ~    args.state.enemy.w   ||= 128~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.w   ||= 128
    -** Processing line: ~    args.state.enemy.h   ||= 128~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.h   ||= 128
    -** Processing line: ~    args.state.enemy.dy  ||= 0~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.dy  ||= 0
    -** Processing line: ~    args.state.enemy.dx  ||= 0~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.dx  ||= 0
    -** Processing line: ~    args.state.game_over_at ||= 0~
    +
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -    args.state.game_over_at ||= 0
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -23136,310 +23511,282 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # sets enemy, player, hammer values~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  # sets enemy, player, hammer values
    -** Processing line: ~  def fiddle args~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -  def fiddle args
    -** Processing line: ~    args.state.gravity                     = -0.3~
    -- Inside source: true
    +
    +** Processing line: ~*** Physics And Collisions - Box Collision 2 - main.rb~
    +- Header detected.
     *** True Line Result
    -    args.state.gravity                     = -0.3
    -** Processing line: ~    args.state.enemy_jump_power            = 10       # sets enemy values~
    -- Inside source: true
    +
     *** True Line Result
    -    args.state.enemy_jump_power            = 10       # sets enemy values
    -** Processing line: ~    args.state.enemy_jump_interval         = 60~
    -- Inside source: true
    +*** Physics And Collisions - Box Collision 2 - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -    args.state.enemy_jump_interval         = 60
    -** Processing line: ~    args.state.hammer_throw_interval       = 40       # sets hammer values~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_throw_interval       = 40       # sets hammer values
    -** Processing line: ~    args.state.hammer_launch_power_default = 5~
    +  # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_launch_power_default = 5
    -** Processing line: ~    args.state.hammer_launch_power_near    = 2~
    +  =begin
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_launch_power_near    = 2
    -** Processing line: ~    args.state.hammer_launch_power_far     = 7~
    +   APIs listing that haven't been encountered in previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_launch_power_far     = 7
    -** Processing line: ~    args.state.hammer_upward_launch_power  = 15~
    +
    +** Processing line: ~   - times: Performs an action a specific number of times.~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_upward_launch_power  = 15
    -** Processing line: ~    args.state.max_hammers_per_volley      = 10~
    +   - times: Performs an action a specific number of times.
    +** Processing line: ~     For example, if we said~
     - Inside source: true
     *** True Line Result
    -    args.state.max_hammers_per_volley      = 10
    -** Processing line: ~    args.state.gap_between_hammers         = 10~
    +     For example, if we said
    +** Processing line: ~     5.times puts "Hello DragonRuby",~
     - Inside source: true
     *** True Line Result
    -    args.state.gap_between_hammers         = 10
    -** Processing line: ~    args.state.player_jump_power           = 10       # sets player values~
    +     5.times puts "Hello DragonRuby",
    +** Processing line: ~     then we'd see the words "Hello DragonRuby" printed on the console 5 times.~
     - Inside source: true
     *** True Line Result
    -    args.state.player_jump_power           = 10       # sets player values
    -** Processing line: ~    args.state.player_jump_power_duration  = 10~
    +     then we'd see the words "Hello DragonRuby" printed on the console 5 times.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.player_jump_power_duration  = 10
    -** Processing line: ~    args.state.player_max_run_speed        = 10~
    +
    +** Processing line: ~   - split: Divides a string into substrings based on a delimiter.~
     - Inside source: true
     *** True Line Result
    -    args.state.player_max_run_speed        = 10
    -** Processing line: ~    args.state.player_speed_slowdown_rate  = 0.9~
    +   - split: Divides a string into substrings based on a delimiter.
    +** Processing line: ~     For example, if we had a command~
     - Inside source: true
     *** True Line Result
    -    args.state.player_speed_slowdown_rate  = 0.9
    -** Processing line: ~    args.state.player_acceleration         = 1~
    +     For example, if we had a command
    +** Processing line: ~     "DragonRuby is awesome".split(" ")~
     - Inside source: true
     *** True Line Result
    -    args.state.player_acceleration         = 1
    -** Processing line: ~    args.state.hammer_size                 = 32~
    +     "DragonRuby is awesome".split(" ")
    +** Processing line: ~     then the result would be~
     - Inside source: true
     *** True Line Result
    -    args.state.hammer_size                 = 32
    -** Processing line: ~  end~
    +     then the result would be
    +** Processing line: ~     ["DragonRuby", "is", "awesome"] because the words are separated by a space delimiter.~
     - Inside source: true
     *** True Line Result
    -  end
    +     ["DragonRuby", "is", "awesome"] because the words are separated by a space delimiter.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # outputs objects onto the screen~
    +** Processing line: ~   - join: Opposite of split; converts each element of array to a string separated by delimiter.~
     - Inside source: true
     *** True Line Result
    -  # outputs objects onto the screen
    -** Processing line: ~  def render args~
    +   - join: Opposite of split; converts each element of array to a string separated by delimiter.
    +** Processing line: ~     For example, if we had a command~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge~
    +     For example, if we had a command
    +** Processing line: ~     ["DragonRuby","is","awesome"].join(" ")~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge
    -** Processing line: ~      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)~
    +     ["DragonRuby","is","awesome"].join(" ")
    +** Processing line: ~     then the result would be~
     - Inside source: true
     *** True Line Result
    -      # sets x by multiplying 64 to index to find pixel value (places all squares side by side)
    -** Processing line: ~      # subtracts 64 from bridge_top because position is denoted by bottom left corner~
    +     then the result would be
    +** Processing line: ~     "DragonRuby is awesome".~
     - Inside source: true
     *** True Line Result
    -      # subtracts 64 from bridge_top because position is denoted by bottom left corner
    -** Processing line: ~      [i * 64, args.state.bridge_top - 64, 64, 64]~
    +     "DragonRuby is awesome".
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [i * 64, args.state.bridge_top - 64, 64, 64]
    -** Processing line: ~    end~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -    end
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]~
    +** Processing line: ~   - to_s: Returns a string representation of an object.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0]
    -** Processing line: ~    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)~
    +   - to_s: Returns a string representation of an object.
    +** Processing line: ~     For example, if we had~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] # outputs player onto screen (red box)
    -** Processing line: ~    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)~
    +     For example, if we had
    +** Processing line: ~     500.to_s~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] # outputs enemy onto screen (green box)
    -** Processing line: ~    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen~
    +     500.to_s
    +** Processing line: ~     the string "500" would be returned.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.enemy.hammers # outputs enemy's hammers onto screen
    -** Processing line: ~  end~
    +     the string "500" would be returned.
    +** Processing line: ~     Similar to to_i, which returns an integer representation of an object.~
     - Inside source: true
     *** True Line Result
    -  end
    +     Similar to to_i, which returns an integer representation of an object.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Performs calculations to move objects on the screen~
    -- Inside source: true
    -*** True Line Result
    -  # Performs calculations to move objects on the screen
    -** Processing line: ~  def calc args~
    +** Processing line: ~   - elapsed_time: How many frames have passed since the click event.~
     - Inside source: true
     *** True Line Result
    -  def calc args
    +   - elapsed_time: How many frames have passed since the click event.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.~
    +** Processing line: ~   - args.outputs.labels: An array. Values in the array generate labels on the screen.~
     - Inside source: true
     *** True Line Result
    -    # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.
    -** Processing line: ~    args.state.player.x  += args.state.player.dx~
    +   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    +** Processing line: ~     The parameters are: [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x  += args.state.player.dx
    -** Processing line: ~    args.state.player.y  += args.state.player.dy~
    +     The parameters are: [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y  += args.state.player.dy
    +     For more information about labels, go to mygame/documentation/02-labels.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Since acceleration is the change in velocity, the change in y (dy) increases every frame~
    +** Processing line: ~   - inputs.mouse.down: Determines whether or not the mouse is being pressed down.~
     - Inside source: true
     *** True Line Result
    -    # Since acceleration is the change in velocity, the change in y (dy) increases every frame
    -** Processing line: ~    args.state.player.dy += args.state.gravity~
    +   - inputs.mouse.down: Determines whether or not the mouse is being pressed down.
    +** Processing line: ~     The position of the mouse when it is pressed down can be found using inputs.mouse.down.point.(x|y).~
     - Inside source: true
     *** True Line Result
    -    args.state.player.dy += args.state.gravity
    +     The position of the mouse when it is pressed down can be found using inputs.mouse.down.point.(x|y).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # player's y position is either current y position or y position of top of~
    -- Inside source: true
    -*** True Line Result
    -    # player's y position is either current y position or y position of top of
    -** Processing line: ~    # bridge, whichever has a greater value~
    -- Inside source: true
    -*** True Line Result
    -    # bridge, whichever has a greater value
    -** Processing line: ~    # ensures that the player never goes below the bridge~
    -- Inside source: true
    -*** True Line Result
    -    # ensures that the player never goes below the bridge
    -** Processing line: ~    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)~
    +** Processing line: ~   - first: Returns the first element of the array.~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y  = args.state.player.y.greater(args.state.bridge_top)
    +   - first: Returns the first element of the array.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # player's x position is either the current x position or 0, whichever has a greater value~
    +** Processing line: ~   - num1.idiv(num2): Divides two numbers and returns an integer.~
     - Inside source: true
     *** True Line Result
    -    # player's x position is either the current x position or 0, whichever has a greater value
    -** Processing line: ~    # ensures that the player doesn't go too far left (out of the screen's scope)~
    +   - num1.idiv(num2): Divides two numbers and returns an integer.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # ensures that the player doesn't go too far left (out of the screen's scope)
    -** Processing line: ~    args.state.player.x  = args.state.player.x.greater(0)~
    +
    +** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x  = args.state.player.x.greater(0)
    +   - find_all: Finds all values that satisfy specific requirements.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # player is not falling if it is located on the top of the bridge~
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -    # player is not falling if it is located on the top of the bridge
    -** Processing line: ~    args.state.player.falling = false if args.state.player.y == args.state.bridge_top~
    +   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.player.falling = false if args.state.player.y == args.state.bridge_top
    -** Processing line: ~    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player~
    +
    +** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -    args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player
    +   - reject: Removes elements from a collection if they meet certain requirements.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx~
    +** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.x += args.state.enemy.dx # velocity; change in x increases by dx
    -** Processing line: ~    args.state.enemy.y += args.state.enemy.dy # same with y and dy~
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.y += args.state.enemy.dy # same with y and dy
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # ensures that the enemy never goes below the bridge~
    -- Inside source: true
    -*** True Line Result
    -    # ensures that the enemy never goes below the bridge
    -** Processing line: ~    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # ensures that the enemy never goes too far left (outside the screen's scope)~
    -- Inside source: true
    -*** True Line Result
    -    # ensures that the enemy never goes too far left (outside the screen's scope)
    -** Processing line: ~    args.state.enemy.x  = args.state.enemy.x.greater(0)~
    +** Processing line: ~  MAP_FILE_PATH = 'app/map.txt' # the map.txt file in the app folder contains exported map~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.x  = args.state.enemy.x.greater(0)
    +  MAP_FILE_PATH = 'app/map.txt' # the map.txt file in the app folder contains exported map
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # objects that go up must come down because of gravity~
    +** Processing line: ~  class MetroidvaniaStarter~
     - Inside source: true
     *** True Line Result
    -    # objects that go up must come down because of gravity
    -** Processing line: ~    args.state.enemy.dy += args.state.gravity~
    +  class MetroidvaniaStarter
    +** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs, :gtk~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.dy += args.state.gravity
    +    attr_accessor :grid, :inputs, :state, :outputs, :gtk
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)~
    +** Processing line: ~    # Calls methods needed to run the game properly.~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.y  = args.state.enemy.y.greater(args.state.bridge_top)
    -** Processing line: ~~
    +    # Calls methods needed to run the game properly.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #sets definition of enemy~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -    #sets definition of enemy
    -** Processing line: ~    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w]
    -** Processing line: ~~
    +      render
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge~
    -- Inside source: true
    -*** True Line Result
    -    if args.state.enemy.y == args.state.bridge_top # if enemy is located on the top of the bridge
    -** Processing line: ~      args.state.enemy.dy = 0 # there is no change in y~
    +      calc
    +** Processing line: ~      process_inputs~
     - Inside source: true
     *** True Line Result
    -      args.state.enemy.dy = 0 # there is no change in y
    +      process_inputs
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -23448,402 +23795,390 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # if 60 frames have passed and the enemy is not moving vertically~
    -- Inside source: true
    -*** True Line Result
    -    # if 60 frames have passed and the enemy is not moving vertically
    -** Processing line: ~    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0~
    +** Processing line: ~    # Sets all the default variables.~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0
    -** Processing line: ~      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up~
    +    # Sets all the default variables.
    +** Processing line: ~    # '||' states that initialization occurs only in the first frame.~
     - Inside source: true
     *** True Line Result
    -      args.state.enemy.dy = args.state.enemy_jump_power # the enemy jumps up
    -** Processing line: ~    end~
    +    # '||' states that initialization occurs only in the first frame.
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    def defaults
    +** Processing line: ~      state.tile_size                = 64~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # if 40 frames have passed or 5 frames have passed since the game ended~
    +      state.tile_size                = 64
    +** Processing line: ~      state.gravity                  = -0.2~
     - Inside source: true
     *** True Line Result
    -    # if 40 frames have passed or 5 frames have passed since the game ended
    -** Processing line: ~    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5~
    +      state.gravity                  = -0.2
    +** Processing line: ~      state.player_width             = 60~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5
    -** Processing line: ~      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)~
    +      state.player_width             = 60
    +** Processing line: ~      state.player_height            = 64~
     - Inside source: true
     *** True Line Result
    -      # rand will return a number greater than or equal to 0 and less than given variable's value (since max is excluded)
    -** Processing line: ~      # that is why we're adding 1, to include the max possibility~
    +      state.player_height            = 64
    +** Processing line: ~      state.collision_tolerance      = 0.0~
     - Inside source: true
     *** True Line Result
    -      # that is why we're adding 1, to include the max possibility
    -** Processing line: ~      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)~
    +      state.collision_tolerance      = 0.0
    +** Processing line: ~      state.previous_tile_size     ||= state.tile_size~
     - Inside source: true
     *** True Line Result
    -      volley_dx   = (rand(args.state.hammer_launch_power_default) + 1) * -1 # horizontal movement (follow order of operations)
    -** Processing line: ~~
    +      state.previous_tile_size     ||= state.tile_size
    +** Processing line: ~      state.x                      ||= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # if the horizontal distance between the player and enemy is less than 128 pixels~
    +      state.x                      ||= 0
    +** Processing line: ~      state.y                      ||= 800~
     - Inside source: true
     *** True Line Result
    -      # if the horizontal distance between the player and enemy is less than 128 pixels
    -** Processing line: ~      if (args.state.player.x - args.state.enemy.x).abs < 128~
    +      state.y                      ||= 800
    +** Processing line: ~      state.dy                     ||= 0~
     - Inside source: true
     *** True Line Result
    -      if (args.state.player.x - args.state.enemy.x).abs < 128
    -** Processing line: ~        # the change in x won't be that great since the enemy and player are closer to each other~
    +      state.dy                     ||= 0
    +** Processing line: ~      state.dx                     ||= 0~
     - Inside source: true
     *** True Line Result
    -        # the change in x won't be that great since the enemy and player are closer to each other
    -** Processing line: ~        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1~
    +      state.dx                     ||= 0
    +** Processing line: ~      attempt_load_world_from_file~
     - Inside source: true
     *** True Line Result
    -        volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1
    -** Processing line: ~      end~
    +      attempt_load_world_from_file
    +** Processing line: ~      state.world_lookup           ||= { }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      state.world_lookup           ||= { }
    +** Processing line: ~      state.world_collision_rects  ||= []~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # if the horizontal distance between the player and enemy is greater than 300 pixels~
    +      state.world_collision_rects  ||= []
    +** Processing line: ~      state.mode                   ||= :creating # alternates between :creating and :selecting for sprite selection~
     - Inside source: true
     *** True Line Result
    -      # if the horizontal distance between the player and enemy is greater than 300 pixels
    -** Processing line: ~      if (args.state.player.x - args.state.enemy.x).abs > 300~
    +      state.mode                   ||= :creating # alternates between :creating and :selecting for sprite selection
    +** Processing line: ~      state.select_menu            ||= [0, 720, 1280, 720]~
     - Inside source: true
     *** True Line Result
    -      if (args.state.player.x - args.state.enemy.x).abs > 300
    -** Processing line: ~        # change in x will be more drastic since player and enemy are so far apart~
    +      state.select_menu            ||= [0, 720, 1280, 720]
    +** Processing line: ~      #=======================================IMPORTANT=======================================#~
     - Inside source: true
     *** True Line Result
    -        # change in x will be more drastic since player and enemy are so far apart
    -** Processing line: ~        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change~
    +      #=======================================IMPORTANT=======================================#
    +** Processing line: ~      # When adding sprites, please label them "image1.png", "image2.png", image3".png", etc.~
     - Inside source: true
     *** True Line Result
    -        volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 # more drastic change
    -** Processing line: ~      end~
    +      # When adding sprites, please label them "image1.png", "image2.png", image3".png", etc.
    +** Processing line: ~      # Once you have done that, adjust "state.sprite_quantity" to how many sprites you have.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      # Once you have done that, adjust "state.sprite_quantity" to how many sprites you have.
    +** Processing line: ~      #=======================================================================================#~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|~
    +      #=======================================================================================#
    +** Processing line: ~      state.sprite_quantity        ||= 20 # IMPORTANT TO ALTER IF SPRITES ADDED IF YOU ADD MORE SPRITES~
     - Inside source: true
     *** True Line Result
    -      (rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i|
    -** Processing line: ~        args.state.enemy.hammer_queue << { # stores hammer values in a hash~
    +      state.sprite_quantity        ||= 20 # IMPORTANT TO ALTER IF SPRITES ADDED IF YOU ADD MORE SPRITES
    +** Processing line: ~      state.sprite_coords          ||= []~
     - Inside source: true
     *** True Line Result
    -        args.state.enemy.hammer_queue << { # stores hammer values in a hash
    -** Processing line: ~          x: args.state.enemy.x,~
    +      state.sprite_coords          ||= []
    +** Processing line: ~      state.banner_coords          ||= [640, 680 + 720]~
     - Inside source: true
     *** True Line Result
    -          x: args.state.enemy.x,
    -** Processing line: ~          w: args.state.hammer_size,~
    +      state.banner_coords          ||= [640, 680 + 720]
    +** Processing line: ~      state.sprite_selected        ||= 1~
     - Inside source: true
     *** True Line Result
    -          w: args.state.hammer_size,
    -** Processing line: ~          h: args.state.hammer_size,~
    +      state.sprite_selected        ||= 1
    +** Processing line: ~      state.map_saved_at           ||= 0~
     - Inside source: true
     *** True Line Result
    -          h: args.state.hammer_size,
    -** Processing line: ~          dx: volley_dx, # change in horizontal position~
    +      state.map_saved_at           ||= 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          dx: volley_dx, # change in horizontal position
    -** Processing line: ~          # multiplication operator takes precedence over addition operator~
    +
    +** Processing line: ~      # Sets all the cordinate values for the sprite selection screen into a grid~
     - Inside source: true
     *** True Line Result
    -          # multiplication operator takes precedence over addition operator
    -** Processing line: ~          throw_at: args.state.tick_count + i * args.state.gap_between_hammers~
    +      # Sets all the cordinate values for the sprite selection screen into a grid
    +** Processing line: ~      # Displayed when 's' is pressed by player to access sprites~
     - Inside source: true
     *** True Line Result
    -          throw_at: args.state.tick_count + i * args.state.gap_between_hammers
    -** Processing line: ~        }~
    +      # Displayed when 's' is pressed by player to access sprites
    +** Processing line: ~      if state.sprite_coords == [] # if sprite_coords is an empty array~
     - Inside source: true
     *** True Line Result
    -        }
    -** Processing line: ~      end~
    +      if state.sprite_coords == [] # if sprite_coords is an empty array
    +** Processing line: ~        count = 1~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +        count = 1
    +** Processing line: ~        temp_x = 165 # sets a starting x and y position for display~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        temp_x = 165 # sets a starting x and y position for display
    +** Processing line: ~        temp_y = 500 + 720~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # add elements from hammer_queue collection to the hammers collection by~
    +        temp_y = 500 + 720
    +** Processing line: ~        state.sprite_quantity.times do # for the number of sprites you have~
     - Inside source: true
     *** True Line Result
    -    # add elements from hammer_queue collection to the hammers collection by
    -** Processing line: ~    # finding all hammers that were thrown before the current frame (have already been thrown)~
    +        state.sprite_quantity.times do # for the number of sprites you have
    +** Processing line: ~          state.sprite_coords += [[temp_x, temp_y, count]] # add element to sprite_coords array~
     - Inside source: true
     *** True Line Result
    -    # finding all hammers that were thrown before the current frame (have already been thrown)
    -** Processing line: ~    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|~
    +          state.sprite_coords += [[temp_x, temp_y, count]] # add element to sprite_coords array
    +** Processing line: ~          temp_x += 100 # increment temp_x~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h|
    -** Processing line: ~      h[:throw_at] < args.state.tick_count~
    +          temp_x += 100 # increment temp_x
    +** Processing line: ~          count += 1 # increment count~
     - Inside source: true
     *** True Line Result
    -      h[:throw_at] < args.state.tick_count
    -** Processing line: ~    end~
    +          count += 1 # increment count
    +** Processing line: ~          if temp_x > 1280 - (165 + 50) # if exceeding specific horizontal width on screen~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          if temp_x > 1280 - (165 + 50) # if exceeding specific horizontal width on screen
    +** Processing line: ~            temp_x = 165 # a new row of sprites starts~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection~
    +            temp_x = 165 # a new row of sprites starts
    +** Processing line: ~            temp_y -= 75 # new row of sprites starts 75 units lower than the previous row~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammers.each do |h| # sets values for all hammers in collection
    -** Processing line: ~      h[:y]  ||= args.state.enemy.y + 130~
    +            temp_y -= 75 # new row of sprites starts 75 units lower than the previous row
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -      h[:y]  ||= args.state.enemy.y + 130
    -** Processing line: ~      h[:dy] ||= args.state.hammer_upward_launch_power~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      h[:dy] ||= args.state.hammer_upward_launch_power
    -** Processing line: ~      h[:dy]  += args.state.gravity # acceleration is change in gravity~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      h[:dy]  += args.state.gravity # acceleration is change in gravity
    -** Processing line: ~      h[:x]   += h[:dx] # incremented by change in position~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      h[:x]   += h[:dx] # incremented by change in position
    -** Processing line: ~      h[:y]   += h[:dy]~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      h[:y]   += h[:dy]
    -** Processing line: ~      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect~
    +
    +** Processing line: ~    # Places sprites~
     - Inside source: true
     *** True Line Result
    -      h[:rect] = [h[:x], h[:y], h[:w], h[:h]] # sets definition of hammer's rect
    -** Processing line: ~    end~
    +    # Places sprites
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -    end
    +    def render
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # reject hammers that have been thrown before current frame (have already been thrown)~
    +** Processing line: ~      # Sets the x, y, width, height, and image path for each sprite in the world collection.~
     - Inside source: true
     *** True Line Result
    -    # reject hammers that have been thrown before current frame (have already been thrown)
    -** Processing line: ~    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|~
    +      # Sets the x, y, width, height, and image path for each sprite in the world collection.
    +** Processing line: ~      outputs.sprites << state.world.map do |x, y, sprite|~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h|
    -** Processing line: ~      h[:throw_at] < args.state.tick_count~
    +      outputs.sprites << state.world.map do |x, y, sprite|
    +** Processing line: ~        [x * state.tile_size, # multiply by size so grid coordinates; pixel value of location~
     - Inside source: true
     *** True Line Result
    -      h[:throw_at] < args.state.tick_count
    -** Processing line: ~    end~
    +        [x * state.tile_size, # multiply by size so grid coordinates; pixel value of location
    +** Processing line: ~         y * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +         y * state.tile_size,
    +** Processing line: ~         state.tile_size,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # any hammers with a y position less than 0 are rejected from the hammers collection~
    +         state.tile_size,
    +** Processing line: ~         state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    # any hammers with a y position less than 0 are rejected from the hammers collection
    -** Processing line: ~    # since they have gone too far down (outside the scope's screen)~
    +         state.tile_size,
    +** Processing line: ~         'sprites/image' + sprite.to_s + '.png'] # uses concatenation to create unique image path~
     - Inside source: true
     *** True Line Result
    -    # since they have gone too far down (outside the scope's screen)
    -** Processing line: ~    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }~
    +         'sprites/image' + sprite.to_s + '.png'] # uses concatenation to create unique image path
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 }
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # if there are any hammers that intersect with (or hit) the player,~
    +** Processing line: ~      # Outputs sprite for the player by setting x, y, width, height, and image path~
     - Inside source: true
     *** True Line Result
    -    # if there are any hammers that intersect with (or hit) the player,
    -** Processing line: ~    # the reset_player method is called (so the game can start over)~
    +      # Outputs sprite for the player by setting x, y, width, height, and image path
    +** Processing line: ~      outputs.sprites << [state.x,~
     - Inside source: true
     *** True Line Result
    -    # the reset_player method is called (so the game can start over)
    -** Processing line: ~    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }~
    +      outputs.sprites << [state.x,
    +** Processing line: ~                          state.y,~
     - Inside source: true
     *** True Line Result
    -    if args.state.enemy.hammers.any? { |h| h[:rect].intersect_rect?(args.state.player.rect) }
    -** Processing line: ~      reset_player args~
    +                          state.y,
    +** Processing line: ~                          state.player_width,~
     - Inside source: true
     *** True Line Result
    -      reset_player args
    -** Processing line: ~    end~
    +                          state.player_width,
    +** Processing line: ~                          state.player_height,'sprites/player.png']~
     - Inside source: true
     *** True Line Result
    -    end
    +                          state.player_height,'sprites/player.png']
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # if the enemy's rect intersects with (or hits) the player,~
    +** Processing line: ~      # Outputs labels as primitives in top right of the screen~
     - Inside source: true
     *** True Line Result
    -    # if the enemy's rect intersects with (or hits) the player,
    -** Processing line: ~    # the reset_player method is called (so the game can start over)~
    +      # Outputs labels as primitives in top right of the screen
    +** Processing line: ~      outputs.primitives << [920, 700, 'Press \'s\' to access sprites.', 1, 0].label~
     - Inside source: true
     *** True Line Result
    -    # the reset_player method is called (so the game can start over)
    -** Processing line: ~    if args.state.enemy.rect.intersect_rect? args.state.player.rect~
    +      outputs.primitives << [920, 700, 'Press \'s\' to access sprites.', 1, 0].label
    +** Processing line: ~      outputs.primitives << [920, 675, 'Click existing sprite to delete.', 1, 0].label~
     - Inside source: true
     *** True Line Result
    -    if args.state.enemy.rect.intersect_rect? args.state.player.rect
    -** Processing line: ~      reset_player args~
    +      outputs.primitives << [920, 675, 'Click existing sprite to delete.', 1, 0].label
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      reset_player args
    -** Processing line: ~    end~
    +
    +** Processing line: ~      outputs.primitives << [920, 640, '<- and -> to move.', 1, 0].label~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      outputs.primitives << [920, 640, '<- and -> to move.', 1, 0].label
    +** Processing line: ~      outputs.primitives << [920, 615, 'Press and hold space to jump.', 1, 0].label~
     - Inside source: true
     *** True Line Result
    -  end
    +      outputs.primitives << [920, 615, 'Press and hold space to jump.', 1, 0].label
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Resets the player by changing its properties back to the values they had at initialization~
    -- Inside source: true
    -*** True Line Result
    -  # Resets the player by changing its properties back to the values they had at initialization
    -** Processing line: ~  def reset_player args~
    +** Processing line: ~      outputs.primitives << [920, 580, 'Press \'e\' to export current map.', 1, 0].label~
     - Inside source: true
     *** True Line Result
    -  def reset_player args
    -** Processing line: ~    args.state.player.x = 0~
    +      outputs.primitives << [920, 580, 'Press \'e\' to export current map.', 1, 0].label
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x = 0
    -** Processing line: ~    args.state.player.y = args.state.bridge_top~
    +
    +** Processing line: ~      # if the map is saved and less than 120 frames have passed, the label is displayed~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y = args.state.bridge_top
    -** Processing line: ~    args.state.player.dy = 0~
    +      # if the map is saved and less than 120 frames have passed, the label is displayed
    +** Processing line: ~      if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120~
     - Inside source: true
     *** True Line Result
    -    args.state.player.dy = 0
    -** Processing line: ~    args.state.player.dx = 0~
    +      if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120
    +** Processing line: ~        outputs.primitives << [920, 555, 'Map has been exported!', 1, 0, 50, 100, 50].label~
     - Inside source: true
     *** True Line Result
    -    args.state.player.dx = 0
    -** Processing line: ~    args.state.enemy.hammers.clear # empties hammer collection~
    +        outputs.primitives << [920, 555, 'Map has been exported!', 1, 0, 50, 100, 50].label
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammers.clear # empties hammer collection
    -** Processing line: ~    args.state.enemy.hammer_queue.clear # empties hammer_queue~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.enemy.hammer_queue.clear # empties hammer_queue
    -** Processing line: ~    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)~
    +
    +** Processing line: ~      # If player hits 's', following appears~
     - Inside source: true
     *** True Line Result
    -    args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)
    -** Processing line: ~  end~
    +      # If player hits 's', following appears
    +** Processing line: ~      if state.mode == :selecting~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      if state.mode == :selecting
    +** Processing line: ~        # White background for sprite selection~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Processes input from the user to move the player~
    +        # White background for sprite selection
    +** Processing line: ~        outputs.primitives << [state.select_menu, 255, 255, 255].solid~
     - Inside source: true
     *** True Line Result
    -  # Processes input from the user to move the player
    -** Processing line: ~  def input args~
    +        outputs.primitives << [state.select_menu, 255, 255, 255].solid
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def input args
    -** Processing line: ~    if args.inputs.keyboard.space # if the user presses the space bar~
    +
    +** Processing line: ~        # Select tile label at the top of the screen~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.space # if the user presses the space bar
    -** Processing line: ~      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame~
    +        # Select tile label at the top of the screen
    +** Processing line: ~        outputs.primitives << [state.banner_coords.x, state.banner_coords.y, "Select Sprite (sprites located in \"sprites\" folder)", 10, 1, 0, 0, 0, 255].label~
     - Inside source: true
     *** True Line Result
    -      args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame
    +        outputs.primitives << [state.banner_coords.x, state.banner_coords.y, "Select Sprite (sprites located in \"sprites\" folder)", 10, 1, 0, 0, 0, 255].label
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # if the time that has passed since the jump is less than the player's jump duration and~
    +** Processing line: ~        # Places sprites in locations calculated in the defaults function~
     - Inside source: true
     *** True Line Result
    -      # if the time that has passed since the jump is less than the player's jump duration and
    -** Processing line: ~      # the player is not falling~
    +        # Places sprites in locations calculated in the defaults function
    +** Processing line: ~        outputs.primitives << state.sprite_coords.map do |x, y, order|~
     - Inside source: true
     *** True Line Result
    -      # the player is not falling
    -** Processing line: ~      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling~
    +        outputs.primitives << state.sprite_coords.map do |x, y, order|
    +** Processing line: ~          [x, y, 50, 50, 'sprites/image' + order.to_s + ".png"].sprite~
     - Inside source: true
     *** True Line Result
    -      if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling
    -** Processing line: ~        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump~
    +          [x, y, 50, 50, 'sprites/image' + order.to_s + ".png"].sprite
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump
    +        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: ~    # if the space bar is in the "up" state (or not being pressed down)~
    +** Processing line: ~      # Creates sprite following mouse to help indicate which sprite you have selected~
     - Inside source: true
     *** True Line Result
    -    # if the space bar is in the "up" state (or not being pressed down)
    -** Processing line: ~    if args.inputs.keyboard.key_up.space~
    +      # Creates sprite following mouse to help indicate which sprite you have selected
    +** Processing line: ~      # 10 is subtracted from the mouse's x position so that the sprite is not covered by the mouse icon~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.key_up.space
    -** Processing line: ~      args.state.player.jumped_at = nil # jumped_at is empty~
    +      # 10 is subtracted from the mouse's x position so that the sprite is not covered by the mouse icon
    +** Processing line: ~      outputs.primitives << [inputs.mouse.position.x - 10, inputs.mouse.position.y,~
     - Inside source: true
     *** True Line Result
    -      args.state.player.jumped_at = nil # jumped_at is empty
    -** Processing line: ~      args.state.player.falling = true # the player is falling~
    +      outputs.primitives << [inputs.mouse.position.x - 10, inputs.mouse.position.y,
    +** Processing line: ~                             10, 10, 'sprites/image' + state.sprite_selected.to_s + ".png"].sprite~
     - Inside source: true
     *** True Line Result
    -      args.state.player.falling = true # the player is falling
    +                             10, 10, 'sprites/image' + state.sprite_selected.to_s + ".png"].sprite
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -23852,370 +24187,338 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.inputs.keyboard.left # if left key is pressed~
    -- Inside source: true
    -*** True Line Result
    -    if args.inputs.keyboard.left # if left key is pressed
    -** Processing line: ~      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)~
    +** Processing line: ~    # Calls methods that perform calculations~
     - Inside source: true
     *** True Line Result
    -      args.state.player.dx -= args.state.player_acceleration # dx decreases by acceleration (player goes left)
    -** Processing line: ~      # dx is either set to current dx or the negative max run speed (which would be -10),~
    +    # Calls methods that perform calculations
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -      # dx is either set to current dx or the negative max run speed (which would be -10),
    -** Processing line: ~      # whichever has a greater value~
    +    def calc
    +** Processing line: ~      calc_in_game~
     - Inside source: true
     *** True Line Result
    -      # whichever has a greater value
    -** Processing line: ~      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)~
    +      calc_in_game
    +** Processing line: ~      calc_sprite_selection~
     - Inside source: true
     *** True Line Result
    -      args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed)
    -** Processing line: ~    elsif args.inputs.keyboard.right # if right key is pressed~
    +      calc_sprite_selection
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.right # if right key is pressed
    -** Processing line: ~      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.player.dx += args.state.player_acceleration # dx increases by acceleration (player goes right)
    -** Processing line: ~      # dx is either set to current dx or max run speed (which would be 10),~
    +
    +** Processing line: ~    # Calls methods that perform calculations (if in creating mode)~
     - Inside source: true
     *** True Line Result
    -      # dx is either set to current dx or max run speed (which would be 10),
    -** Processing line: ~      # whichever has a lesser value~
    +    # Calls methods that perform calculations (if in creating mode)
    +** Processing line: ~    def calc_in_game~
     - Inside source: true
     *** True Line Result
    -      # whichever has a lesser value
    -** Processing line: ~      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)~
    +    def calc_in_game
    +** Processing line: ~      return unless state.mode == :creating~
     - Inside source: true
     *** True Line Result
    -      args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed)
    -** Processing line: ~    else~
    +      return unless state.mode == :creating
    +** Processing line: ~      calc_world_lookup~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down~
    +      calc_world_lookup
    +** Processing line: ~      calc_player~
     - Inside source: true
     *** True Line Result
    -      args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down
    +      calc_player
     ** 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 tick_instructions args, text, y = 715~
    -- Inside source: true
    -*** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +** Processing line: ~    def calc_world_lookup~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +    def calc_world_lookup
    +** Processing line: ~      # If the tile size isn't equal to the previous tile size,~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      # If the tile size isn't equal to the previous tile size,
    +** Processing line: ~      # the previous tile size is set to the tile size,~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      # the previous tile size is set to the tile size,
    +** Processing line: ~      # and world_lookup hash is set to empty.~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.space ||~
    +      # and world_lookup hash is set to empty.
    +** Processing line: ~      if state.tile_size != state.previous_tile_size~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.space ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      if state.tile_size != state.previous_tile_size
    +** Processing line: ~        state.previous_tile_size = state.tile_size~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +        state.previous_tile_size = state.tile_size
    +** Processing line: ~        state.world_lookup = {}~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +        state.world_lookup = {}
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    -- Inside source: true
    -*** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +** Processing line: ~      # return if world_lookup is not empty or if world is empty~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      # return if world_lookup is not empty or if world is empty
    +** Processing line: ~      return if state.world_lookup.keys.length > 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      return if state.world_lookup.keys.length > 0
    +** Processing line: ~      return unless state.world.length > 0~
     - Inside source: true
     *** True Line Result
    -  end
    +      return unless state.world.length > 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    +** Processing line: ~      # Searches through the world and finds the coordinates that exist~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Entities - main.rb~
    -- Header detected.
    +      # Searches through the world and finds the coordinates that exist
    +** Processing line: ~      state.world_lookup = {}~
    +- Inside source: true
     *** True Line Result
    -
    +      state.world_lookup = {}
    +** Processing line: ~      state.world.each { |x, y| state.world_lookup[[x, y]] = true }~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Entities - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    -*** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/03_entities/app/main.rb~
    +** Processing line: ~      # Assigns collision rects for every sprite drawn~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/03_entities/app/main.rb
    -** Processing line: ~  =begin~
    +      # Assigns collision rects for every sprite drawn
    +** Processing line: ~      state.world_collision_rects =~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      state.world_collision_rects =
    +** Processing line: ~        state.world_lookup~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +        state.world_lookup
    +** Processing line: ~             .keys~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +             .keys
    +** Processing line: ~             .map do |coord_x, coord_y|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
    +             .map do |coord_x, coord_y|
    +** Processing line: ~               s = state.tile_size~
     - Inside source: true
     *** True Line Result
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
    +               s = state.tile_size
    +** Processing line: ~               # Multiplying by s (the size of a tile) ensures that the rect is~
     - Inside source: true
     *** True Line Result
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -** Processing line: ~     each element by 2 or declaring every element as a new entity.~
    +               # Multiplying by s (the size of a tile) ensures that the rect is
    +** Processing line: ~               # placed exactly where you want it to be placed (causes grid to coordinate)~
     - Inside source: true
     *** True Line Result
    -     each element by 2 or declaring every element as a new entity.
    -** Processing line: ~~
    +               # placed exactly where you want it to be placed (causes grid to coordinate)
    +** Processing line: ~               # How many pixels horizontally across and vertically up and down~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
    +               # How many pixels horizontally across and vertically up and down
    +** Processing line: ~               x = s * coord_x~
     - Inside source: true
     *** True Line Result
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -** Processing line: ~     For example, you can derive an array of odd numbers from an original array of~
    +               x = s * coord_x
    +** Processing line: ~               y = s * coord_y~
     - Inside source: true
     *** True Line Result
    -     For example, you can derive an array of odd numbers from an original array of
    -** Processing line: ~     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).~
    +               y = s * coord_y
    +** Processing line: ~               {~
     - Inside source: true
     *** True Line Result
    -     numbers 1 through 10 by rejecting all elements that are even (or divisible by 2).
    -** Processing line: ~~
    +               {
    +** Processing line: ~                 args:       [coord_x, coord_y],~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
    +                 args:       [coord_x, coord_y],
    +** Processing line: ~                 left_right: [x,     y + 4, s,     s - 6], # hash keys and values~
     - Inside source: true
     *** True Line Result
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -** Processing line: ~     In this sample app, new_entity is used to define the properties of enemies and bullets.~
    +                 left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    +** Processing line: ~                 top:        [x + 4, y + 6, s - 8, s - 6],~
     - Inside source: true
     *** True Line Result
    -     In this sample app, new_entity is used to define the properties of enemies and bullets.
    -** Processing line: ~     (Remember, you can use state to define ANY property and it will be retained across frames.)~
    +                 top:        [x + 4, y + 6, s - 8, s - 6],
    +** Processing line: ~                 bottom:     [x + 1, y - 1, s - 2, s - 8],~
     - Inside source: true
     *** True Line Result
    -     (Remember, you can use state to define ANY property and it will be retained across frames.)
    -** Processing line: ~~
    +                 bottom:     [x + 1, y - 1, s - 2, s - 8],
    +** Processing line: ~               }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.labels: An array. The values generate a label on the screen.~
    +               }
    +** Processing line: ~             end~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. The values generate a label on the screen.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +             end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
    +** Processing line: ~    # Calculates movement of player and calls methods that perform collision calculations~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    -** Processing line: ~~
    +    # Calculates movement of player and calls methods that perform collision calculations
    +** Processing line: ~    def calc_player~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
    +    def calc_player
    +** Processing line: ~      state.dy += state.gravity  # what goes up must come down because of gravity~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -** Processing line: ~~
    +      state.dy += state.gravity  # what goes up must come down because of gravity
    +** Processing line: ~      calc_box_collision~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +      calc_box_collision
    +** Processing line: ~      calc_edge_collision~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      calc_edge_collision
    +** Processing line: ~      state.y  += state.dy       # Since velocity is the change in position, the change in y increases by dy~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app shows enemies that contain an id value and the time they were created.~
    +      state.y  += state.dy       # Since velocity is the change in position, the change in y increases by dy
    +** Processing line: ~      state.x  += state.dx       # Ditto line above but dx and x~
     - Inside source: true
     *** True Line Result
    -  # This sample app shows enemies that contain an id value and the time they were created.
    -** Processing line: ~  # These enemies can be removed by shooting at them with bullets.~
    +      state.x  += state.dx       # Ditto line above but dx and x
    +** Processing line: ~      state.dx *= 0.8            # Scales dx down~
     - Inside source: true
     *** True Line Result
    -  # These enemies can be removed by shooting at them with bullets.
    +      state.dx *= 0.8            # Scales dx down
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Calls all methods necessary for the game to function properly.~
    +** Processing line: ~    # Calls methods that determine whether the player collides with any world_collision_rects.~
     - Inside source: true
     *** True Line Result
    -  # Calls all methods necessary for the game to function properly.
    -** Processing line: ~  def tick args~
    +    # Calls methods that determine whether the player collides with any world_collision_rects.
    +** Processing line: ~    def calc_box_collision~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."~
    +    def calc_box_collision
    +** Processing line: ~      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to use args.state.new_entity along with collisions. CLICK to shoot a bullet."
    -** Processing line: ~    defaults args~
    +      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    +** Processing line: ~      collision_floor~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +      collision_floor
    +** Processing line: ~      collision_left~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +      collision_left
    +** Processing line: ~      collision_right~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~    process_inputs args~
    +      collision_right
    +** Processing line: ~      collision_ceiling~
     - Inside source: true
     *** True Line Result
    -    process_inputs args
    -** Processing line: ~  end~
    +      collision_ceiling
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Sets default values~
    -- Inside source: true
    -*** True Line Result
    -  # Sets default values
    -** Processing line: ~  # Enemies and bullets start off as empty collections~
    -- Inside source: true
    -*** True Line Result
    -  # Enemies and bullets start off as empty collections
    -** Processing line: ~  def defaults args~
    +** Processing line: ~    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    args.state.enemies ||= []~
    +    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    +** Processing line: ~    def collision_floor~
     - Inside source: true
     *** True Line Result
    -    args.state.enemies ||= []
    -** Processing line: ~    args.state.bullets ||= []~
    +    def collision_floor
    +** Processing line: ~      return unless state.dy <= 0 # return unless player is going down or is as far down as possible~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets ||= []
    -** Processing line: ~  end~
    +      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    +** Processing line: ~      player_rect = [state.x, next_y, state.tile_size, state.tile_size] # definition of player~
     - Inside source: true
     *** True Line Result
    -  end
    +      player_rect = [state.x, next_y, state.tile_size, state.tile_size] # definition of player
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Provides each enemy in enemies collection with rectangular border,~
    -- Inside source: true
    -*** True Line Result
    -  # Provides each enemy in enemies collection with rectangular border,
    -** Processing line: ~  # as well as a label showing id and when they were created~
    -- Inside source: true
    -*** True Line Result
    -  # as well as a label showing id and when they were created
    -** Processing line: ~  def render args~
    +** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between player's~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    # When you're calling a method that takes no arguments, you can use this & syntax on map.~
    +      # Runs through all the sprites on the field and finds all intersections between player's
    +** Processing line: ~      # bottom and the top of a rect.~
     - Inside source: true
     *** True Line Result
    -    # When you're calling a method that takes no arguments, you can use this & syntax on map.
    -** Processing line: ~    # Numbers are being added to x and y in order to keep the text within the enemy's borders.~
    +      # bottom and the top of a rect.
    +** Processing line: ~      floor_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -    # Numbers are being added to x and y in order to keep the text within the enemy's borders.
    -** Processing line: ~    args.outputs.borders << args.state.enemies.map(&:rect)~
    +      floor_collisions = state.world_collision_rects
    +** Processing line: ~                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.enemies.map(&:rect)
    -** Processing line: ~    args.outputs.labels  << args.state.enemies.flat_map do |enemy|~
    +                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }
    +** Processing line: ~                           .first~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels  << args.state.enemies.flat_map do |enemy|
    -** Processing line: ~      [~
    +                           .first
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],~
    +
    +** Processing line: ~      return unless floor_collisions # performs following changes if a collision has occurred~
     - Inside source: true
     *** True Line Result
    -        [enemy.x + 4, enemy.y + 29, "id: #{enemy.entity_id}", -3, 0],
    -** Processing line: ~        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created~
    +      return unless floor_collisions # performs following changes if a collision has occurred
    +** Processing line: ~      state.y = floor_collisions[:top].top # y of player is set to the y of the colliding rect's top~
     - Inside source: true
     *** True Line Result
    -        [enemy.x + 4, enemy.y + 17, "created_at: #{enemy.created_at}", -3, 0] # frame enemy was created
    -** Processing line: ~      ]~
    +      state.y = floor_collisions[:top].top # y of player is set to the y of the colliding rect's top
    +** Processing line: ~      state.dy = 0 # no change in y because the player's path is blocked~
     - Inside source: true
     *** True Line Result
    -      ]
    +      state.dy = 0 # no change in y because the player's path is blocked
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -24224,570 +24527,550 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs bullets in bullets collection as rectangular solids~
    -- Inside source: true
    -*** True Line Result
    -    # Outputs bullets in bullets collection as rectangular solids
    -** Processing line: ~    args.outputs.solids << args.state.bullets.map(&:rect)~
    +** Processing line: ~    # Finds collisions between the player's left side and the right side of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.bullets.map(&:rect)
    -** Processing line: ~  end~
    +    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    +** Processing line: ~    def collision_left~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    def collision_left
    +** Processing line: ~      return unless state.dx < 0 # return unless player is moving left~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Calls all methods necessary for performing calculations~
    +      return unless state.dx < 0 # return unless player is moving left
    +** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
     - Inside source: true
     *** True Line Result
    -  # Calls all methods necessary for performing calculations
    -** Processing line: ~  def calc args~
    +      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    add_new_enemies_if_needed args~
    +
    +** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the player's left side~
     - Inside source: true
     *** True Line Result
    -    add_new_enemies_if_needed args
    -** Processing line: ~    move_bullets args~
    +      # Runs through all the sprites on the field and finds all intersections between the player's left side
    +** Processing line: ~      # and the right side of a rect.~
     - Inside source: true
     *** True Line Result
    -    move_bullets args
    -** Processing line: ~    calculate_collisions args~
    +      # and the right side of a rect.
    +** Processing line: ~      left_side_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -    calculate_collisions args
    -** Processing line: ~    remove_bullets_of_screen args~
    +      left_side_collisions = state.world_collision_rects
    +** Processing line: ~                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
     - Inside source: true
     *** True Line Result
    -    remove_bullets_of_screen args
    -** Processing line: ~  end~
    +                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
    +** Processing line: ~                               .first~
     - Inside source: true
     *** True Line Result
    -  end
    +                               .first
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Adds enemies to the enemies collection and sets their values~
    +** Processing line: ~      return unless left_side_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -  # Adds enemies to the enemies collection and sets their values
    -** Processing line: ~  def add_new_enemies_if_needed args~
    +      return unless left_side_collisions # return unless collision occurred
    +** Processing line: ~      state.x = left_side_collisions[:left_right].right # sets player's x to the x of the colliding rect's right side~
     - Inside source: true
     *** True Line Result
    -  def add_new_enemies_if_needed args
    -** Processing line: ~    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added~
    +      state.x = left_side_collisions[:left_right].right # sets player's x to the x of the colliding rect's right side
    +** Processing line: ~      state.dx = 0 # no change in x because the player's path is blocked~
     - Inside source: true
     *** True Line Result
    -    return if args.state.enemies.length >= 10 # if 10 or more enemies, enemies are not added
    -** Processing line: ~    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added~
    +      state.dx = 0 # no change in x because the player's path is blocked
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    return unless args.state.bullets.length == 0 # if user has not yet shot bullet, no enemies are added
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total~
    -- Inside source: true
    -*** True Line Result
    -    args.state.enemies += (10 - args.state.enemies.length).map do # adds enemies so there are 10 total
    -** Processing line: ~      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity~
    -- Inside source: true
    -*** True Line Result
    -      args.state.new_entity(:enemy) do |e| # each enemy is declared as a new entity
    -** Processing line: ~        e.x = 640 + 500 * rand # each enemy is given random position on screen~
    -- Inside source: true
    -*** True Line Result
    -        e.x = 640 + 500 * rand # each enemy is given random position on screen
    -** Processing line: ~        e.y = 600 * rand + 50~
    -- Inside source: true
    -*** True Line Result
    -        e.y = 600 * rand + 50
    -** Processing line: ~        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect~
    +** Processing line: ~    # Finds collisions between the right side of the player and the left side of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -        e.rect = [e.x, e.y, 130, 30] # sets definition for enemy's rect
    -** Processing line: ~      end~
    +    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    +** Processing line: ~    def collision_right~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    def collision_right
    +** Processing line: ~      return unless state.dx > 0 # return unless player is moving right~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      return unless state.dx > 0 # return unless player is moving right
    +** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
     - Inside source: true
     *** True Line Result
    -  end
    +      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Moves bullets across screen~
    +** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the  player's~
     - Inside source: true
     *** True Line Result
    -  # Moves bullets across screen
    -** Processing line: ~  # Sets definition of the bullets~
    +      # Runs through all the sprites on the field and finds all intersections between the  player's
    +** Processing line: ~      # right side and the left side of a rect.~
     - Inside source: true
     *** True Line Result
    -  # Sets definition of the bullets
    -** Processing line: ~  def move_bullets args~
    +      # right side and the left side of a rect.
    +** Processing line: ~      right_side_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -  def move_bullets args
    -** Processing line: ~    args.state.bullets.each do |bullet| # perform action on each bullet in collection~
    +      right_side_collisions = state.world_collision_rects
    +** Processing line: ~                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets.each do |bullet| # perform action on each bullet in collection
    -** Processing line: ~      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)~
    +                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
    +** Processing line: ~                                .first~
     - Inside source: true
     *** True Line Result
    -      bullet.x += bullet.speed # increment x by speed (bullets fly horizontally across screen)
    +                                .first
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out~
    -- Inside source: true
    -*** True Line Result
    -      # By randomizing the value that increments bullet.y, the bullet does not fly straight up and out
    -** Processing line: ~      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to~
    -- Inside source: true
    -*** True Line Result
    -      # of the scope of the screen. Try removing what follows bullet.speed, or changing 0.25 to 1.25 to
    -** Processing line: ~      # see what happens to the bullet's movement.~
    +** Processing line: ~      return unless right_side_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -      # see what happens to the bullet's movement.
    -** Processing line: ~      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)~
    +      return unless right_side_collisions # return unless collision occurred
    +** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size # player's x is set to the x of colliding rect's left side (minus tile size since x is the player's bottom left corner)~
     - Inside source: true
     *** True Line Result
    -      bullet.y += bullet.speed.*(0.25).randomize(:ratio, :sign)
    -** Processing line: ~      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect~
    +      state.x = right_side_collisions[:left_right].left - state.tile_size # player's x is set to the x of colliding rect's left side (minus tile size since x is the player's bottom left corner)
    +** Processing line: ~      state.dx = 0 # no change in x because the player's path is blocked~
     - Inside source: true
     *** True Line Result
    -      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # sets definition of bullet's rect
    +      state.dx = 0 # no change in x because the player's path is blocked
     ** 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: ~  # Determines if a bullet hits an enemy~
    -- Inside source: true
    -*** True Line Result
    -  # Determines if a bullet hits an enemy
    -** Processing line: ~  def calculate_collisions args~
    +** Processing line: ~    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.~
     - Inside source: true
     *** True Line Result
    -  def calculate_collisions args
    -** Processing line: ~    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections~
    +    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    +** Processing line: ~    def collision_ceiling~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets.each do |bullet| # perform action on every bullet and enemy in collections
    -** Processing line: ~      args.state.enemies.each do |enemy|~
    +    def collision_ceiling
    +** Processing line: ~      return unless state.dy > 0 # return unless player is moving up~
     - Inside source: true
     *** True Line Result
    -      args.state.enemies.each do |enemy|
    -** Processing line: ~        # if bullet has not exploded yet and the bullet hits an enemy~
    +      return unless state.dy > 0 # return unless player is moving up
    +** Processing line: ~      player_rect = [state.x, next_y, state.player_width, state.player_height]~
     - Inside source: true
     *** True Line Result
    -        # if bullet has not exploded yet and the bullet hits an enemy
    -** Processing line: ~        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)~
    +      player_rect = [state.x, next_y, state.player_width, state.player_height]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if !bullet.exploded && bullet.rect.intersect_rect?(enemy.rect)
    -** Processing line: ~          bullet.exploded = true # bullet explodes~
    +
    +** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the player's top~
     - Inside source: true
     *** True Line Result
    -          bullet.exploded = true # bullet explodes
    -** Processing line: ~          enemy.dead = true # enemy is killed~
    +      # Runs through all the sprites on the field and finds all intersections between the player's top
    +** Processing line: ~      # and the bottom of a rect.~
     - Inside source: true
     *** True Line Result
    -          enemy.dead = true # enemy is killed
    -** Processing line: ~        end~
    +      # and the bottom of a rect.
    +** Processing line: ~      ceil_collisions = state.world_collision_rects~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      ceil_collisions = state.world_collision_rects
    +** Processing line: ~                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }
    +** Processing line: ~                          .first~
     - Inside source: true
     *** True Line Result
    -    end
    +                          .first
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # All exploded bullets are rejected or removed from the bullets collection~
    -- Inside source: true
    -*** True Line Result
    -    # All exploded bullets are rejected or removed from the bullets collection
    -** Processing line: ~    # and any dead enemy is rejected from the enemies collection.~
    +** Processing line: ~      return unless ceil_collisions # return unless collision occurred~
     - Inside source: true
     *** True Line Result
    -    # and any dead enemy is rejected from the enemies collection.
    -** Processing line: ~    args.state.bullets = args.state.bullets.reject(&:exploded)~
    +      return unless ceil_collisions # return unless collision occurred
    +** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size # player's y is set to the y of the colliding rect's bottom (minus tile size)~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets = args.state.bullets.reject(&:exploded)
    -** Processing line: ~    args.state.enemies = args.state.enemies.reject(&:dead)~
    +      state.y = ceil_collisions[:bottom].y - state.tile_size # player's y is set to the y of the colliding rect's bottom (minus tile size)
    +** Processing line: ~      state.dy = 0 # no change in y because the player's path is blocked~
     - Inside source: true
     *** True Line Result
    -    args.state.enemies = args.state.enemies.reject(&:dead)
    -** Processing line: ~  end~
    +      state.dy = 0 # no change in y because the player's path is blocked
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Bullets are rejected from bullets collection once their position exceeds the width of screen~
    +** Processing line: ~    # Makes sure the player remains within the screen's dimensions.~
     - Inside source: true
     *** True Line Result
    -  # Bullets are rejected from bullets collection once their position exceeds the width of screen
    -** Processing line: ~  def remove_bullets_of_screen args~
    +    # Makes sure the player remains within the screen's dimensions.
    +** Processing line: ~    def calc_edge_collision~
     - Inside source: true
     *** True Line Result
    -  def remove_bullets_of_screen args
    -** Processing line: ~    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280~
    +    def calc_edge_collision
    +** Processing line: ~      # Ensures that player doesn't fall below the map~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets = args.state.bullets.reject { |bullet| bullet.x > 1280 } # screen width is 1280
    -** Processing line: ~  end~
    +      # Ensures that player doesn't fall below the map
    +** Processing line: ~      if next_y < 0 && state.dy < 0 # if player is moving down and is about to fall (next_y) below the map's scope~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      if next_y < 0 && state.dy < 0 # if player is moving down and is about to fall (next_y) below the map's scope
    +** Processing line: ~        state.y = 0 # 0 is the lowest the player can be while staying on the screen~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Calls fire_bullet method~
    +        state.y = 0 # 0 is the lowest the player can be while staying on the screen
    +** Processing line: ~        state.dy = 0~
     - Inside source: true
     *** True Line Result
    -  # Calls fire_bullet method
    -** Processing line: ~  def process_inputs args~
    +        state.dy = 0
    +** Processing line: ~      # Ensures player doesn't go insanely high~
     - Inside source: true
     *** True Line Result
    -  def process_inputs args
    -** Processing line: ~    fire_bullet args~
    +      # Ensures player doesn't go insanely high
    +** Processing line: ~      elsif next_y > 720 - state.tile_size && state.dy > 0 # if player is moving up, about to exceed map's scope~
     - Inside source: true
     *** True Line Result
    -    fire_bullet args
    -** Processing line: ~  end~
    +      elsif next_y > 720 - state.tile_size && state.dy > 0 # if player is moving up, about to exceed map's scope
    +** Processing line: ~        state.y = 720 - state.tile_size # if we don't subtract tile_size, we won't be able to see the player on the screen~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        state.y = 720 - state.tile_size # if we don't subtract tile_size, we won't be able to see the player on the screen
    +** Processing line: ~        state.dy = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection~
    +        state.dy = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  # Once mouse is clicked by the user to fire a bullet, a new bullet is added to bullets collection
    -** Processing line: ~  def fire_bullet args~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def fire_bullet args
    -** Processing line: ~    return unless args.inputs.mouse.click # return unless mouse is clicked~
    +
    +** Processing line: ~      # Ensures that player remains in the horizontal range its supposed to~
     - Inside source: true
     *** True Line Result
    -    return unless args.inputs.mouse.click # return unless mouse is clicked
    -** Processing line: ~    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity~
    +      # Ensures that player remains in the horizontal range its supposed to
    +** Processing line: ~      if state.x >= 1280 - state.tile_size && state.dx > 0 # if the player is moving too far right~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets << args.state.new_entity(:bullet) do |bullet| # new bullet is declared a new entity
    -** Processing line: ~      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked~
    +      if state.x >= 1280 - state.tile_size && state.dx > 0 # if the player is moving too far right
    +** Processing line: ~        state.x = 1280 - state.tile_size # farthest right the player can be while remaining in the screen's scope~
     - Inside source: true
     *** True Line Result
    -      bullet.y = args.inputs.mouse.click.point.y # set to the y value of where the mouse was clicked
    -** Processing line: ~      bullet.x = 0 # starts on the left side of the screen~
    +        state.x = 1280 - state.tile_size # farthest right the player can be while remaining in the screen's scope
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -      bullet.x = 0 # starts on the left side of the screen
    -** Processing line: ~      bullet.size = 10~
    +        state.dx = 0
    +** Processing line: ~      elsif state.x <= 0 && state.dx < 0 # if the player is moving too far left~
     - Inside source: true
     *** True Line Result
    -      bullet.size = 10
    -** Processing line: ~      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized~
    +      elsif state.x <= 0 && state.dx < 0 # if the player is moving too far left
    +** Processing line: ~        state.x = 0 # farthest left the player can be while remaining in the screen's scope~
     - Inside source: true
     *** True Line Result
    -      bullet.speed = 10 * rand + 2 # speed of a bullet is randomized
    -** Processing line: ~      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set~
    +        state.x = 0 # farthest left the player can be while remaining in the screen's scope
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -      bullet.rect = [bullet.x, bullet.y, bullet.size, bullet.size] # definition is set
    -** Processing line: ~    end~
    +        state.dx = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~    def calc_sprite_selection~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    def calc_sprite_selection
    +** Processing line: ~      # Does the transition to bring down the select sprite screen~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +      # Does the transition to bring down the select sprite screen
    +** Processing line: ~      if state.mode == :selecting && state.select_menu.y != 0~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      if state.mode == :selecting && state.select_menu.y != 0
    +** Processing line: ~        state.select_menu.y = 0  # sets y position of select menu (shown when 's' is pressed)~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +        state.select_menu.y = 0  # sets y position of select menu (shown when 's' is pressed)
    +** Processing line: ~        state.banner_coords.y = 680 # sets y position of Select Sprite banner~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.space ||~
    +        state.banner_coords.y = 680 # sets y position of Select Sprite banner
    +** Processing line: ~        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.space ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|
    +** Processing line: ~          [x, y - 720, w, h] # sets definition of sprites (change '-' to '+' and the sprites can't be seen)~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +          [x, y - 720, w, h] # sets definition of sprites (change '-' to '+' and the sprites can't be seen)
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~      # Does the transition to leave the select sprite screen~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +      # Does the transition to leave the select sprite screen
    +** Processing line: ~      if state.mode == :creating  && state.select_menu.y != 720~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      if state.mode == :creating  && state.select_menu.y != 720
    +** Processing line: ~        state.select_menu.y = 720 # sets y position of select menu (menu is retreated back up)~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +        state.select_menu.y = 720 # sets y position of select menu (menu is retreated back up)
    +** Processing line: ~        state.banner_coords.y = 1000 # sets y position of Select Sprite banner~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        state.banner_coords.y = 1000 # sets y position of Select Sprite banner
    +** Processing line: ~        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|
    +** Processing line: ~          [x, y + 720, w, h] # sets definition of all elements in collection~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +          [x, y + 720, w, h] # sets definition of all elements in collection
    +** 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 of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Box Collision - main.rb~
    -- Header detected.
    +** Processing line: ~    def process_inputs~
    +- Inside source: true
     *** True Line Result
    -
    +    def process_inputs
    +** Processing line: ~      # If the state.mode is back and if the menu has retreated back up~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Box Collision - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +      # If the state.mode is back and if the menu has retreated back up
    +** Processing line: ~      # call methods that process user inputs~
    +- Inside source: true
     *** True Line Result
    -
    +      # call methods that process user inputs
    +** Processing line: ~      if state.mode == :creating~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb~
    +      if state.mode == :creating
    +** Processing line: ~        process_inputs_player_movement~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/04_box_collision/app/main.rb
    -** Processing line: ~  =begin~
    +        process_inputs_player_movement
    +** Processing line: ~        process_inputs_place_tile~
     - Inside source: true
     *** True Line Result
    -  =begin
    +        process_inputs_place_tile
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +** Processing line: ~      # For each sprite_coordinate added, check what sprite was selected~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    -** Processing line: ~~
    +      # For each sprite_coordinate added, check what sprite was selected
    +** Processing line: ~      if state.mode == :selecting~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - first: Returns the first element of the array.~
    +      if state.mode == :selecting
    +** Processing line: ~        state.sprite_coords.map do |x, y, order| # goes through all sprites in collection~
     - Inside source: true
     *** True Line Result
    -   - first: Returns the first element of the array.
    -** Processing line: ~     For example, if we have an array~
    +        state.sprite_coords.map do |x, y, order| # goes through all sprites in collection
    +** Processing line: ~          # checks that a specific sprite was pressed based on x, y position~
     - Inside source: true
     *** True Line Result
    -     For example, if we have an array
    -** Processing line: ~     numbers = [1, 2, 3, 4, 5]~
    +          # checks that a specific sprite was pressed based on x, y position
    +** Processing line: ~          if inputs.mouse.down && # the && (and) sign means ALL statements must be true for the evaluation to be true~
     - Inside source: true
     *** True Line Result
    -     numbers = [1, 2, 3, 4, 5]
    -** Processing line: ~     and we call first by saying~
    +          if inputs.mouse.down && # the && (and) sign means ALL statements must be true for the evaluation to be true
    +** Processing line: ~             inputs.mouse.down.point.x >= x      && # x is greater than or equal to sprite's x and~
     - Inside source: true
     *** True Line Result
    -     and we call first by saying
    -** Processing line: ~     numbers.first~
    +             inputs.mouse.down.point.x >= x      && # x is greater than or equal to sprite's x and
    +** Processing line: ~             inputs.mouse.down.point.x <= x + 50 && # x is less than or equal to 50 pixels to the right~
     - Inside source: true
     *** True Line Result
    -     numbers.first
    -** Processing line: ~     the number 1 will be returned because it is the first element of the numbers array.~
    +             inputs.mouse.down.point.x <= x + 50 && # x is less than or equal to 50 pixels to the right
    +** Processing line: ~             inputs.mouse.down.point.y >= y      && # y is greater than or equal to sprite's y~
     - Inside source: true
     *** True Line Result
    -     the number 1 will be returned because it is the first element of the numbers array.
    -** Processing line: ~~
    +             inputs.mouse.down.point.y >= y      && # y is greater than or equal to sprite's y
    +** Processing line: ~             inputs.mouse.down.point.y <= y + 50 # y is less than or equal to 50 pixels up~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - num1.idiv(num2): Divides two numbers and returns an integer.~
    +             inputs.mouse.down.point.y <= y + 50 # y is less than or equal to 50 pixels up
    +** Processing line: ~            state.sprite_selected = order # sprite is chosen~
     - Inside source: true
     *** True Line Result
    -   - num1.idiv(num2): Divides two numbers and returns an integer.
    -** Processing line: ~     For example,~
    +            state.sprite_selected = order # sprite is chosen
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -     For example,
    -** Processing line: ~     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -     16.idiv(3) = 5, because 16 / 3 is 5.33333 returned as an integer.
    -** Processing line: ~     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     16.idiv(4) = 4, because 16 / 4 is 4 and already has no decimal.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~      inputs_export_stage~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +      inputs_export_stage
    +** Processing line: ~      process_inputs_show_available_sprites~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
    +      process_inputs_show_available_sprites
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -   - find_all: Finds all values that satisfy specific requirements.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - ARRAY#intersect_rect?: An array with at least four values is~
    +** Processing line: ~    # Moves the player based on the keys they press on their keyboard~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: An array with at least four values is
    -** Processing line: ~     considered a rect. The intersect_rect? function returns true~
    +    # Moves the player based on the keys they press on their keyboard
    +** Processing line: ~    def process_inputs_player_movement~
     - Inside source: true
     *** True Line Result
    -     considered a rect. The intersect_rect? function returns true
    -** Processing line: ~     or false depending on if the two rectangles intersect.~
    +    def process_inputs_player_movement
    +** Processing line: ~      # Sets dx to 0 if the player lets go of arrow keys (player won't move left or right)~
     - Inside source: true
     *** True Line Result
    -     or false depending on if the two rectangles intersect.
    -** Processing line: ~~
    +      # Sets dx to 0 if the player lets go of arrow keys (player won't move left or right)
    +** Processing line: ~      if inputs.keyboard.key_up.right~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
    +      if inputs.keyboard.key_up.right
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -   - reject: Removes elements from a collection if they meet certain requirements.
    -** Processing line: ~~
    +        state.dx = 0
    +** Processing line: ~      elsif inputs.keyboard.key_up.left~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +      elsif inputs.keyboard.key_up.left
    +** Processing line: ~        state.dx = 0~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +        state.dx = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # This sample app allows users to create tiles and place them anywhere on the screen as obstacles.
    -** Processing line: ~  # The player can then move and maneuver around them.~
    +
    +** Processing line: ~      # Sets dx to 3 in whatever direction the player chooses when they hold down (or press) the left or right keys~
     - Inside source: true
     *** True Line Result
    -  # The player can then move and maneuver around them.
    -** Processing line: ~~
    +      # Sets dx to 3 in whatever direction the player chooses when they hold down (or press) the left or right keys
    +** Processing line: ~      if inputs.keyboard.key_held.right~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  class PoorManPlatformerPhysics~
    +      if inputs.keyboard.key_held.right
    +** Processing line: ~        state.dx =  3~
     - Inside source: true
     *** True Line Result
    -  class PoorManPlatformerPhysics
    -** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
    +        state.dx =  3
    +** Processing line: ~      elsif inputs.keyboard.key_held.left~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :grid, :inputs, :state, :outputs
    -** Processing line: ~~
    +      elsif inputs.keyboard.key_held.left
    +** Processing line: ~        state.dx = -3~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls all methods necessary for the app to run successfully.~
    +        state.dx = -3
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    # Calls all methods necessary for the app to run successfully.
    -** Processing line: ~    def tick~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +
    +** Processing line: ~      # Sets dy to 5 to make the player ~fly~ when they press the space bar on their keyboard~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +      # Sets dy to 5 to make the player ~fly~ when they press the space bar on their keyboard
    +** Processing line: ~      if inputs.keyboard.key_held.space~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      calc~
    +      if inputs.keyboard.key_held.space
    +** Processing line: ~        state.dy = 5~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~      process_inputs~
    +        state.dy = 5
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      process_inputs
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -24796,62 +25079,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets default values for variables.~
    +** Processing line: ~    # Adds tile in the place the user holds down the mouse~
     - Inside source: true
     *** True Line Result
    -    # Sets default values for variables.
    -** Processing line: ~    # The ||= sign means that the variable will only be set to the value following the = sign if the value has~
    +    # Adds tile in the place the user holds down the mouse
    +** Processing line: ~    def process_inputs_place_tile~
     - Inside source: true
     *** True Line Result
    -    # The ||= sign means that the variable will only be set to the value following the = sign if the value has
    -** Processing line: ~    # not already been set before. Intialization happens only in the first frame.~
    +    def process_inputs_place_tile
    +** Processing line: ~      if inputs.mouse.down # if mouse is pressed~
     - Inside source: true
     *** True Line Result
    -    # not already been set before. Intialization happens only in the first frame.
    -** Processing line: ~    def defaults~
    +      if inputs.mouse.down # if mouse is pressed
    +** Processing line: ~        state.world_lookup = {}~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      state.tile_size               = 64~
    +        state.world_lookup = {}
    +** Processing line: ~        x, y = to_coord inputs.mouse.down.point # gets x, y coordinates for the grid~
     - Inside source: true
     *** True Line Result
    -      state.tile_size               = 64
    -** Processing line: ~      state.gravity                 = -0.2~
    +        x, y = to_coord inputs.mouse.down.point # gets x, y coordinates for the grid
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.gravity                 = -0.2
    -** Processing line: ~      state.previous_tile_size    ||= state.tile_size~
    +
    +** Processing line: ~        # Checks if any coordinates duplicate (already exist in world)~
     - Inside source: true
     *** True Line Result
    -      state.previous_tile_size    ||= state.tile_size
    -** Processing line: ~      state.x                     ||= 0~
    +        # Checks if any coordinates duplicate (already exist in world)
    +** Processing line: ~        if state.world.any? { |existing_x, existing_y, n| existing_x == x && existing_y == y }~
     - Inside source: true
     *** True Line Result
    -      state.x                     ||= 0
    -** Processing line: ~      state.y                     ||= 800~
    +        if state.world.any? { |existing_x, existing_y, n| existing_x == x && existing_y == y }
    +** Processing line: ~          #erases existing tile space by rejecting them from world~
     - Inside source: true
     *** True Line Result
    -      state.y                     ||= 800
    -** Processing line: ~      state.dy                    ||= 0~
    +          #erases existing tile space by rejecting them from world
    +** Processing line: ~          state.world = state.world.reject do |existing_x, existing_y, n|~
     - Inside source: true
     *** True Line Result
    -      state.dy                    ||= 0
    -** Processing line: ~      state.dx                    ||= 0~
    +          state.world = state.world.reject do |existing_x, existing_y, n|
    +** Processing line: ~            existing_x == x && existing_y == y~
     - Inside source: true
     *** True Line Result
    -      state.dx                    ||= 0
    -** Processing line: ~      state.world                 ||= []~
    +            existing_x == x && existing_y == y
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -      state.world                 ||= []
    -** Processing line: ~      state.world_lookup          ||= {}~
    +          end
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -      state.world_lookup          ||= {}
    -** Processing line: ~      state.world_collision_rects ||= []~
    +        else
    +** Processing line: ~          state.world << [x, y, state.sprite_selected] # If no duplicates, add the sprite~
     - Inside source: true
     *** True Line Result
    -      state.world_collision_rects ||= []
    +          state.world << [x, y, state.sprite_selected] # If no duplicates, add the sprite
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -24860,134 +25151,134 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs solids and borders of different colors for the world and collision_rects collections.~
    +** Processing line: ~    # Stores/exports world collection's info (coordinates, sprite number) into a file~
     - Inside source: true
     *** True Line Result
    -    # Outputs solids and borders of different colors for the world and collision_rects collections.
    -** Processing line: ~    def render~
    +    # Stores/exports world collection's info (coordinates, sprite number) into a file
    +** Processing line: ~    def inputs_export_stage~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~~
    +    def inputs_export_stage
    +** Processing line: ~      if inputs.keyboard.key_down.e # if "e" is pressed~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets a black background on the screen (Comment this line out and the background will become white.)~
    +      if inputs.keyboard.key_down.e # if "e" is pressed
    +** Processing line: ~        export_string = state.world.map do |x, y, sprite_number| # stores world info in a string~
     - Inside source: true
     *** True Line Result
    -      # Sets a black background on the screen (Comment this line out and the background will become white.)
    -** Processing line: ~      # Also note that black is the default color for when no color is assigned.~
    +        export_string = state.world.map do |x, y, sprite_number| # stores world info in a string
    +** Processing line: ~          "#{x},#{y},#{sprite_number}"                           # using string interpolation~
     - Inside source: true
     *** True Line Result
    -      # Also note that black is the default color for when no color is assigned.
    -** Processing line: ~      outputs.solids << grid.rect~
    +          "#{x},#{y},#{sprite_number}"                           # using string interpolation
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << grid.rect
    -** Processing line: ~~
    +        end
    +** Processing line: ~        gtk.write_file(MAP_FILE_PATH, export_string.join("\n")) # writes string into a file~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The position, size, and color (white) are set for borders given to the world collection.~
    +        gtk.write_file(MAP_FILE_PATH, export_string.join("\n")) # writes string into a file
    +** Processing line: ~        state.map_saved_at = state.tick_count # frame number (passage of time) when the map was saved~
     - Inside source: true
     *** True Line Result
    -      # The position, size, and color (white) are set for borders given to the world collection.
    -** Processing line: ~      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.~
    +        state.map_saved_at = state.tick_count # frame number (passage of time) when the map was saved
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      # Try changing the color by assigning different numbers (between 0 and 255) to the last three parameters.
    -** Processing line: ~      outputs.borders << state.world.map do |x, y|~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.world.map do |x, y|
    -** Processing line: ~        [x * state.tile_size,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        [x * state.tile_size,
    -** Processing line: ~         y * state.tile_size,~
    +
    +** Processing line: ~    def process_inputs_show_available_sprites~
     - Inside source: true
     *** True Line Result
    -         y * state.tile_size,
    -** Processing line: ~         state.tile_size,~
    +    def process_inputs_show_available_sprites
    +** Processing line: ~      # Based on keyboard input, the entity (:creating and :selecting) switch~
     - Inside source: true
     *** True Line Result
    -         state.tile_size,
    -** Processing line: ~         state.tile_size, 255, 255, 255]~
    +      # Based on keyboard input, the entity (:creating and :selecting) switch
    +** Processing line: ~      if inputs.keyboard.key_held.s && state.mode == :creating # if "s" is pressed and currently creating~
     - Inside source: true
     *** True Line Result
    -         state.tile_size, 255, 255, 255]
    -** Processing line: ~      end~
    +      if inputs.keyboard.key_held.s && state.mode == :creating # if "s" is pressed and currently creating
    +** Processing line: ~        state.mode = :selecting # will change to selecting~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +        state.mode = :selecting # will change to selecting
    +** Processing line: ~        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The top, bottom, and sides of the borders for collision_rects are different colors.~
    +        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off
    +** Processing line: ~      elsif inputs.keyboard.key_held.s && state.mode == :selecting # if "s" is pressed and currently selecting~
     - Inside source: true
     *** True Line Result
    -      # The top, bottom, and sides of the borders for collision_rects are different colors.
    -** Processing line: ~      outputs.borders << state.world_collision_rects.map do |e|~
    +      elsif inputs.keyboard.key_held.s && state.mode == :selecting # if "s" is pressed and currently selecting
    +** Processing line: ~        state.mode = :creating # will change to creating~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.world_collision_rects.map do |e|
    -** Processing line: ~        [~
    +        state.mode = :creating # will change to creating
    +** Processing line: ~        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off~
     - Inside source: true
     *** True Line Result
    -        [
    -** Processing line: ~          [e[:top],                             0, 170,   0], # top is a shade of green~
    +        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -          [e[:top],                             0, 170,   0], # top is a shade of green
    -** Processing line: ~          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          [e[:bottom],                          0, 100, 170], # bottom is a shade of greenish-blue
    -** Processing line: ~          [e[:left_right],                    170,   0,   0], # left and right are a shade of red~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          [e[:left_right],                    170,   0,   0], # left and right are a shade of red
    -** Processing line: ~        ]~
    +
    +** Processing line: ~    # Loads the world collection by reading from the map.txt file in the app folder~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~      end~
    +    # Loads the world collection by reading from the map.txt file in the app folder
    +** Processing line: ~    def attempt_load_world_from_file~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    def attempt_load_world_from_file
    +** Processing line: ~      return if state.world # return if the world collection is already populated~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets the position, size, and color (a shade of green) of the borders of only the player's~
    +      return if state.world # return if the world collection is already populated
    +** Processing line: ~      state.world ||= [] # initialized as an empty collection~
     - Inside source: true
     *** True Line Result
    -      # Sets the position, size, and color (a shade of green) of the borders of only the player's
    -** Processing line: ~      # box and outputs it. If you change the 180 to 0, the player's box will be black and you~
    +      state.world ||= [] # initialized as an empty collection
    +** Processing line: ~      exported_world = gtk.read_file(MAP_FILE_PATH) # reads the file using the path mentioned at top of code~
     - Inside source: true
     *** True Line Result
    -      # box and outputs it. If you change the 180 to 0, the player's box will be black and you
    -** Processing line: ~      # won't be able to see it (because it will match the black background).~
    +      exported_world = gtk.read_file(MAP_FILE_PATH) # reads the file using the path mentioned at top of code
    +** Processing line: ~      return unless exported_world # return unless the file read was successful~
     - Inside source: true
     *** True Line Result
    -      # won't be able to see it (because it will match the black background).
    -** Processing line: ~      outputs.borders << [state.x,~
    +      return unless exported_world # return unless the file read was successful
    +** Processing line: ~      state.world = exported_world.each_line.map do |l| # perform action on each line of exported_world~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [state.x,
    -** Processing line: ~                          state.y,~
    +      state.world = exported_world.each_line.map do |l| # perform action on each line of exported_world
    +** Processing line: ~          l.split(',').map(&:to_i) # calls split using ',' as a delimiter, and invokes .map on the collection,~
     - Inside source: true
     *** True Line Result
    -                          state.y,
    -** Processing line: ~                          state.tile_size,~
    +          l.split(',').map(&:to_i) # calls split using ',' as a delimiter, and invokes .map on the collection,
    +** Processing line: ~                                   # calling to_i (converts to integers) on each element~
     - Inside source: true
     *** True Line Result
    -                          state.tile_size,
    -** Processing line: ~                          state.tile_size,  0, 180, 0]~
    +                                   # calling to_i (converts to integers) on each element
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                          state.tile_size,  0, 180, 0]
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -24996,22 +25287,18 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calls methods needed to perform calculations.~
    -- Inside source: true
    -*** True Line Result
    -    # Calls methods needed to perform calculations.
    -** Processing line: ~    def calc~
    +** Processing line: ~    # Adds the change in y to y to determine the next y position of the player.~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      calc_world_lookup~
    +    # Adds the change in y to y to determine the next y position of the player.
    +** Processing line: ~    def next_y~
     - Inside source: true
     *** True Line Result
    -      calc_world_lookup
    -** Processing line: ~      calc_player~
    +    def next_y
    +** Processing line: ~      state.y + state.dy~
     - Inside source: true
     *** True Line Result
    -      calc_player
    +      state.y + state.dy
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25020,174 +25307,178 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Performs calculations on world_lookup and sets values.~
    -- Inside source: true
    -*** True Line Result
    -    # Performs calculations on world_lookup and sets values.
    -** Processing line: ~    def calc_world_lookup~
    -- Inside source: true
    -*** True Line Result
    -    def calc_world_lookup
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~      # If the tile size isn't equal to the previous tile size,~
    +** Processing line: ~    # Determines next x position of player~
     - Inside source: true
     *** True Line Result
    -      # If the tile size isn't equal to the previous tile size,
    -** Processing line: ~      # the previous tile size is set to the tile size,~
    +    # Determines next x position of player
    +** Processing line: ~    def next_x~
     - Inside source: true
     *** True Line Result
    -      # the previous tile size is set to the tile size,
    -** Processing line: ~      # and world_lookup hash is set to empty.~
    +    def next_x
    +** Processing line: ~      if state.dx < 0 # if the player moves left~
     - Inside source: true
     *** True Line Result
    -      # and world_lookup hash is set to empty.
    -** Processing line: ~      if state.tile_size != state.previous_tile_size~
    +      if state.dx < 0 # if the player moves left
    +** Processing line: ~        return state.x - (state.tile_size - state.player_width) # subtracts since the change in x is negative (player is moving left)~
     - Inside source: true
     *** True Line Result
    -      if state.tile_size != state.previous_tile_size
    -** Processing line: ~        state.previous_tile_size = state.tile_size~
    +        return state.x - (state.tile_size - state.player_width) # subtracts since the change in x is negative (player is moving left)
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        state.previous_tile_size = state.tile_size
    -** Processing line: ~        state.world_lookup = {} # empty hash~
    +      else
    +** Processing line: ~        return state.x + (state.tile_size - state.player_width) # adds since the change in x is positive (player is moving right)~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup = {} # empty hash
    +        return state.x + (state.tile_size - state.player_width) # adds since the change in x is positive (player is moving right)
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # return if the world_lookup hash has keys (or, in other words, is not empty)~
    +** Processing line: ~    def to_coord point~
     - Inside source: true
     *** True Line Result
    -      # return if the world_lookup hash has keys (or, in other words, is not empty)
    -** Processing line: ~      # return unless the world collection has values inside of it (or is not empty)~
    +    def to_coord point
    +** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
     - Inside source: true
     *** True Line Result
    -      # return unless the world collection has values inside of it (or is not empty)
    -** Processing line: ~      return if state.world_lookup.keys.length > 0~
    +      # Integer divides (idiv) point.x to turn into grid
    +** Processing line: ~      # Then, you can just multiply each integer by state.tile_size~
     - Inside source: true
     *** True Line Result
    -      return if state.world_lookup.keys.length > 0
    -** Processing line: ~      return unless state.world.length > 0~
    +      # Then, you can just multiply each integer by state.tile_size
    +** Processing line: ~      # later and huzzah. Grid coordinates~
     - Inside source: true
     *** True Line Result
    -      return unless state.world.length > 0
    -** Processing line: ~~
    +      # later and huzzah. Grid coordinates
    +** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Starts with an empty hash for world_lookup.~
    +      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      # Starts with an empty hash for world_lookup.
    -** Processing line: ~      # Searches through the world and finds the coordinates that exist.~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      # Searches through the world and finds the coordinates that exist.
    -** Processing line: ~      state.world_lookup = {}~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.world_lookup = {}
    -** Processing line: ~      state.world.each { |x, y| state.world_lookup[[x, y]] = true }~
    +
    +** Processing line: ~  $metroidvania_starter = MetroidvaniaStarter.new~
     - Inside source: true
     *** True Line Result
    -      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
    +  $metroidvania_starter = MetroidvaniaStarter.new
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Assigns world_collision_rects for every sprite drawn.~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      # Assigns world_collision_rects for every sprite drawn.
    -** Processing line: ~      state.world_collision_rects =~
    +  def tick args
    +** Processing line: ~      $metroidvania_starter.grid    = args.grid~
     - Inside source: true
     *** True Line Result
    -      state.world_collision_rects =
    -** Processing line: ~        state.world_lookup~
    +      $metroidvania_starter.grid    = args.grid
    +** Processing line: ~      $metroidvania_starter.inputs  = args.inputs~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup
    -** Processing line: ~            .keys~
    +      $metroidvania_starter.inputs  = args.inputs
    +** Processing line: ~      $metroidvania_starter.state   = args.state~
     - Inside source: true
     *** True Line Result
    -            .keys
    -** Processing line: ~            .map do |coord_x, coord_y|~
    +      $metroidvania_starter.state   = args.state
    +** Processing line: ~      $metroidvania_starter.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -            .map do |coord_x, coord_y|
    -** Processing line: ~              s = state.tile_size~
    +      $metroidvania_starter.outputs = args.outputs
    +** Processing line: ~      $metroidvania_starter.gtk     = args.gtk~
     - Inside source: true
     *** True Line Result
    -              s = state.tile_size
    -** Processing line: ~              # multiply by tile size so the grid coordinates; sets pixel value~
    +      $metroidvania_starter.gtk     = args.gtk
    +** Processing line: ~      $metroidvania_starter.tick~
     - Inside source: true
     *** True Line Result
    -              # multiply by tile size so the grid coordinates; sets pixel value
    -** Processing line: ~              # don't forget that position is denoted by bottom left corner~
    +      $metroidvania_starter.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -              # don't forget that position is denoted by bottom left corner
    -** Processing line: ~              # set x = coord_x or y = coord_y and see what happens!~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              # set x = coord_x or y = coord_y and see what happens!
    -** Processing line: ~              x = s * coord_x~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -              x = s * coord_x
    -** Processing line: ~              y = s * coord_y~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -              y = s * coord_y
    -** Processing line: ~              {~
    +
    +** Processing line: ~*** Physics And Collisions - Box Collision 3 - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Box Collision 3 - 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/04_physics_and_collisions/06_box_collision_3/app/main.rb~
     - Inside source: true
     *** True Line Result
    -              {
    -** Processing line: ~                # The values added to x, y, and s position the world_collision_rects so they all appear~
    +  # ./samples/04_physics_and_collisions/06_box_collision_3/app/main.rb
    +** Processing line: ~  class Game~
     - Inside source: true
     *** True Line Result
    -                # The values added to x, y, and s position the world_collision_rects so they all appear
    -** Processing line: ~                # stacked (on top of world rects) but don't directly overlap.~
    +  class Game
    +** Processing line: ~    attr_gtk~
     - Inside source: true
     *** True Line Result
    -                # stacked (on top of world rects) but don't directly overlap.
    -** Processing line: ~                # Remove these added values and mess around with the rect placement!~
    +    attr_gtk
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                # Remove these added values and mess around with the rect placement!
    -** Processing line: ~                args:       [coord_x, coord_y],~
    +
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -                args:       [coord_x, coord_y],
    -** Processing line: ~                left_right: [x,     y + 4, s,     s - 6], # hash keys and values~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -                left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    -** Processing line: ~                top:        [x + 4, y + 6, s - 8, s - 6],~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -                top:        [x + 4, y + 6, s - 8, s - 6],
    -** Processing line: ~                bottom:     [x + 1, y - 1, s - 2, s - 8],~
    +      render
    +** Processing line: ~      input_edit_map~
     - Inside source: true
     *** True Line Result
    -                bottom:     [x + 1, y - 1, s - 2, s - 8],
    -** Processing line: ~              }~
    +      input_edit_map
    +** Processing line: ~      input_player~
     - Inside source: true
     *** True Line Result
    -              }
    -** Processing line: ~            end~
    +      input_player
    +** Processing line: ~      calc_player~
     - Inside source: true
     *** True Line Result
    -            end
    +      calc_player
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25196,74 +25487,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Performs calculations to change the x and y values of the player's box.~
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -    # Performs calculations to change the x and y values of the player's box.
    -** Processing line: ~    def calc_player~
    +    def defaults
    +** Processing line: ~      state.gravity           = -0.4~
     - Inside source: true
     *** True Line Result
    -    def calc_player
    -** Processing line: ~~
    +      state.gravity           = -0.4
    +** Processing line: ~      state.drag              = 0.15~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.~
    +      state.drag              = 0.15
    +** Processing line: ~      state.tile_size         = 32~
     - Inside source: true
     *** True Line Result
    -      # Since acceleration is the change in velocity, the change in y (dy) increases every frame.
    -** Processing line: ~      # What goes up must come down because of gravity.~
    +      state.tile_size         = 32
    +** Processing line: ~      state.player.size       = 16~
     - Inside source: true
     *** True Line Result
    -      # What goes up must come down because of gravity.
    -** Processing line: ~      state.dy += state.gravity~
    +      state.player.size       = 16
    +** Processing line: ~      state.player.jump_power = 12~
     - Inside source: true
     *** True Line Result
    -      state.dy += state.gravity
    +      state.player.jump_power = 12
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Calls the calc_box_collision and calc_edge_collision methods.~
    +** Processing line: ~      state.tiles                 ||= []~
     - Inside source: true
     *** True Line Result
    -      # Calls the calc_box_collision and calc_edge_collision methods.
    -** Processing line: ~      calc_box_collision~
    +      state.tiles                 ||= []
    +** Processing line: ~      state.player.y              ||= 800~
     - Inside source: true
     *** True Line Result
    -      calc_box_collision
    -** Processing line: ~      calc_edge_collision~
    +      state.player.y              ||= 800
    +** Processing line: ~      state.player.x              ||= 100~
     - Inside source: true
     *** True Line Result
    -      calc_edge_collision
    -** Processing line: ~~
    +      state.player.x              ||= 100
    +** Processing line: ~      state.player.dy             ||= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.~
    +      state.player.dy             ||= 0
    +** Processing line: ~      state.player.dx             ||= 0~
     - Inside source: true
     *** True Line Result
    -      # Since velocity is the change in position, the change in y increases by dy. Same with x and dx.
    -** Processing line: ~      state.y += state.dy~
    +      state.player.dx             ||= 0
    +** Processing line: ~      state.player.jumped_down_at ||= 0~
     - Inside source: true
     *** True Line Result
    -      state.y += state.dy
    -** Processing line: ~      state.x += state.dx~
    +      state.player.jumped_down_at ||= 0
    +** Processing line: ~      state.player.jumped_at      ||= 0~
     - Inside source: true
     *** True Line Result
    -      state.x += state.dx
    +      state.player.jumped_at      ||= 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Scales dx down.~
    -- Inside source: true
    -*** True Line Result
    -      # Scales dx down.
    -** Processing line: ~      state.dx *= 0.8~
    +** Processing line: ~      calc_player_rect if !state.player.rect~
     - Inside source: true
     *** True Line Result
    -      state.dx *= 0.8
    +      calc_player_rect if !state.player.rect
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25272,98 +25559,98 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calls methods needed to determine collisions between player and world_collision rects.~
    -- Inside source: true
    -*** True Line Result
    -    # Calls methods needed to determine collisions between player and world_collision rects.
    -** Processing line: ~    def calc_box_collision~
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -    def calc_box_collision
    -** Processing line: ~      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key~
    +    def render
    +** Processing line: ~      outputs.labels << [10, 10.from_top, "tile: click to add a tile, hold X key and click to delete a tile."]~
     - Inside source: true
     *** True Line Result
    -      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    -** Processing line: ~      collision_floor!~
    +      outputs.labels << [10, 10.from_top, "tile: click to add a tile, hold X key and click to delete a tile."]
    +** Processing line: ~      outputs.labels << [10, 35.from_top, "move: use left and right to move, space to jump, down and space to jump down."]~
     - Inside source: true
     *** True Line Result
    -      collision_floor!
    -** Processing line: ~      collision_left!~
    +      outputs.labels << [10, 35.from_top, "move: use left and right to move, space to jump, down and space to jump down."]
    +** Processing line: ~      outputs.labels << [10, 55.from_top, "      You can jump through or jump down through tiles with a height of 1."]~
     - Inside source: true
     *** True Line Result
    -      collision_left!
    -** Processing line: ~      collision_right!~
    +      outputs.labels << [10, 55.from_top, "      You can jump through or jump down through tiles with a height of 1."]
    +** Processing line: ~      outputs.background_color = [80, 80, 80]~
     - Inside source: true
     *** True Line Result
    -      collision_right!
    -** Processing line: ~      collision_ceiling!~
    +      outputs.background_color = [80, 80, 80]
    +** Processing line: ~      outputs.sprites << tiles.map(&:sprite)~
     - Inside source: true
     *** True Line Result
    -      collision_ceiling!
    -** Processing line: ~    end~
    +      outputs.sprites << tiles.map(&:sprite)
    +** Processing line: ~      outputs.sprites << (player.rect.merge path: 'sprites/square/green.png')~
     - Inside source: true
     *** True Line Result
    -    end
    +      outputs.sprites << (player.rect.merge path: 'sprites/square/green.png')
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.~
    -- Inside source: true
    -*** True Line Result
    -    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    -** Processing line: ~    def collision_floor!~
    +** Processing line: ~      mouse_overlay = {~
     - Inside source: true
     *** True Line Result
    -    def collision_floor!
    -** Processing line: ~      return unless state.dy <= 0 # return unless player is going down or is as far down as possible~
    +      mouse_overlay = {
    +** Processing line: ~        x: (inputs.mouse.x.ifloor state.tile_size),~
     - Inside source: true
     *** True Line Result
    -      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    -** Processing line: ~      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player~
    +        x: (inputs.mouse.x.ifloor state.tile_size),
    +** Processing line: ~        y: (inputs.mouse.y.ifloor state.tile_size),~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x, state.y - 0.1, state.tile_size, state.tile_size] # definition of player
    -** Processing line: ~~
    +        y: (inputs.mouse.y.ifloor state.tile_size),
    +** Processing line: ~        w: state.tile_size,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and~
    +        w: state.tile_size,
    +** Processing line: ~        h: state.tile_size,~
     - Inside source: true
     *** True Line Result
    -      # Goes through world_collision_rects to find all intersections between the bottom of player's rect and
    -** Processing line: ~      # the top of a world_collision_rect (hence the "-0.1" above)~
    +        h: state.tile_size,
    +** Processing line: ~        a: 100~
     - Inside source: true
     *** True Line Result
    -      # the top of a world_collision_rect (hence the "-0.1" above)
    -** Processing line: ~      floor_collisions = state.world_collision_rects~
    +        a: 100
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -      floor_collisions = state.world_collision_rects
    -** Processing line: ~                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }~
    +      }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                             .find_all { |r| r[:top].intersect_rect?(player_rect, collision_tollerance) }
    -** Processing line: ~                             .first~
    +
    +** Processing line: ~      mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode~
     - Inside source: true
     *** True Line Result
    -                             .first
    +      mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless floor_collisions # return unless collision occurred~
    +** Processing line: ~      if state.mouse_held~
     - Inside source: true
     *** True Line Result
    -      return unless floor_collisions # return unless collision occurred
    -** Processing line: ~      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect~
    +      if state.mouse_held
    +** Processing line: ~        outputs.primitives << mouse_overlay.border!~
     - Inside source: true
     *** True Line Result
    -      state.y = floor_collisions[:top].top # player's y is set to the y of the top of the collided rect
    -** Processing line: ~      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked~
    +        outputs.primitives << mouse_overlay.border!
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -      state.dy = 0 # if a collision occurred, the player's rect isn't moving because its path is blocked
    +      else
    +** Processing line: ~        outputs.primitives << mouse_overlay.solid!~
    +- Inside source: true
    +*** True Line Result
    +        outputs.primitives << mouse_overlay.solid!
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25372,218 +25659,198 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the player's left side and the right side of a world_collision_rect.~
    -- Inside source: true
    -*** True Line Result
    -    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    -** Processing line: ~    def collision_left!~
    +** Processing line: ~    def input_edit_map~
     - Inside source: true
     *** True Line Result
    -    def collision_left!
    -** Processing line: ~      return unless state.dx < 0 # return unless player is moving left~
    +    def input_edit_map
    +** Processing line: ~      state.mouse_held = true  if inputs.mouse.down~
     - Inside source: true
     *** True Line Result
    -      return unless state.dx < 0 # return unless player is moving left
    -** Processing line: ~      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]~
    +      state.mouse_held = true  if inputs.mouse.down
    +** Processing line: ~      state.mouse_held = false if inputs.mouse.up~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x - 0.1, state.y, state.tile_size, state.tile_size]
    +      state.mouse_held = false if inputs.mouse.up
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Goes through world_collision_rects to find all intersections beween the player's left side and the~
    +** Processing line: ~      if inputs.keyboard.x~
     - Inside source: true
     *** True Line Result
    -      # Goes through world_collision_rects to find all intersections beween the player's left side and the
    -** Processing line: ~      # right side of a world_collision_rect.~
    +      if inputs.keyboard.x
    +** Processing line: ~        state.delete_mode = true~
     - Inside source: true
     *** True Line Result
    -      # right side of a world_collision_rect.
    -** Processing line: ~      left_side_collisions = state.world_collision_rects~
    +        state.delete_mode = true
    +** Processing line: ~      elsif inputs.keyboard.key_up.x~
     - Inside source: true
     *** True Line Result
    -      left_side_collisions = state.world_collision_rects
    -** Processing line: ~                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }~
    +      elsif inputs.keyboard.key_up.x
    +** Processing line: ~        state.delete_mode = false~
     - Inside source: true
     *** True Line Result
    -                                 .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    -** Processing line: ~                                 .first~
    +        state.delete_mode = false
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                                 .first
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless left_side_collisions # return unless collision occurred~
    +** Processing line: ~      return unless state.mouse_held~
     - Inside source: true
     *** True Line Result
    -      return unless left_side_collisions # return unless collision occurred
    +      return unless state.mouse_held
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # player's x is set to the value of the x of the collided rect's right side~
    -- Inside source: true
    -*** True Line Result
    -      # player's x is set to the value of the x of the collided rect's right side
    -** Processing line: ~      state.x = left_side_collisions[:left_right].right~
    -- Inside source: true
    -*** True Line Result
    -      state.x = left_side_collisions[:left_right].right
    -** Processing line: ~      state.dx = 0 # player isn't moving left because its path is blocked~
    +** Processing line: ~      ordinal = { x: (inputs.mouse.x.idiv state.tile_size),~
     - Inside source: true
     *** True Line Result
    -      state.dx = 0 # player isn't moving left because its path is blocked
    -** Processing line: ~    end~
    +      ordinal = { x: (inputs.mouse.x.idiv state.tile_size),
    +** Processing line: ~                  y: (inputs.mouse.y.idiv state.tile_size) }~
     - Inside source: true
     *** True Line Result
    -    end
    +                  y: (inputs.mouse.y.idiv state.tile_size) }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the right side of the player and the left side of a world_collision_rect.~
    -- Inside source: true
    -*** True Line Result
    -    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    -** Processing line: ~    def collision_right!~
    +** Processing line: ~      found = find_tile ordinal~
     - Inside source: true
     *** True Line Result
    -    def collision_right!
    -** Processing line: ~      return unless state.dx > 0 # return unless player is moving right~
    +      found = find_tile ordinal
    +** Processing line: ~      if !found && !state.delete_mode~
     - Inside source: true
     *** True Line Result
    -      return unless state.dx > 0 # return unless player is moving right
    -** Processing line: ~      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]~
    +      if !found && !state.delete_mode
    +** Processing line: ~        tiles << (state.new_entity :tile, ordinal)~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x + 0.1, state.y, state.tile_size, state.tile_size]
    -** Processing line: ~~
    +        tiles << (state.new_entity :tile, ordinal)
    +** Processing line: ~        recompute_tiles~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Goes through world_collision_rects to find all intersections between the player's right side~
    +        recompute_tiles
    +** Processing line: ~      elsif found && state.delete_mode~
     - Inside source: true
     *** True Line Result
    -      # Goes through world_collision_rects to find all intersections between the player's right side
    -** Processing line: ~      # and the left side of a world_collision_rect (hence the "+0.1" above)~
    +      elsif found && state.delete_mode
    +** Processing line: ~        tiles.delete found~
     - Inside source: true
     *** True Line Result
    -      # and the left side of a world_collision_rect (hence the "+0.1" above)
    -** Processing line: ~      right_side_collisions = state.world_collision_rects~
    +        tiles.delete found
    +** Processing line: ~        recompute_tiles~
     - Inside source: true
     *** True Line Result
    -      right_side_collisions = state.world_collision_rects
    -** Processing line: ~                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }~
    +        recompute_tiles
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                                  .find_all { |r| r[:left_right].intersect_rect?(player_rect, collision_tollerance) }
    -** Processing line: ~                                  .first~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                                  .first
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless right_side_collisions # return unless collision occurred~
    +** Processing line: ~    def input_player~
     - Inside source: true
     *** True Line Result
    -      return unless right_side_collisions # return unless collision occurred
    +    def input_player
    +** Processing line: ~      player.dx += inputs.left_right~
    +- Inside source: true
    +*** True Line Result
    +      player.dx += inputs.left_right
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # player's x is set to the value of the collided rect's left, minus the size of a rect~
    +** Processing line: ~      if inputs.keyboard.key_down.space && inputs.keyboard.down~
     - Inside source: true
     *** True Line Result
    -      # player's x is set to the value of the collided rect's left, minus the size of a rect
    -** Processing line: ~      # tile size is subtracted because player's position is denoted by bottom left corner~
    +      if inputs.keyboard.key_down.space && inputs.keyboard.down
    +** Processing line: ~        player.dy             = player.jump_power * -1~
     - Inside source: true
     *** True Line Result
    -      # tile size is subtracted because player's position is denoted by bottom left corner
    -** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size~
    +        player.dy             = player.jump_power * -1
    +** Processing line: ~        player.jumped_at      = 0~
     - Inside source: true
     *** True Line Result
    -      state.x = right_side_collisions[:left_right].left - state.tile_size
    -** Processing line: ~      state.dx = 0 # player isn't moving right because its path is blocked~
    +        player.jumped_at      = 0
    +** Processing line: ~        player.jumped_down_at = state.tick_count~
     - Inside source: true
     *** True Line Result
    -      state.dx = 0 # player isn't moving right because its path is blocked
    -** Processing line: ~    end~
    +        player.jumped_down_at = state.tick_count
    +** Processing line: ~      elsif inputs.keyboard.key_down.space~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      elsif inputs.keyboard.key_down.space
    +** Processing line: ~        player.dy             = player.jump_power~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.~
    +        player.dy             = player.jump_power
    +** Processing line: ~        player.jumped_at      = state.tick_count~
     - Inside source: true
     *** True Line Result
    -    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    -** Processing line: ~    def collision_ceiling!~
    +        player.jumped_at      = state.tick_count
    +** Processing line: ~        player.jumped_down_at = 0~
     - Inside source: true
     *** True Line Result
    -    def collision_ceiling!
    -** Processing line: ~      return unless state.dy > 0 # return unless player is moving up~
    +        player.jumped_down_at = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      return unless state.dy > 0 # return unless player is moving up
    -** Processing line: ~      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x, state.y + 0.1, state.tile_size, state.tile_size]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Goes through world_collision_rects to find intersections between the bottom of a~
    -- Inside source: true
    -*** True Line Result
    -      # Goes through world_collision_rects to find intersections between the bottom of a
    -** Processing line: ~      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)~
    -- Inside source: true
    -*** True Line Result
    -      # world_collision_rect and the top of the player's rect (hence the "+0.1" above)
    -** Processing line: ~      ceil_collisions = state.world_collision_rects~
    +** Processing line: ~    def calc_player~
     - Inside source: true
     *** True Line Result
    -      ceil_collisions = state.world_collision_rects
    -** Processing line: ~                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }~
    +    def calc_player
    +** Processing line: ~      calc_player_rect~
     - Inside source: true
     *** True Line Result
    -                            .find_all { |r| r[:bottom].intersect_rect?(player_rect, collision_tollerance) }
    -** Processing line: ~                            .first~
    +      calc_player_rect
    +** Processing line: ~      calc_below~
     - Inside source: true
     *** True Line Result
    -                            .first
    -** Processing line: ~~
    +      calc_below
    +** Processing line: ~      calc_left~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      return unless ceil_collisions # return unless collision occurred~
    +      calc_left
    +** Processing line: ~      calc_right~
     - Inside source: true
     *** True Line Result
    -      return unless ceil_collisions # return unless collision occurred
    -** Processing line: ~~
    +      calc_right
    +** Processing line: ~      calc_above~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect~
    +      calc_above
    +** Processing line: ~      calc_player_dy~
     - Inside source: true
     *** True Line Result
    -      # player's y is set to the bottom y of the rect it collided with, minus the size of a rect
    -** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size~
    +      calc_player_dy
    +** Processing line: ~      calc_player_dx~
     - Inside source: true
     *** True Line Result
    -      state.y = ceil_collisions[:bottom].y - state.tile_size
    -** Processing line: ~      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked~
    +      calc_player_dx
    +** Processing line: ~      reset_player if player_off_stage?~
     - Inside source: true
     *** True Line Result
    -      state.dy = 0 # if a collision occurred, the player isn't moving up because its path is blocked
    +      reset_player if player_off_stage?
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25592,234 +25859,242 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Makes sure the player remains within the screen's dimensions.~
    +** Processing line: ~    def calc_player_rect~
     - Inside source: true
     *** True Line Result
    -    # Makes sure the player remains within the screen's dimensions.
    -** Processing line: ~    def calc_edge_collision~
    +    def calc_player_rect
    +** Processing line: ~      player.rect      = current_player_rect~
     - Inside source: true
     *** True Line Result
    -    def calc_edge_collision
    -** Processing line: ~~
    +      player.rect      = current_player_rect
    +** Processing line: ~      player.next_rect = player.rect.merge x: player.x + player.dx,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #Ensures that the player doesn't fall below the map.~
    +      player.next_rect = player.rect.merge x: player.x + player.dx,
    +** Processing line: ~                                           y: player.y + player.dy~
     - Inside source: true
     *** True Line Result
    -      #Ensures that the player doesn't fall below the map.
    -** Processing line: ~      if state.y < 0~
    +                                           y: player.y + player.dy
    +** Processing line: ~      player.prev_rect = player.rect.merge x: player.x - player.dx,~
     - Inside source: true
     *** True Line Result
    -      if state.y < 0
    -** Processing line: ~        state.y = 0~
    +      player.prev_rect = player.rect.merge x: player.x - player.dx,
    +** Processing line: ~                                           y: player.y - player.dy~
     - Inside source: true
     *** True Line Result
    -        state.y = 0
    -** Processing line: ~        state.dy = 0~
    +                                           y: player.y - player.dy
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.dy = 0
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Ensures that the player doesn't go too high.~
    +** Processing line: ~    def calc_below~
     - Inside source: true
     *** True Line Result
    -      #Ensures that the player doesn't go too high.
    -** Processing line: ~      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the~
    +    def calc_below
    +** Processing line: ~      return unless player.dy <= 0~
     - Inside source: true
     *** True Line Result
    -      # Position of player is denoted by bottom left hand corner, which is why we have to subtract the
    -** Processing line: ~      # size of the player's box (so it remains visible on the screen)~
    +      return unless player.dy <= 0
    +** Processing line: ~      tiles_below = find_tiles { |t| t.rect.top <= player.y }~
     - Inside source: true
     *** True Line Result
    -      # size of the player's box (so it remains visible on the screen)
    -** Processing line: ~      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen~
    +      tiles_below = find_tiles { |t| t.rect.top <= player.y }
    +** Processing line: ~      collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)~
     - Inside source: true
     *** True Line Result
    -      elsif state.y > 720 - state.tile_size # if the player's y position exceeds the height of screen
    -** Processing line: ~        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen~
    +      collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)
    +** Processing line: ~      return unless collision~
     - Inside source: true
     *** True Line Result
    -        state.y = 720 - state.tile_size # the player will remain as high as possible while staying on screen
    -** Processing line: ~        state.dy = 0~
    +      return unless collision
    +** Processing line: ~      if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10~
     - Inside source: true
     *** True Line Result
    -        state.dy = 0
    -** Processing line: ~      end~
    +      if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10
    +** Processing line: ~        player.dy = -1~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +        player.dy = -1
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Ensures that the player remains in the horizontal range that it is supposed to.~
    +      else
    +** Processing line: ~        player.y  = collision.rect.y + state.tile_size~
     - Inside source: true
     *** True Line Result
    -      # Ensures that the player remains in the horizontal range that it is supposed to.
    -** Processing line: ~      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right~
    +        player.y  = collision.rect.y + state.tile_size
    +** Processing line: ~        player.dy = 0~
     - Inside source: true
     *** True Line Result
    -      if state.x >= 1280 - state.tile_size && state.dx > 0 # if player moves too far right
    -** Processing line: ~        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen~
    +        player.dy = 0
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        state.x = 1280 - state.tile_size # player will remain as right as possible while staying on screen
    -** Processing line: ~        state.dx = 0~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      elsif state.x <= 0 && state.dx < 0 # if player moves too far left~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      elsif state.x <= 0 && state.dx < 0 # if player moves too far left
    -** Processing line: ~        state.x = 0 # player will remain as left as possible while remaining on screen~
    +
    +** Processing line: ~    def calc_left~
     - Inside source: true
     *** True Line Result
    -        state.x = 0 # player will remain as left as possible while remaining on screen
    -** Processing line: ~        state.dx = 0~
    +    def calc_left
    +** Processing line: ~      return unless player.dx < 0~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      end~
    +      return unless player.dx < 0
    +** Processing line: ~      tiles_left = find_tiles { |t| t.rect.right <= player.prev_rect.left }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      tiles_left = find_tiles { |t| t.rect.right <= player.prev_rect.left }
    +** Processing line: ~      collision = find_colliding_tile tiles_left, (player.rect.merge x: player.next_rect.x)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      collision = find_colliding_tile tiles_left, (player.rect.merge x: player.next_rect.x)
    +** Processing line: ~      return unless collision~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Processes input from the user on the keyboard.~
    +      return unless collision
    +** Processing line: ~      player.x  = collision.rect.right~
     - Inside source: true
     *** True Line Result
    -    # Processes input from the user on the keyboard.
    -** Processing line: ~    def process_inputs~
    +      player.x  = collision.rect.right
    +** Processing line: ~      player.dx = 0~
     - Inside source: true
     *** True Line Result
    -    def process_inputs
    -** Processing line: ~      if inputs.mouse.down~
    +      player.dx = 0
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.down
    -** Processing line: ~        state.world_lookup = {}~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup = {}
    -** Processing line: ~        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid~
    +
    +** Processing line: ~    def calc_right~
     - Inside source: true
     *** True Line Result
    -        x, y = to_coord inputs.mouse.down.point  # gets x, y coordinates for the grid
    -** Processing line: ~~
    +    def calc_right
    +** Processing line: ~      return unless player.dx > 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate~
    +      return unless player.dx > 0
    +** Processing line: ~      tiles_right = find_tiles { |t| t.rect.left >= player.prev_rect.right }~
     - Inside source: true
     *** True Line Result
    -        if state.world.any? { |loc| loc == [x, y] }  # checks if coordinates duplicate
    -** Processing line: ~          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space~
    +      tiles_right = find_tiles { |t| t.rect.left >= player.prev_rect.right }
    +** Processing line: ~      collision = find_colliding_tile tiles_right, (player.rect.merge x: player.next_rect.x)~
     - Inside source: true
     *** True Line Result
    -          state.world = state.world.reject { |loc| loc == [x, y] }  # erases tile space
    -** Processing line: ~        else~
    +      collision = find_colliding_tile tiles_right, (player.rect.merge x: player.next_rect.x)
    +** Processing line: ~      return unless collision~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          state.world << [x, y] # If no duplicates, adds to world collection~
    +      return unless collision
    +** Processing line: ~      player.x  = collision.rect.left - player.rect.w~
     - Inside source: true
     *** True Line Result
    -          state.world << [x, y] # If no duplicates, adds to world collection
    -** Processing line: ~        end~
    +      player.x  = collision.rect.left - player.rect.w
    +** Processing line: ~      player.dx = 0~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      player.dx = 0
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets dx to 0 if the player lets go of arrow keys.~
    +** Processing line: ~    def calc_above~
     - Inside source: true
     *** True Line Result
    -      # Sets dx to 0 if the player lets go of arrow keys.
    -** Processing line: ~      if inputs.keyboard.key_up.right~
    +    def calc_above
    +** Processing line: ~      return unless player.dy > 0~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_up.right
    -** Processing line: ~        state.dx = 0~
    +      return unless player.dy > 0
    +** Processing line: ~      tiles_above = find_tiles { |t| t.rect.y >= player.y }~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      elsif inputs.keyboard.key_up.left~
    +      tiles_above = find_tiles { |t| t.rect.y >= player.y }
    +** Processing line: ~      collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_up.left
    -** Processing line: ~        state.dx = 0~
    +      collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)
    +** Processing line: ~      return unless collision~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      end~
    +      return unless collision
    +** Processing line: ~      return if collision.neighbors.t == :none~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      return if collision.neighbors.t == :none
    +** Processing line: ~      player.dy = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets dx to 3 in whatever direction the player chooses.~
    +      player.dy = 0
    +** Processing line: ~      player.y  = collision.rect.bottom - player.rect.h~
     - Inside source: true
     *** True Line Result
    -      # Sets dx to 3 in whatever direction the player chooses.
    -** Processing line: ~      if inputs.keyboard.key_held.right # if right key is pressed~
    +      player.y  = collision.rect.bottom - player.rect.h
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.right # if right key is pressed
    -** Processing line: ~        state.dx =  3~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.dx =  3
    -** Processing line: ~      elsif inputs.keyboard.key_held.left # if left key is pressed~
    +
    +** Processing line: ~    def calc_player_dx~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.left # if left key is pressed
    -** Processing line: ~        state.dx = -3~
    +    def calc_player_dx
    +** Processing line: ~      player.y  += player.dy~
     - Inside source: true
     *** True Line Result
    -        state.dx = -3
    -** Processing line: ~      end~
    +      player.y  += player.dy
    +** Processing line: ~      player.dy += state.gravity~
     - Inside source: true
     *** True Line Result
    -      end
    +      player.dy += state.gravity
    +** Processing line: ~      player.dy += player.dy * state.drag ** 2 * -1~
    +- Inside source: true
    +*** True Line Result
    +      player.dy += player.dy * state.drag ** 2 * -1
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Sets dy to 5 to make the player ~fly~ when they press the space bar~
    +** Processing line: ~    def calc_player_dy~
     - Inside source: true
     *** True Line Result
    -      #Sets dy to 5 to make the player ~fly~ when they press the space bar
    -** Processing line: ~      if inputs.keyboard.key_held.space~
    +    def calc_player_dy
    +** Processing line: ~      player.dx  = player.dx.clamp(-5,  5)~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.space
    -** Processing line: ~        state.dy = 5~
    +      player.dx  = player.dx.clamp(-5,  5)
    +** Processing line: ~      player.dx *= 0.9~
     - Inside source: true
     *** True Line Result
    -        state.dy = 5
    -** Processing line: ~      end~
    +      player.dx *= 0.9
    +** Processing line: ~      player.x  += player.dx~
     - Inside source: true
     *** True Line Result
    -      end
    +      player.x  += player.dx
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25828,26 +26103,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def to_coord point~
    -- Inside source: true
    -*** True Line Result
    -    def to_coord point
    -** Processing line: ~~
    +** Processing line: ~    def reset_player~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
    +    def reset_player
    +** Processing line: ~      player.x  = 100~
     - Inside source: true
     *** True Line Result
    -      # Integer divides (idiv) point.x to turn into grid
    -** Processing line: ~      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.~
    +      player.x  = 100
    +** Processing line: ~      player.y  = 720~
     - Inside source: true
     *** True Line Result
    -      # Then, you can just multiply each integer by state.tile_size later so the grid coordinates.
    -** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
    +      player.y  = 720
    +** Processing line: ~      player.dy = 0~
     - Inside source: true
     *** True Line Result
    -      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
    +      player.dy = 0
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25856,102 +26127,126 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Represents the tolerance for a collision between the player's rect and another rect.~
    +** Processing line: ~    def recompute_tiles~
     - Inside source: true
     *** True Line Result
    -    # Represents the tolerance for a collision between the player's rect and another rect.
    -** Processing line: ~    def collision_tollerance~
    +    def recompute_tiles
    +** Processing line: ~      tiles.each do |t|~
     - Inside source: true
     *** True Line Result
    -    def collision_tollerance
    -** Processing line: ~      0.0~
    +      tiles.each do |t|
    +** Processing line: ~        t.w = state.tile_size~
     - Inside source: true
     *** True Line Result
    -      0.0
    -** Processing line: ~    end~
    +        t.w = state.tile_size
    +** Processing line: ~        t.h = state.tile_size~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +        t.h = state.tile_size
    +** Processing line: ~        t.neighbors = tile_neighbors t, tiles~
     - Inside source: true
     *** True Line Result
    -  end
    +        t.neighbors = tile_neighbors t, tiles
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $platformer_physics = PoorManPlatformerPhysics.new~
    +** Processing line: ~        t.rect = [t.x * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -  $platformer_physics = PoorManPlatformerPhysics.new
    +        t.rect = [t.x * state.tile_size,
    +** Processing line: ~                  t.y * state.tile_size,~
    +- Inside source: true
    +*** True Line Result
    +                  t.y * state.tile_size,
    +** Processing line: ~                  state.tile_size,~
    +- Inside source: true
    +*** True Line Result
    +                  state.tile_size,
    +** Processing line: ~                  state.tile_size].rect.to_hash~
    +- Inside source: true
    +*** True Line Result
    +                  state.tile_size].rect.to_hash
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~        sprite_sub_path = t.neighbors.mask.map { |m| flip_bit m }.join("")~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $platformer_physics.grid    = args.grid~
    +        sprite_sub_path = t.neighbors.mask.map { |m| flip_bit m }.join("")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    $platformer_physics.grid    = args.grid
    -** Processing line: ~    $platformer_physics.inputs  = args.inputs~
    +
    +** Processing line: ~        t.sprite = {~
     - Inside source: true
     *** True Line Result
    -    $platformer_physics.inputs  = args.inputs
    -** Processing line: ~    $platformer_physics.state    = args.state~
    +        t.sprite = {
    +** Processing line: ~          x: t.x * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    $platformer_physics.state    = args.state
    -** Processing line: ~    $platformer_physics.outputs = args.outputs~
    +          x: t.x * state.tile_size,
    +** Processing line: ~          y: t.y * state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    $platformer_physics.outputs = args.outputs
    -** Processing line: ~    $platformer_physics.tick~
    +          y: t.y * state.tile_size,
    +** Processing line: ~          w: state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    $platformer_physics.tick
    -** Processing line: ~    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."~
    +          w: state.tile_size,
    +** Processing line: ~          h: state.tile_size,~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows platformer collisions. CLICK to place box. ARROW keys to move around. SPACE to jump."
    -** Processing line: ~  end~
    +          h: state.tile_size,
    +** Processing line: ~          path: "sprites/tile/wall-#{sprite_sub_path}.png"~
     - Inside source: true
     *** True Line Result
    -  end
    +          path: "sprites/tile/wall-#{sprite_sub_path}.png"
    +** Processing line: ~        }~
    +- Inside source: true
    +*** True Line Result
    +        }
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~    def flip_bit bit~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    def flip_bit bit
    +** Processing line: ~      return 0 if bit == 1~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +      return 0 if bit == 1
    +** Processing line: ~      return 1~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      return 1
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +
    +** Processing line: ~    def player~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +    def player
    +** Processing line: ~      state.player~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +      state.player
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -25960,302 +26255,370 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~    def player_off_stage?~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +    def player_off_stage?
    +** Processing line: ~      player.rect.top < grid.bottom ||~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      player.rect.top < grid.bottom ||
    +** Processing line: ~      player.rect.right < grid.left ||~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      player.rect.right < grid.left ||
    +** Processing line: ~      player.rect.left > grid.right~
     - Inside source: true
     *** True Line Result
    -  end
    +      player.rect.left > grid.right
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +** Processing line: ~    def current_player_rect~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +    def current_player_rect
    +** Processing line: ~      { x: player.x, y: player.y, w: player.size, h: player.size }~
    +- Inside source: true
    +*** True Line Result
    +      { x: player.x, y: player.y, w: player.size, h: player.size }
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Box Collision 2 - main.rb~
    -- Header detected.
    +** Processing line: ~    def tiles~
    +- Inside source: true
     *** True Line Result
    -
    +    def tiles
    +** Processing line: ~      state.tiles~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Box Collision 2 - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +      state.tiles
    +** Processing line: ~    end~
    +- Inside source: true
     *** True Line Result
    -
    +    end
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb~
    +
    +** Processing line: ~    def find_tile ordinal~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/05_box_collision_2/app/main.rb
    -** Processing line: ~  =begin~
    +    def find_tile ordinal
    +** Processing line: ~      tiles.find { |t| t.x == ordinal.x && t.y == ordinal.y }~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      tiles.find { |t| t.x == ordinal.x && t.y == ordinal.y }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - times: Performs an action a specific number of times.~
    +** Processing line: ~    def find_tiles &block~
     - Inside source: true
     *** True Line Result
    -   - times: Performs an action a specific number of times.
    -** Processing line: ~     For example, if we said~
    +    def find_tiles &block
    +** Processing line: ~      tiles.find_all(&block)~
     - Inside source: true
     *** True Line Result
    -     For example, if we said
    -** Processing line: ~     5.times puts "Hello DragonRuby",~
    +      tiles.find_all(&block)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     5.times puts "Hello DragonRuby",
    -** Processing line: ~     then we'd see the words "Hello DragonRuby" printed on the console 5 times.~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     then we'd see the words "Hello DragonRuby" printed on the console 5 times.
    +
    +** Processing line: ~    def find_colliding_tile tiles, target~
    +- Inside source: true
    +*** True Line Result
    +    def find_colliding_tile tiles, target
    +** Processing line: ~      tiles.find { |t| t.rect.intersect_rect? target }~
    +- Inside source: true
    +*** True Line Result
    +      tiles.find { |t| t.rect.intersect_rect? target }
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - split: Divides a string into substrings based on a delimiter.~
    +** Processing line: ~    def tile_neighbors tile, other_points~
     - Inside source: true
     *** True Line Result
    -   - split: Divides a string into substrings based on a delimiter.
    -** Processing line: ~     For example, if we had a command~
    +    def tile_neighbors tile, other_points
    +** Processing line: ~      t = find_tile x: tile.x + 0, y: tile.y + 1~
     - Inside source: true
     *** True Line Result
    -     For example, if we had a command
    -** Processing line: ~     "DragonRuby is awesome".split(" ")~
    +      t = find_tile x: tile.x + 0, y: tile.y + 1
    +** Processing line: ~      r = find_tile x: tile.x + 1, y: tile.y + 0~
     - Inside source: true
     *** True Line Result
    -     "DragonRuby is awesome".split(" ")
    -** Processing line: ~     then the result would be~
    +      r = find_tile x: tile.x + 1, y: tile.y + 0
    +** Processing line: ~      b = find_tile x: tile.x + 0, y: tile.y - 1~
     - Inside source: true
     *** True Line Result
    -     then the result would be
    -** Processing line: ~     ["DragonRuby", "is", "awesome"] because the words are separated by a space delimiter.~
    +      b = find_tile x: tile.x + 0, y: tile.y - 1
    +** Processing line: ~      l = find_tile x: tile.x - 1, y: tile.y + 0~
     - Inside source: true
     *** True Line Result
    -     ["DragonRuby", "is", "awesome"] because the words are separated by a space delimiter.
    +      l = find_tile x: tile.x - 1, y: tile.y + 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - join: Opposite of split; converts each element of array to a string separated by delimiter.~
    +** Processing line: ~      tile_t, tile_r, tile_b, tile_l = 0~
     - Inside source: true
     *** True Line Result
    -   - join: Opposite of split; converts each element of array to a string separated by delimiter.
    -** Processing line: ~     For example, if we had a command~
    +      tile_t, tile_r, tile_b, tile_l = 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     For example, if we had a command
    -** Processing line: ~     ["DragonRuby","is","awesome"].join(" ")~
    +
    +** Processing line: ~      tile_t = 1 if t~
     - Inside source: true
     *** True Line Result
    -     ["DragonRuby","is","awesome"].join(" ")
    -** Processing line: ~     then the result would be~
    +      tile_t = 1 if t
    +** Processing line: ~      tile_r = 1 if r~
     - Inside source: true
     *** True Line Result
    -     then the result would be
    -** Processing line: ~     "DragonRuby is awesome".~
    +      tile_r = 1 if r
    +** Processing line: ~      tile_b = 1 if b~
     - Inside source: true
     *** True Line Result
    -     "DragonRuby is awesome".
    +      tile_b = 1 if b
    +** Processing line: ~      tile_l = 1 if l~
    +- Inside source: true
    +*** True Line Result
    +      tile_l = 1 if l
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~      state.new_entity :neighbors, mask: [tile_t, tile_r, tile_b, tile_l],~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +      state.new_entity :neighbors, mask: [tile_t, tile_r, tile_b, tile_l],
    +** Processing line: ~                                   t:    t ? :some : :none,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - to_s: Returns a string representation of an object.~
    +                                   t:    t ? :some : :none,
    +** Processing line: ~                                   b:    b ? :some : :none,~
     - Inside source: true
     *** True Line Result
    -   - to_s: Returns a string representation of an object.
    -** Processing line: ~     For example, if we had~
    +                                   b:    b ? :some : :none,
    +** Processing line: ~                                   l:    l ? :some : :none,~
     - Inside source: true
     *** True Line Result
    -     For example, if we had
    -** Processing line: ~     500.to_s~
    +                                   l:    l ? :some : :none,
    +** Processing line: ~                                   r:    r ? :some : :none~
     - Inside source: true
     *** True Line Result
    -     500.to_s
    -** Processing line: ~     the string "500" would be returned.~
    +                                   r:    r ? :some : :none
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     the string "500" would be returned.
    -** Processing line: ~     Similar to to_i, which returns an integer representation of an object.~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     Similar to to_i, which returns an integer representation of an object.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - elapsed_time: How many frames have passed since the click event.~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -   - elapsed_time: How many frames have passed since the click event.
    -** Processing line: ~~
    +  def tick args
    +** Processing line: ~    $game ||= Game.new~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.labels: An array. Values in the array generate labels on the screen.~
    +    $game ||= Game.new
    +** Processing line: ~    $game.args = args~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. Values in the array generate labels on the screen.
    -** Processing line: ~     The parameters are: [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +    $game.args = args
    +** Processing line: ~    $game.tick~
     - Inside source: true
     *** True Line Result
    -     The parameters are: [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +    $game.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - inputs.mouse.down: Determines whether or not the mouse is being pressed down.~
    +** 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: ~*** Physics And Collisions - Jump Physics - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Jump Physics - 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/04_physics_and_collisions/07_jump_physics/app/main.rb~
     - Inside source: true
     *** True Line Result
    -   - inputs.mouse.down: Determines whether or not the mouse is being pressed down.
    -** Processing line: ~     The position of the mouse when it is pressed down can be found using inputs.mouse.down.point.(x|y).~
    +  # ./samples/04_physics_and_collisions/07_jump_physics/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -     The position of the mouse when it is pressed down can be found using inputs.mouse.down.point.(x|y).
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - first: Returns the first element of the array.~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -   - first: Returns the first element of the array.
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - num1.idiv(num2): Divides two numbers and returns an integer.~
    +** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
     - Inside source: true
     *** True Line Result
    -   - num1.idiv(num2): Divides two numbers and returns an integer.
    -** Processing line: ~~
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - find_all: Finds all values that satisfy specific requirements.~
    +     For example, if we want to create a new button, we would declare it as a new entity and
    +** Processing line: ~     then define its properties. (Remember, you can use state to define ANY property and it will~
     - Inside source: true
     *** True Line Result
    -   - find_all: Finds all values that satisfy specific requirements.
    +     then define its properties. (Remember, you can use state to define ANY property and it will
    +** Processing line: ~     be retained across frames.)~
    +- Inside source: true
    +*** True Line Result
    +     be retained across frames.)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters for a solid are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
    +- Inside source: true
    +*** True Line Result
    +     The parameters for a solid are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +- Inside source: true
    +*** True Line Result
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - reject: Removes elements from a collection if they meet certain requirements.~
    +** Processing line: ~   - num1.greater(num2): Returns the greater value.~
     - Inside source: true
     *** True Line Result
    -   - reject: Removes elements from a collection if they meet certain requirements.
    +   - num1.greater(num2): Returns the greater value.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
    +** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +** Processing line: ~     using their keys.~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +     using their keys.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.~
     - Inside source: true
     *** True Line Result
    -  =end
    +   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  MAP_FILE_PATH = 'app/map.txt' # the map.txt file in the app folder contains exported map~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -  MAP_FILE_PATH = 'app/map.txt' # the map.txt file in the app folder contains exported map
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class MetroidvaniaStarter~
    +** Processing line: ~  # This sample app is a game that requires the user to jump from one platform to the next.~
     - Inside source: true
     *** True Line Result
    -  class MetroidvaniaStarter
    -** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs, :gtk~
    +  # This sample app is a game that requires the user to jump from one platform to the next.
    +** Processing line: ~  # As the player successfully clears platforms, they become smaller and move faster.~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :grid, :inputs, :state, :outputs, :gtk
    +  # As the player successfully clears platforms, they become smaller and move faster.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calls methods needed to run the game properly.~
    +** Processing line: ~  class VerticalPlatformer~
     - Inside source: true
     *** True Line Result
    -    # Calls methods needed to run the game properly.
    -** Processing line: ~    def tick~
    +  class VerticalPlatformer
    +** Processing line: ~    attr_gtk~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +    attr_gtk
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +
    +** Processing line: ~    # declares vertical platformer as new entity~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      calc~
    +    # declares vertical platformer as new entity
    +** Processing line: ~    def s~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~      process_inputs~
    +    def s
    +** Processing line: ~      state.vertical_platformer ||= state.new_entity(:vertical_platformer)~
     - Inside source: true
     *** True Line Result
    -      process_inputs
    +      state.vertical_platformer ||= state.new_entity(:vertical_platformer)
    +** Processing line: ~      state.vertical_platformer~
    +- Inside source: true
    +*** True Line Result
    +      state.vertical_platformer
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -26264,366 +26627,354 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets all the default variables.~
    -- Inside source: true
    -*** True Line Result
    -    # Sets all the default variables.
    -** Processing line: ~    # '||' states that initialization occurs only in the first frame.~
    +** Processing line: ~    # creates a new platform using a hash~
     - Inside source: true
     *** True Line Result
    -    # '||' states that initialization occurs only in the first frame.
    -** Processing line: ~    def defaults~
    +    # creates a new platform using a hash
    +** Processing line: ~    def new_platform hash~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      state.tile_size                = 64~
    +    def new_platform hash
    +** Processing line: ~      s.new_entity_strict(:platform, hash) # platform key~
     - Inside source: true
     *** True Line Result
    -      state.tile_size                = 64
    -** Processing line: ~      state.gravity                  = -0.2~
    +      s.new_entity_strict(:platform, hash) # platform key
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      state.gravity                  = -0.2
    -** Processing line: ~      state.player_width             = 60~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.player_width             = 60
    -** Processing line: ~      state.player_height            = 64~
    +
    +** Processing line: ~    # calls methods needed for game to run properly~
     - Inside source: true
     *** True Line Result
    -      state.player_height            = 64
    -** Processing line: ~      state.collision_tolerance      = 0.0~
    +    # calls methods needed for game to run properly
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -      state.collision_tolerance      = 0.0
    -** Processing line: ~      state.previous_tile_size     ||= state.tile_size~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -      state.previous_tile_size     ||= state.tile_size
    -** Processing line: ~      state.x                      ||= 0~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -      state.x                      ||= 0
    -** Processing line: ~      state.y                      ||= 800~
    +      render
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -      state.y                      ||= 800
    -** Processing line: ~      state.dy                     ||= 0~
    +      calc
    +** Processing line: ~      input~
     - Inside source: true
     *** True Line Result
    -      state.dy                     ||= 0
    -** Processing line: ~      state.dx                     ||= 0~
    +      input
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      state.dx                     ||= 0
    -** Processing line: ~      attempt_load_world_from_file~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      attempt_load_world_from_file
    -** Processing line: ~      state.world_lookup           ||= { }~
    +
    +** Processing line: ~    # Sets default values~
     - Inside source: true
     *** True Line Result
    -      state.world_lookup           ||= { }
    -** Processing line: ~      state.world_collision_rects  ||= []~
    +    # Sets default values
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -      state.world_collision_rects  ||= []
    -** Processing line: ~      state.mode                   ||= :creating # alternates between :creating and :selecting for sprite selection~
    +    def defaults
    +** Processing line: ~      s.platforms ||= [ # initializes platforms collection with two platforms using hashes~
     - Inside source: true
     *** True Line Result
    -      state.mode                   ||= :creating # alternates between :creating and :selecting for sprite selection
    -** Processing line: ~      state.select_menu            ||= [0, 720, 1280, 720]~
    +      s.platforms ||= [ # initializes platforms collection with two platforms using hashes
    +** Processing line: ~        new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),~
     - Inside source: true
     *** True Line Result
    -      state.select_menu            ||= [0, 720, 1280, 720]
    -** Processing line: ~      #=======================================IMPORTANT=======================================#~
    +        new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),
    +** Processing line: ~        new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher~
     - Inside source: true
     *** True Line Result
    -      #=======================================IMPORTANT=======================================#
    -** Processing line: ~      # When adding sprites, please label them "image1.png", "image2.png", image3".png", etc.~
    +        new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -      # When adding sprites, please label them "image1.png", "image2.png", image3".png", etc.
    -** Processing line: ~      # Once you have done that, adjust "state.sprite_quantity" to how many sprites you have.~
    +      ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # Once you have done that, adjust "state.sprite_quantity" to how many sprites you have.
    -** Processing line: ~      #=======================================================================================#~
    +
    +** Processing line: ~      s.tick_count  = args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -      #=======================================================================================#
    -** Processing line: ~      state.sprite_quantity        ||= 20 # IMPORTANT TO ALTER IF SPRITES ADDED IF YOU ADD MORE SPRITES~
    +      s.tick_count  = args.state.tick_count
    +** Processing line: ~      s.gravity     = -0.3 # what goes up must come down because of gravity~
     - Inside source: true
     *** True Line Result
    -      state.sprite_quantity        ||= 20 # IMPORTANT TO ALTER IF SPRITES ADDED IF YOU ADD MORE SPRITES
    -** Processing line: ~      state.sprite_coords          ||= []~
    +      s.gravity     = -0.3 # what goes up must come down because of gravity
    +** Processing line: ~      s.player.platforms_cleared ||= 0 # counts how many platforms the player has successfully cleared~
     - Inside source: true
     *** True Line Result
    -      state.sprite_coords          ||= []
    -** Processing line: ~      state.banner_coords          ||= [640, 680 + 720]~
    +      s.player.platforms_cleared ||= 0 # counts how many platforms the player has successfully cleared
    +** Processing line: ~      s.player.x  ||= 0           # sets player values~
     - Inside source: true
     *** True Line Result
    -      state.banner_coords          ||= [640, 680 + 720]
    -** Processing line: ~      state.sprite_selected        ||= 1~
    +      s.player.x  ||= 0           # sets player values
    +** Processing line: ~      s.player.y  ||= 100~
     - Inside source: true
     *** True Line Result
    -      state.sprite_selected        ||= 1
    -** Processing line: ~      state.map_saved_at           ||= 0~
    +      s.player.y  ||= 100
    +** Processing line: ~      s.player.w  ||= 64~
     - Inside source: true
     *** True Line Result
    -      state.map_saved_at           ||= 0
    -** Processing line: ~~
    +      s.player.w  ||= 64
    +** Processing line: ~      s.player.h  ||= 64~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets all the cordinate values for the sprite selection screen into a grid~
    +      s.player.h  ||= 64
    +** Processing line: ~      s.player.dy ||= 0           # change in position~
     - Inside source: true
     *** True Line Result
    -      # Sets all the cordinate values for the sprite selection screen into a grid
    -** Processing line: ~      # Displayed when 's' is pressed by player to access sprites~
    +      s.player.dy ||= 0           # change in position
    +** Processing line: ~      s.player.dx ||= 0~
     - Inside source: true
     *** True Line Result
    -      # Displayed when 's' is pressed by player to access sprites
    -** Processing line: ~      if state.sprite_coords == [] # if sprite_coords is an empty array~
    +      s.player.dx ||= 0
    +** Processing line: ~      s.player_jump_power           = 15~
     - Inside source: true
     *** True Line Result
    -      if state.sprite_coords == [] # if sprite_coords is an empty array
    -** Processing line: ~        count = 1~
    +      s.player_jump_power           = 15
    +** Processing line: ~      s.player_jump_power_duration  = 10~
     - Inside source: true
     *** True Line Result
    -        count = 1
    -** Processing line: ~        temp_x = 165 # sets a starting x and y position for display~
    +      s.player_jump_power_duration  = 10
    +** Processing line: ~      s.player_max_run_speed        = 5~
     - Inside source: true
     *** True Line Result
    -        temp_x = 165 # sets a starting x and y position for display
    -** Processing line: ~        temp_y = 500 + 720~
    +      s.player_max_run_speed        = 5
    +** Processing line: ~      s.player_speed_slowdown_rate  = 0.9~
     - Inside source: true
     *** True Line Result
    -        temp_y = 500 + 720
    -** Processing line: ~        state.sprite_quantity.times do # for the number of sprites you have~
    +      s.player_speed_slowdown_rate  = 0.9
    +** Processing line: ~      s.player_acceleration         = 1~
     - Inside source: true
     *** True Line Result
    -        state.sprite_quantity.times do # for the number of sprites you have
    -** Processing line: ~          state.sprite_coords += [[temp_x, temp_y, count]] # add element to sprite_coords array~
    +      s.player_acceleration         = 1
    +** Processing line: ~      s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)~
     - Inside source: true
     *** True Line Result
    -          state.sprite_coords += [[temp_x, temp_y, count]] # add element to sprite_coords array
    -** Processing line: ~          temp_x += 100 # increment temp_x~
    +      s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          temp_x += 100 # increment temp_x
    -** Processing line: ~          count += 1 # increment count~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          count += 1 # increment count
    -** Processing line: ~          if temp_x > 1280 - (165 + 50) # if exceeding specific horizontal width on screen~
    +
    +** Processing line: ~    # Outputs objects onto the screen~
     - Inside source: true
     *** True Line Result
    -          if temp_x > 1280 - (165 + 50) # if exceeding specific horizontal width on screen
    -** Processing line: ~            temp_x = 165 # a new row of sprites starts~
    +    # Outputs objects onto the screen
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -            temp_x = 165 # a new row of sprites starts
    -** Processing line: ~            temp_y -= 75 # new row of sprites starts 75 units lower than the previous row~
    +    def render
    +** Processing line: ~      outputs.solids << s.platforms.map do |p| # outputs platforms onto screen~
     - Inside source: true
     *** True Line Result
    -            temp_y -= 75 # new row of sprites starts 75 units lower than the previous row
    -** Processing line: ~          end~
    +      outputs.solids << s.platforms.map do |p| # outputs platforms onto screen
    +** Processing line: ~        [p.x + 300, p.y - s.camera[:y], p.w, p.h] # add 300 to place platform in horizontal center~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +        [p.x + 300, p.y - s.camera[:y], p.w, p.h] # add 300 to place platform in horizontal center
    +** Processing line: ~        # don't forget, position of platform is denoted by bottom left hand corner~
     - Inside source: true
     *** True Line Result
    -        end
    +        # don't forget, position of platform is denoted by bottom left hand corner
     ** 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: ~    # Places sprites~
    +** Processing line: ~      # outputs player using hash~
     - Inside source: true
     *** True Line Result
    -    # Places sprites
    -** Processing line: ~    def render~
    +      # outputs player using hash
    +** Processing line: ~      outputs.solids << {~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~~
    +      outputs.solids << {
    +** Processing line: ~        x: s.player.x + 300, # player positioned on top of platform~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets the x, y, width, height, and image path for each sprite in the world collection.~
    +        x: s.player.x + 300, # player positioned on top of platform
    +** Processing line: ~        y: s.player.y - s.camera[:y],~
     - Inside source: true
     *** True Line Result
    -      # Sets the x, y, width, height, and image path for each sprite in the world collection.
    -** Processing line: ~      outputs.sprites << state.world.map do |x, y, sprite|~
    +        y: s.player.y - s.camera[:y],
    +** Processing line: ~        w: s.player.w,~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << state.world.map do |x, y, sprite|
    -** Processing line: ~        [x * state.tile_size, # multiply by size so grid coordinates; pixel value of location~
    +        w: s.player.w,
    +** Processing line: ~        h: s.player.h,~
     - Inside source: true
     *** True Line Result
    -        [x * state.tile_size, # multiply by size so grid coordinates; pixel value of location
    -** Processing line: ~         y * state.tile_size,~
    +        h: s.player.h,
    +** Processing line: ~        r: 100,              # color saturation~
     - Inside source: true
     *** True Line Result
    -         y * state.tile_size,
    -** Processing line: ~         state.tile_size,~
    +        r: 100,              # color saturation
    +** Processing line: ~        g: 100,~
     - Inside source: true
     *** True Line Result
    -         state.tile_size,
    -** Processing line: ~         state.tile_size,~
    +        g: 100,
    +** Processing line: ~        b: 200~
     - Inside source: true
     *** True Line Result
    -         state.tile_size,
    -** Processing line: ~         'sprites/image' + sprite.to_s + '.png'] # uses concatenation to create unique image path~
    +        b: 200
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -         'sprites/image' + sprite.to_s + '.png'] # uses concatenation to create unique image path
    -** Processing line: ~      end~
    +      }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Outputs sprite for the player by setting x, y, width, height, and image path~
    +** Processing line: ~    # Performs calculations~
     - Inside source: true
     *** True Line Result
    -      # Outputs sprite for the player by setting x, y, width, height, and image path
    -** Processing line: ~      outputs.sprites << [state.x,~
    +    # Performs calculations
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << [state.x,
    -** Processing line: ~                          state.y,~
    +    def calc
    +** Processing line: ~      s.platforms.each do |p| # for each platform in the collection~
     - Inside source: true
     *** True Line Result
    -                          state.y,
    -** Processing line: ~                          state.player_width,~
    +      s.platforms.each do |p| # for each platform in the collection
    +** Processing line: ~        p.rect = [p.x, p.y, p.w, p.h] # set the definition~
     - Inside source: true
     *** True Line Result
    -                          state.player_width,
    -** Processing line: ~                          state.player_height,'sprites/player.png']~
    +        p.rect = [p.x, p.y, p.w, p.h] # set the definition
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                          state.player_height,'sprites/player.png']
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Outputs labels as primitives in top right of the screen~
    -- Inside source: true
    -*** True Line Result
    -      # Outputs labels as primitives in top right of the screen
    -** Processing line: ~      outputs.primitives << [920, 700, 'Press \'s\' to access sprites.', 1, 0].label~
    +** Processing line: ~      # sets player point by adding half the player's width to the player's x~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [920, 700, 'Press \'s\' to access sprites.', 1, 0].label
    -** Processing line: ~      outputs.primitives << [920, 675, 'Click existing sprite to delete.', 1, 0].label~
    +      # sets player point by adding half the player's width to the player's x
    +** Processing line: ~      s.player.point = [s.player.x + s.player.w.half, s.player.y] # change + to - and see what happens!~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [920, 675, 'Click existing sprite to delete.', 1, 0].label
    +      s.player.point = [s.player.x + s.player.w.half, s.player.y] # change + to - and see what happens!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.primitives << [920, 640, '<- and -> to move.', 1, 0].label~
    +** Processing line: ~      # search the platforms collection to find if the player's point is inside the rect of a platform~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [920, 640, '<- and -> to move.', 1, 0].label
    -** Processing line: ~      outputs.primitives << [920, 615, 'Press and hold space to jump.', 1, 0].label~
    +      # search the platforms collection to find if the player's point is inside the rect of a platform
    +** Processing line: ~      collision = s.platforms.find { |p| s.player.point.inside_rect? p.rect }~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [920, 615, 'Press and hold space to jump.', 1, 0].label
    +      collision = s.platforms.find { |p| s.player.point.inside_rect? p.rect }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.primitives << [920, 580, 'Press \'e\' to export current map.', 1, 0].label~
    +** Processing line: ~      # if collision occurred and player is moving down (or not moving vertically at all)~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [920, 580, 'Press \'e\' to export current map.', 1, 0].label
    -** Processing line: ~~
    +      # if collision occurred and player is moving down (or not moving vertically at all)
    +** Processing line: ~      if collision && s.player.dy <= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # if the map is saved and less than 120 frames have passed, the label is displayed~
    +      if collision && s.player.dy <= 0
    +** Processing line: ~        s.player.y = collision.rect.y + collision.rect.h - 2 # player positioned on top of platform~
     - Inside source: true
     *** True Line Result
    -      # if the map is saved and less than 120 frames have passed, the label is displayed
    -** Processing line: ~      if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120~
    +        s.player.y = collision.rect.y + collision.rect.h - 2 # player positioned on top of platform
    +** Processing line: ~        s.player.dy = 0 if s.player.dy < 0 # player stops moving vertically~
     - Inside source: true
     *** True Line Result
    -      if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120
    -** Processing line: ~        outputs.primitives << [920, 555, 'Map has been exported!', 1, 0, 50, 100, 50].label~
    +        s.player.dy = 0 if s.player.dy < 0 # player stops moving vertically
    +** Processing line: ~        if !s.player.platform~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << [920, 555, 'Map has been exported!', 1, 0, 50, 100, 50].label
    -** Processing line: ~      end~
    +        if !s.player.platform
    +** Processing line: ~          s.player.dx = 0 # no horizontal movement~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          s.player.dx = 0 # no horizontal movement
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # If player hits 's', following appears~
    +        end
    +** Processing line: ~        # changes horizontal position of player by multiplying collision change in x (dx) by speed and adding it to current x~
     - Inside source: true
     *** True Line Result
    -      # If player hits 's', following appears
    -** Processing line: ~      if state.mode == :selecting~
    +        # changes horizontal position of player by multiplying collision change in x (dx) by speed and adding it to current x
    +** Processing line: ~        s.player.x += collision.dx * collision.speed~
     - Inside source: true
     *** True Line Result
    -      if state.mode == :selecting
    -** Processing line: ~        # White background for sprite selection~
    +        s.player.x += collision.dx * collision.speed
    +** Processing line: ~        s.player.platform = collision # player is on the platform that it collided with (or landed on)~
     - Inside source: true
     *** True Line Result
    -        # White background for sprite selection
    -** Processing line: ~        outputs.primitives << [state.select_menu, 255, 255, 255].solid~
    +        s.player.platform = collision # player is on the platform that it collided with (or landed on)
    +** Processing line: ~        if s.player.falling # if player is falling~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << [state.select_menu, 255, 255, 255].solid
    -** Processing line: ~~
    +        if s.player.falling # if player is falling
    +** Processing line: ~          s.player.dx = 0  # no horizontal movement~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        # Select tile label at the top of the screen~
    +          s.player.dx = 0  # no horizontal movement
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        # Select tile label at the top of the screen
    -** Processing line: ~        outputs.primitives << [state.banner_coords.x, state.banner_coords.y, "Select Sprite (sprites located in \"sprites\" folder)", 10, 1, 0, 0, 0, 255].label~
    +        end
    +** Processing line: ~        s.player.falling = false~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << [state.banner_coords.x, state.banner_coords.y, "Select Sprite (sprites located in \"sprites\" folder)", 10, 1, 0, 0, 0, 255].label
    -** Processing line: ~~
    +        s.player.falling = false
    +** Processing line: ~        s.player.jumped_at = nil~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        # Places sprites in locations calculated in the defaults function~
    +        s.player.jumped_at = nil
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        # Places sprites in locations calculated in the defaults function
    -** Processing line: ~        outputs.primitives << state.sprite_coords.map do |x, y, order|~
    +      else
    +** Processing line: ~        s.player.platform = nil # player is not on a platform~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << state.sprite_coords.map do |x, y, order|
    -** Processing line: ~          [x, y, 50, 50, 'sprites/image' + order.to_s + ".png"].sprite~
    +        s.player.platform = nil # player is not on a platform
    +** Processing line: ~        s.player.y  += s.player.dy # velocity is the change in position~
     - Inside source: true
     *** True Line Result
    -          [x, y, 50, 50, 'sprites/image' + order.to_s + ".png"].sprite
    -** Processing line: ~        end~
    +        s.player.y  += s.player.dy # velocity is the change in position
    +** Processing line: ~        s.player.dy += s.gravity # acceleration is the change in velocity; what goes up must come down~
     - Inside source: true
     *** True Line Result
    -        end
    +        s.player.dy += s.gravity # acceleration is the change in velocity; what goes up must come down
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -26632,638 +26983,666 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Creates sprite following mouse to help indicate which sprite you have selected~
    +** Processing line: ~      s.platforms.each do |p| # for each platform in the collection~
     - Inside source: true
     *** True Line Result
    -      # Creates sprite following mouse to help indicate which sprite you have selected
    -** Processing line: ~      # 10 is subtracted from the mouse's x position so that the sprite is not covered by the mouse icon~
    +      s.platforms.each do |p| # for each platform in the collection
    +** Processing line: ~        p.x += p.dx * p.speed # x is incremented by product of dx and speed (causes platform to move horizontally)~
     - Inside source: true
     *** True Line Result
    -      # 10 is subtracted from the mouse's x position so that the sprite is not covered by the mouse icon
    -** Processing line: ~      outputs.primitives << [inputs.mouse.position.x - 10, inputs.mouse.position.y,~
    +        p.x += p.dx * p.speed # x is incremented by product of dx and speed (causes platform to move horizontally)
    +** Processing line: ~        # changes platform's x so it moves left and right across the screen (between -300 and 300 pixels)~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [inputs.mouse.position.x - 10, inputs.mouse.position.y,
    -** Processing line: ~                             10, 10, 'sprites/image' + state.sprite_selected.to_s + ".png"].sprite~
    +        # changes platform's x so it moves left and right across the screen (between -300 and 300 pixels)
    +** Processing line: ~        if p.x < -300 # if platform goes too far left~
     - Inside source: true
     *** True Line Result
    -                             10, 10, 'sprites/image' + state.sprite_selected.to_s + ".png"].sprite
    -** Processing line: ~    end~
    +        if p.x < -300 # if platform goes too far left
    +** Processing line: ~          p.dx *= -1 # dx is scaled down~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          p.dx *= -1 # dx is scaled down
    +** Processing line: ~          p.x = -300 # as far left as possible within scope~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls methods that perform calculations~
    +          p.x = -300 # as far left as possible within scope
    +** Processing line: ~        elsif p.x > (1000 - p.w) # if platform's x is greater than 300~
     - Inside source: true
     *** True Line Result
    -    # Calls methods that perform calculations
    -** Processing line: ~    def calc~
    +        elsif p.x > (1000 - p.w) # if platform's x is greater than 300
    +** Processing line: ~          p.dx *= -1~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      calc_in_game~
    +          p.dx *= -1
    +** Processing line: ~          p.x = (1000 - p.w) # set to 300 (as far right as possible within scope)~
     - Inside source: true
     *** True Line Result
    -      calc_in_game
    -** Processing line: ~      calc_sprite_selection~
    +          p.x = (1000 - p.w) # set to 300 (as far right as possible within scope)
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      calc_sprite_selection
    -** Processing line: ~    end~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calls methods that perform calculations (if in creating mode)~
    -- Inside source: true
    -*** True Line Result
    -    # Calls methods that perform calculations (if in creating mode)
    -** Processing line: ~    def calc_in_game~
    +** Processing line: ~      delta = (s.player.y - s.camera[:y] - 100) # used to position camera view~
     - Inside source: true
     *** True Line Result
    -    def calc_in_game
    -** Processing line: ~      return unless state.mode == :creating~
    +      delta = (s.player.y - s.camera[:y] - 100) # used to position camera view
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      return unless state.mode == :creating
    -** Processing line: ~      calc_world_lookup~
    +
    +** Processing line: ~      if delta > -200~
     - Inside source: true
     *** True Line Result
    -      calc_world_lookup
    -** Processing line: ~      calc_player~
    +      if delta > -200
    +** Processing line: ~        s.camera[:y] += delta * 0.01 # allows player to see view as they move upwards~
     - Inside source: true
     *** True Line Result
    -      calc_player
    -** Processing line: ~    end~
    +        s.camera[:y] += delta * 0.01 # allows player to see view as they move upwards
    +** Processing line: ~        s.player.x  += s.player.dx # velocity is change in position; change in x increases by dx~
     - Inside source: true
     *** True Line Result
    -    end
    +        s.player.x  += s.player.dx # velocity is change in position; change in x increases by dx
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_world_lookup~
    +** Processing line: ~        # searches platform collection to find platforms located more than 300 pixels above the player~
     - Inside source: true
     *** True Line Result
    -    def calc_world_lookup
    -** Processing line: ~      # If the tile size isn't equal to the previous tile size,~
    +        # searches platform collection to find platforms located more than 300 pixels above the player
    +** Processing line: ~        has_platforms = s.platforms.find { |p| p.y > (s.player.y + 300) }~
     - Inside source: true
     *** True Line Result
    -      # If the tile size isn't equal to the previous tile size,
    -** Processing line: ~      # the previous tile size is set to the tile size,~
    +        has_platforms = s.platforms.find { |p| p.y > (s.player.y + 300) }
    +** Processing line: ~        if !has_platforms # if there are no platforms 300 pixels above the player~
     - Inside source: true
     *** True Line Result
    -      # the previous tile size is set to the tile size,
    -** Processing line: ~      # and world_lookup hash is set to empty.~
    +        if !has_platforms # if there are no platforms 300 pixels above the player
    +** Processing line: ~          width = 700 - (700 * (0.1 * s.player.platforms_cleared)) # the next platform is smaller than previous~
     - Inside source: true
     *** True Line Result
    -      # and world_lookup hash is set to empty.
    -** Processing line: ~      if state.tile_size != state.previous_tile_size~
    +          width = 700 - (700 * (0.1 * s.player.platforms_cleared)) # the next platform is smaller than previous
    +** Processing line: ~          s.player.platforms_cleared += 1 # player successfully cleared another platform~
     - Inside source: true
     *** True Line Result
    -      if state.tile_size != state.previous_tile_size
    -** Processing line: ~        state.previous_tile_size = state.tile_size~
    +          s.player.platforms_cleared += 1 # player successfully cleared another platform
    +** Processing line: ~          last_platform = s.platforms[-1] # platform just cleared becomes last platform~
     - Inside source: true
     *** True Line Result
    -        state.previous_tile_size = state.tile_size
    -** Processing line: ~        state.world_lookup = {}~
    +          last_platform = s.platforms[-1] # platform just cleared becomes last platform
    +** Processing line: ~          # another platform is created 300 pixels above the last platform, and this~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup = {}
    -** Processing line: ~      end~
    +          # another platform is created 300 pixels above the last platform, and this
    +** Processing line: ~          # new platform has a smaller width and moves faster than all previous platforms~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          # new platform has a smaller width and moves faster than all previous platforms
    +** Processing line: ~          s.platforms << new_platform(x: (700 - width) * rand, # random x position~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # return if world_lookup is not empty or if world is empty~
    +          s.platforms << new_platform(x: (700 - width) * rand, # random x position
    +** Processing line: ~                                      y: last_platform.y + 300,~
     - Inside source: true
     *** True Line Result
    -      # return if world_lookup is not empty or if world is empty
    -** Processing line: ~      return if state.world_lookup.keys.length > 0~
    +                                      y: last_platform.y + 300,
    +** Processing line: ~                                      w: width,~
     - Inside source: true
     *** True Line Result
    -      return if state.world_lookup.keys.length > 0
    -** Processing line: ~      return unless state.world.length > 0~
    +                                      w: width,
    +** Processing line: ~                                      h: 32,~
     - Inside source: true
     *** True Line Result
    -      return unless state.world.length > 0
    -** Processing line: ~~
    +                                      h: 32,
    +** Processing line: ~                                      dx: 1.randomize(:sign), # random change in x~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Searches through the world and finds the coordinates that exist~
    +                                      dx: 1.randomize(:sign), # random change in x
    +** Processing line: ~                                      speed: 2 * s.player.platforms_cleared,~
     - Inside source: true
     *** True Line Result
    -      # Searches through the world and finds the coordinates that exist
    -** Processing line: ~      state.world_lookup = {}~
    +                                      speed: 2 * s.player.platforms_cleared,
    +** Processing line: ~                                      rect: nil)~
     - Inside source: true
     *** True Line Result
    -      state.world_lookup = {}
    -** Processing line: ~      state.world.each { |x, y| state.world_lookup[[x, y]] = true }~
    +                                      rect: nil)
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      state.world.each { |x, y| state.world_lookup[[x, y]] = true }
    -** Processing line: ~~
    +        end
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Assigns collision rects for every sprite drawn~
    +      else
    +** Processing line: ~        s.as_hash.clear # otherwise clear the hash (no new platform is necessary)~
     - Inside source: true
     *** True Line Result
    -      # Assigns collision rects for every sprite drawn
    -** Processing line: ~      state.world_collision_rects =~
    +        s.as_hash.clear # otherwise clear the hash (no new platform is necessary)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      state.world_collision_rects =
    -** Processing line: ~        state.world_lookup~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup
    -** Processing line: ~             .keys~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -             .keys
    -** Processing line: ~             .map do |coord_x, coord_y|~
    +
    +** Processing line: ~    # Takes input from the user to move the player~
     - Inside source: true
     *** True Line Result
    -             .map do |coord_x, coord_y|
    -** Processing line: ~               s = state.tile_size~
    +    # Takes input from the user to move the player
    +** Processing line: ~    def input~
     - Inside source: true
     *** True Line Result
    -               s = state.tile_size
    -** Processing line: ~               # Multiplying by s (the size of a tile) ensures that the rect is~
    +    def input
    +** Processing line: ~      if inputs.keyboard.space # if the space bar is pressed~
     - Inside source: true
     *** True Line Result
    -               # Multiplying by s (the size of a tile) ensures that the rect is
    -** Processing line: ~               # placed exactly where you want it to be placed (causes grid to coordinate)~
    +      if inputs.keyboard.space # if the space bar is pressed
    +** Processing line: ~        s.player.jumped_at ||= s.tick_count # set to current frame~
     - Inside source: true
     *** True Line Result
    -               # placed exactly where you want it to be placed (causes grid to coordinate)
    -** Processing line: ~               # How many pixels horizontally across and vertically up and down~
    +        s.player.jumped_at ||= s.tick_count # set to current frame
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -               # How many pixels horizontally across and vertically up and down
    -** Processing line: ~               x = s * coord_x~
    +
    +** Processing line: ~        # if the time that has passed since the jump is less than the duration of a jump (10 frames)~
     - Inside source: true
     *** True Line Result
    -               x = s * coord_x
    -** Processing line: ~               y = s * coord_y~
    +        # if the time that has passed since the jump is less than the duration of a jump (10 frames)
    +** Processing line: ~        # and the player is not falling~
     - Inside source: true
     *** True Line Result
    -               y = s * coord_y
    -** Processing line: ~               {~
    +        # and the player is not falling
    +** Processing line: ~        if s.player.jumped_at.elapsed_time < s.player_jump_power_duration && !s.player.falling~
     - Inside source: true
     *** True Line Result
    -               {
    -** Processing line: ~                 args:       [coord_x, coord_y],~
    +        if s.player.jumped_at.elapsed_time < s.player_jump_power_duration && !s.player.falling
    +** Processing line: ~          s.player.dy = s.player_jump_power # player jumps up~
     - Inside source: true
     *** True Line Result
    -                 args:       [coord_x, coord_y],
    -** Processing line: ~                 left_right: [x,     y + 4, s,     s - 6], # hash keys and values~
    +          s.player.dy = s.player_jump_power # player jumps up
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -                 left_right: [x,     y + 4, s,     s - 6], # hash keys and values
    -** Processing line: ~                 top:        [x + 4, y + 6, s - 8, s - 6],~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                 top:        [x + 4, y + 6, s - 8, s - 6],
    -** Processing line: ~                 bottom:     [x + 1, y - 1, s - 2, s - 8],~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                 bottom:     [x + 1, y - 1, s - 2, s - 8],
    -** Processing line: ~               }~
    +
    +** Processing line: ~      if inputs.keyboard.key_up.space # if space bar is in "up" state~
     - Inside source: true
     *** True Line Result
    -               }
    -** Processing line: ~             end~
    +      if inputs.keyboard.key_up.space # if space bar is in "up" state
    +** Processing line: ~        s.player.falling = true # player is falling~
     - Inside source: true
     *** True Line Result
    -             end
    -** Processing line: ~    end~
    +        s.player.falling = true # player is falling
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calculates movement of player and calls methods that perform collision calculations~
    +** Processing line: ~      if inputs.keyboard.left # if left key is pressed~
     - Inside source: true
     *** True Line Result
    -    # Calculates movement of player and calls methods that perform collision calculations
    -** Processing line: ~    def calc_player~
    +      if inputs.keyboard.left # if left key is pressed
    +** Processing line: ~        s.player.dx -= s.player_acceleration # player's position changes, decremented by acceleration~
     - Inside source: true
     *** True Line Result
    -    def calc_player
    -** Processing line: ~      state.dy += state.gravity  # what goes up must come down because of gravity~
    +        s.player.dx -= s.player_acceleration # player's position changes, decremented by acceleration
    +** Processing line: ~        s.player.dx = s.player.dx.greater(-s.player_max_run_speed) # dx is either current dx or -5, whichever is greater~
     - Inside source: true
     *** True Line Result
    -      state.dy += state.gravity  # what goes up must come down because of gravity
    -** Processing line: ~      calc_box_collision~
    +        s.player.dx = s.player.dx.greater(-s.player_max_run_speed) # dx is either current dx or -5, whichever is greater
    +** Processing line: ~      elsif inputs.keyboard.right # if right key is pressed~
     - Inside source: true
     *** True Line Result
    -      calc_box_collision
    -** Processing line: ~      calc_edge_collision~
    +      elsif inputs.keyboard.right # if right key is pressed
    +** Processing line: ~        s.player.dx += s.player_acceleration # player's position changes, incremented by acceleration~
     - Inside source: true
     *** True Line Result
    -      calc_edge_collision
    -** Processing line: ~      state.y  += state.dy       # Since velocity is the change in position, the change in y increases by dy~
    +        s.player.dx += s.player_acceleration # player's position changes, incremented by acceleration
    +** Processing line: ~        s.player.dx  = s.player.dx.lesser(s.player_max_run_speed) # dx is either current dx or 5, whichever is lesser~
     - Inside source: true
     *** True Line Result
    -      state.y  += state.dy       # Since velocity is the change in position, the change in y increases by dy
    -** Processing line: ~      state.x  += state.dx       # Ditto line above but dx and x~
    +        s.player.dx  = s.player.dx.lesser(s.player_max_run_speed) # dx is either current dx or 5, whichever is lesser
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -      state.x  += state.dx       # Ditto line above but dx and x
    -** Processing line: ~      state.dx *= 0.8            # Scales dx down~
    +      else
    +** Processing line: ~        s.player.dx *= s.player_speed_slowdown_rate # scales dx down~
     - Inside source: true
     *** True Line Result
    -      state.dx *= 0.8            # Scales dx down
    +        s.player.dx *= s.player_speed_slowdown_rate # scales dx down
    +** 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: ~    # Calls methods that determine whether the player collides with any world_collision_rects.~
    +** Processing line: ~  $game = VerticalPlatformer.new~
     - Inside source: true
     *** True Line Result
    -    # Calls methods that determine whether the player collides with any world_collision_rects.
    -** Processing line: ~    def calc_box_collision~
    +  $game = VerticalPlatformer.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def calc_box_collision
    -** Processing line: ~      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      return unless state.world_lookup.keys.length > 0 # return unless hash has atleast 1 key
    -** Processing line: ~      collision_floor~
    +  def tick args
    +** Processing line: ~    $game.args = args~
     - Inside source: true
     *** True Line Result
    -      collision_floor
    -** Processing line: ~      collision_left~
    +    $game.args = args
    +** Processing line: ~    $game.tick~
     - Inside source: true
     *** True Line Result
    -      collision_left
    -** Processing line: ~      collision_right~
    +    $game.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      collision_right
    -** Processing line: ~      collision_ceiling~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      collision_ceiling
    -** Processing line: ~    end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.~
    -- Inside source: true
    +** Processing line: ~*** Physics And Collisions - Bouncing On Collision - ball.rb~
    +- Header detected.
     *** True Line Result
    -    # Finds collisions between the bottom of the player's rect and the top of a world_collision_rect.
    -** Processing line: ~    def collision_floor~
    -- Inside source: true
    +
     *** True Line Result
    -    def collision_floor
    -** Processing line: ~      return unless state.dy <= 0 # return unless player is going down or is as far down as possible~
    +*** Physics And Collisions - Bouncing On Collision - ball.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/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb~
     - Inside source: true
     *** True Line Result
    -      return unless state.dy <= 0 # return unless player is going down or is as far down as possible
    -** Processing line: ~      player_rect = [state.x, next_y, state.tile_size, state.tile_size] # definition of player~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb
    +** Processing line: ~  GRAVITY = -0.08~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x, next_y, state.tile_size, state.tile_size] # definition of player
    +  GRAVITY = -0.08
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between player's~
    +** Processing line: ~  class Ball~
     - Inside source: true
     *** True Line Result
    -      # Runs through all the sprites on the field and finds all intersections between player's
    -** Processing line: ~      # bottom and the top of a rect.~
    +  class Ball
    +** Processing line: ~      attr_accessor :velocity, :center, :radius, :collision_enabled~
     - Inside source: true
     *** True Line Result
    -      # bottom and the top of a rect.
    -** Processing line: ~      floor_collisions = state.world_collision_rects~
    +      attr_accessor :velocity, :center, :radius, :collision_enabled
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      floor_collisions = state.world_collision_rects
    -** Processing line: ~                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }~
    +
    +** Processing line: ~      def initialize args~
     - Inside source: true
     *** True Line Result
    -                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }
    -** Processing line: ~                           .first~
    +      def initialize args
    +** Processing line: ~          #Start the ball in the top center~
     - Inside source: true
     *** True Line Result
    -                           .first
    +          #Start the ball in the top center
    +** Processing line: ~          #@x = args.grid.w / 2~
    +- Inside source: true
    +*** True Line Result
    +          #@x = args.grid.w / 2
    +** Processing line: ~          #@y = args.grid.h - 20~
    +- Inside source: true
    +*** True Line Result
    +          #@y = args.grid.h - 20
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless floor_collisions # performs following changes if a collision has occurred~
    +** Processing line: ~          @velocity = {x: 0, y: 0}~
     - Inside source: true
     *** True Line Result
    -      return unless floor_collisions # performs following changes if a collision has occurred
    -** Processing line: ~      state.y = floor_collisions[:top].top # y of player is set to the y of the colliding rect's top~
    +          @velocity = {x: 0, y: 0}
    +** Processing line: ~          #@width =  20~
     - Inside source: true
     *** True Line Result
    -      state.y = floor_collisions[:top].top # y of player is set to the y of the colliding rect's top
    -** Processing line: ~      state.dy = 0 # no change in y because the player's path is blocked~
    +          #@width =  20
    +** Processing line: ~          #@height = @width~
     - Inside source: true
     *** True Line Result
    -      state.dy = 0 # no change in y because the player's path is blocked
    -** Processing line: ~    end~
    +          #@height = @width
    +** Processing line: ~          @radius = 20.0 / 2.0~
     - Inside source: true
     *** True Line Result
    -    end
    +          @radius = 20.0 / 2.0
    +** Processing line: ~          @center = {x: (args.grid.w / 2), y: (args.grid.h)}~
    +- Inside source: true
    +*** True Line Result
    +          @center = {x: (args.grid.w / 2), y: (args.grid.h)}
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the player's left side and the right side of a world_collision_rect.~
    +** Processing line: ~          #@left_wall = (args.state.board_width + args.grid.w / 8)~
     - Inside source: true
     *** True Line Result
    -    # Finds collisions between the player's left side and the right side of a world_collision_rect.
    -** Processing line: ~    def collision_left~
    +          #@left_wall = (args.state.board_width + args.grid.w / 8)
    +** Processing line: ~          #@right_wall = @left_wall + args.state.board_width~
     - Inside source: true
     *** True Line Result
    -    def collision_left
    -** Processing line: ~      return unless state.dx < 0 # return unless player is moving left~
    +          #@right_wall = @left_wall + args.state.board_width
    +** Processing line: ~          @left_wall = 0~
     - Inside source: true
     *** True Line Result
    -      return unless state.dx < 0 # return unless player is moving left
    -** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
    +          @left_wall = 0
    +** Processing line: ~          @right_wall = $args.grid.right~
     - Inside source: true
     *** True Line Result
    -      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
    +          @right_wall = $args.grid.right
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the player's left side~
    -- Inside source: true
    -*** True Line Result
    -      # Runs through all the sprites on the field and finds all intersections between the player's left side
    -** Processing line: ~      # and the right side of a rect.~
    -- Inside source: true
    -*** True Line Result
    -      # and the right side of a rect.
    -** Processing line: ~      left_side_collisions = state.world_collision_rects~
    +** Processing line: ~          @max_velocity = 7~
     - Inside source: true
     *** True Line Result
    -      left_side_collisions = state.world_collision_rects
    -** Processing line: ~                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
    +          @max_velocity = 7
    +** Processing line: ~          @collision_enabled = true~
     - Inside source: true
     *** True Line Result
    -                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
    -** Processing line: ~                               .first~
    +          @collision_enabled = true
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                               .first
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless left_side_collisions # return unless collision occurred~
    +** Processing line: ~      #Move the ball according to its velocity~
     - Inside source: true
     *** True Line Result
    -      return unless left_side_collisions # return unless collision occurred
    -** Processing line: ~      state.x = left_side_collisions[:left_right].right # sets player's x to the x of the colliding rect's right side~
    +      #Move the ball according to its velocity
    +** Processing line: ~      def update args~
     - Inside source: true
     *** True Line Result
    -      state.x = left_side_collisions[:left_right].right # sets player's x to the x of the colliding rect's right side
    -** Processing line: ~      state.dx = 0 # no change in x because the player's path is blocked~
    +      def update args
    +** Processing line: ~        @center.x += @velocity.x~
     - Inside source: true
     *** True Line Result
    -      state.dx = 0 # no change in x because the player's path is blocked
    -** Processing line: ~    end~
    +        @center.x += @velocity.x
    +** Processing line: ~        @center.y += @velocity.y~
     - Inside source: true
     *** True Line Result
    -    end
    +        @center.y += @velocity.y
    +** Processing line: ~        @velocity.y += GRAVITY~
    +- Inside source: true
    +*** True Line Result
    +        @velocity.y += GRAVITY
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds collisions between the right side of the player and the left side of a world_collision_rect.~
    +** Processing line: ~        alpha = 0.2~
     - Inside source: true
     *** True Line Result
    -    # Finds collisions between the right side of the player and the left side of a world_collision_rect.
    -** Processing line: ~    def collision_right~
    +        alpha = 0.2
    +** Processing line: ~        if @center.y-@radius <= 0~
     - Inside source: true
     *** True Line Result
    -    def collision_right
    -** Processing line: ~      return unless state.dx > 0 # return unless player is moving right~
    +        if @center.y-@radius <= 0
    +** Processing line: ~          @velocity.y  = (@velocity.y.abs*0.7).abs~
     - Inside source: true
     *** True Line Result
    -      return unless state.dx > 0 # return unless player is moving right
    -** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
    +          @velocity.y  = (@velocity.y.abs*0.7).abs
    +** Processing line: ~          @velocity.x  = (@velocity.x.abs*0.9).abs * ((@velocity.x < 0) ? -1 : 1)~
     - Inside source: true
     *** True Line Result
    -      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
    +          @velocity.x  = (@velocity.x.abs*0.9).abs * ((@velocity.x < 0) ? -1 : 1)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the  player's~
    +** Processing line: ~          if @velocity.y.abs() < alpha~
     - Inside source: true
     *** True Line Result
    -      # Runs through all the sprites on the field and finds all intersections between the  player's
    -** Processing line: ~      # right side and the left side of a rect.~
    +          if @velocity.y.abs() < alpha
    +** Processing line: ~            @velocity.y=0~
     - Inside source: true
     *** True Line Result
    -      # right side and the left side of a rect.
    -** Processing line: ~      right_side_collisions = state.world_collision_rects~
    +            @velocity.y=0
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -      right_side_collisions = state.world_collision_rects
    -** Processing line: ~                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
    +          end
    +** Processing line: ~          if @velocity.x.abs() < alpha~
     - Inside source: true
     *** True Line Result
    -                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
    -** Processing line: ~                                .first~
    +          if @velocity.x.abs() < alpha
    +** Processing line: ~            @velocity.x=0~
     - Inside source: true
     *** True Line Result
    -                                .first
    +            @velocity.x=0
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless right_side_collisions # return unless collision occurred~
    +** Processing line: ~        if @center.x > args.grid.right+@radius*2~
     - Inside source: true
     *** True Line Result
    -      return unless right_side_collisions # return unless collision occurred
    -** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size # player's x is set to the x of colliding rect's left side (minus tile size since x is the player's bottom left corner)~
    +        if @center.x > args.grid.right+@radius*2
    +** Processing line: ~          @center.x = 0-@radius~
     - Inside source: true
     *** True Line Result
    -      state.x = right_side_collisions[:left_right].left - state.tile_size # player's x is set to the x of colliding rect's left side (minus tile size since x is the player's bottom left corner)
    -** Processing line: ~      state.dx = 0 # no change in x because the player's path is blocked~
    +          @center.x = 0-@radius
    +** Processing line: ~        elsif @center.x< 0-@radius*2~
     - Inside source: true
     *** True Line Result
    -      state.dx = 0 # no change in x because the player's path is blocked
    -** Processing line: ~    end~
    +        elsif @center.x< 0-@radius*2
    +** Processing line: ~          @center.x = args.grid.right + @radius~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          @center.x = args.grid.right + @radius
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    # Finds collisions between the top of the player's rect and the bottom of a world_collision_rect.
    -** Processing line: ~    def collision_ceiling~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def collision_ceiling
    -** Processing line: ~      return unless state.dy > 0 # return unless player is moving up~
    +
    +** Processing line: ~      def wallBounds args~
     - Inside source: true
     *** True Line Result
    -      return unless state.dy > 0 # return unless player is moving up
    -** Processing line: ~      player_rect = [state.x, next_y, state.player_width, state.player_height]~
    +      def wallBounds args
    +** Processing line: ~          #if @x < @left_wall || @x + @width > @right_wall~
     - Inside source: true
     *** True Line Result
    -      player_rect = [state.x, next_y, state.player_width, state.player_height]
    -** Processing line: ~~
    +          #if @x < @left_wall || @x + @width > @right_wall
    +** Processing line: ~              #@velocity.x *= -1.1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Runs through all the sprites on the field and finds all intersections between the player's top~
    +              #@velocity.x *= -1.1
    +** Processing line: ~              #if @velocity.x > @max_velocity~
     - Inside source: true
     *** True Line Result
    -      # Runs through all the sprites on the field and finds all intersections between the player's top
    -** Processing line: ~      # and the bottom of a rect.~
    +              #if @velocity.x > @max_velocity
    +** Processing line: ~                  #@velocity.x = @max_velocity~
     - Inside source: true
     *** True Line Result
    -      # and the bottom of a rect.
    -** Processing line: ~      ceil_collisions = state.world_collision_rects~
    +                  #@velocity.x = @max_velocity
    +** Processing line: ~              #elsif @velocity.x < @max_velocity * -1~
     - Inside source: true
     *** True Line Result
    -      ceil_collisions = state.world_collision_rects
    -** Processing line: ~                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }~
    +              #elsif @velocity.x < @max_velocity * -1
    +** Processing line: ~                  #@velocity.x = @max_velocity * -1~
     - Inside source: true
     *** True Line Result
    -                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }
    -** Processing line: ~                          .first~
    +                  #@velocity.x = @max_velocity * -1
    +** Processing line: ~              #end~
     - Inside source: true
     *** True Line Result
    -                          .first
    -** Processing line: ~~
    +              #end
    +** Processing line: ~          #end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      return unless ceil_collisions # return unless collision occurred~
    +          #end
    +** Processing line: ~          #if @y < 0 || @y + @height > args.grid.h~
     - Inside source: true
     *** True Line Result
    -      return unless ceil_collisions # return unless collision occurred
    -** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size # player's y is set to the y of the colliding rect's bottom (minus tile size)~
    +          #if @y < 0 || @y + @height > args.grid.h
    +** Processing line: ~              #@velocity.y *= -1.1~
     - Inside source: true
     *** True Line Result
    -      state.y = ceil_collisions[:bottom].y - state.tile_size # player's y is set to the y of the colliding rect's bottom (minus tile size)
    -** Processing line: ~      state.dy = 0 # no change in y because the player's path is blocked~
    +              #@velocity.y *= -1.1
    +** Processing line: ~              #if @velocity.y > @max_velocity~
     - Inside source: true
     *** True Line Result
    -      state.dy = 0 # no change in y because the player's path is blocked
    -** Processing line: ~    end~
    +              #if @velocity.y > @max_velocity
    +** Processing line: ~                  #@velocity.y = @max_velocity~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                  #@velocity.y = @max_velocity
    +** Processing line: ~              #elsif @velocity.y < @max_velocity * -1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Makes sure the player remains within the screen's dimensions.~
    +              #elsif @velocity.y < @max_velocity * -1
    +** Processing line: ~                  #@velocity.y = @max_velocity * -1~
     - Inside source: true
     *** True Line Result
    -    # Makes sure the player remains within the screen's dimensions.
    -** Processing line: ~    def calc_edge_collision~
    +                  #@velocity.y = @max_velocity * -1
    +** Processing line: ~              #end~
     - Inside source: true
     *** True Line Result
    -    def calc_edge_collision
    -** Processing line: ~      # Ensures that player doesn't fall below the map~
    +              #end
    +** Processing line: ~          #end~
     - Inside source: true
     *** True Line Result
    -      # Ensures that player doesn't fall below the map
    -** Processing line: ~      if next_y < 0 && state.dy < 0 # if player is moving down and is about to fall (next_y) below the map's scope~
    +          #end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      if next_y < 0 && state.dy < 0 # if player is moving down and is about to fall (next_y) below the map's scope
    -** Processing line: ~        state.y = 0 # 0 is the lowest the player can be while staying on the screen~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.y = 0 # 0 is the lowest the player can be while staying on the screen
    -** Processing line: ~        state.dy = 0~
    +
    +** Processing line: ~      #render the ball to the screen~
     - Inside source: true
     *** True Line Result
    -        state.dy = 0
    -** Processing line: ~      # Ensures player doesn't go insanely high~
    +      #render the ball to the screen
    +** Processing line: ~      def draw args~
     - Inside source: true
     *** True Line Result
    -      # Ensures player doesn't go insanely high
    -** Processing line: ~      elsif next_y > 720 - state.tile_size && state.dy > 0 # if player is moving up, about to exceed map's scope~
    +      def draw args
    +** Processing line: ~          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];~
     - Inside source: true
     *** True Line Result
    -      elsif next_y > 720 - state.tile_size && state.dy > 0 # if player is moving up, about to exceed map's scope
    -** Processing line: ~        state.y = 720 - state.tile_size # if we don't subtract tile_size, we won't be able to see the player on the screen~
    +          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];
    +** Processing line: ~          args.outputs.sprites << [~
     - Inside source: true
     *** True Line Result
    -        state.y = 720 - state.tile_size # if we don't subtract tile_size, we won't be able to see the player on the screen
    -** Processing line: ~        state.dy = 0~
    +          args.outputs.sprites << [
    +** Processing line: ~            @center.x-@radius,~
     - Inside source: true
     *** True Line Result
    -        state.dy = 0
    -** Processing line: ~      end~
    +            @center.x-@radius,
    +** Processing line: ~            @center.y-@radius,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +            @center.y-@radius,
    +** Processing line: ~            @radius*2,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Ensures that player remains in the horizontal range its supposed to~
    +            @radius*2,
    +** Processing line: ~            @radius*2,~
     - Inside source: true
     *** True Line Result
    -      # Ensures that player remains in the horizontal range its supposed to
    -** Processing line: ~      if state.x >= 1280 - state.tile_size && state.dx > 0 # if the player is moving too far right~
    +            @radius*2,
    +** Processing line: ~            "sprites/circle-white.png",~
     - Inside source: true
     *** True Line Result
    -      if state.x >= 1280 - state.tile_size && state.dx > 0 # if the player is moving too far right
    -** Processing line: ~        state.x = 1280 - state.tile_size # farthest right the player can be while remaining in the screen's scope~
    +            "sprites/circle-white.png",
    +** Processing line: ~            0,~
     - Inside source: true
     *** True Line Result
    -        state.x = 1280 - state.tile_size # farthest right the player can be while remaining in the screen's scope
    -** Processing line: ~        state.dx = 0~
    +            0,
    +** Processing line: ~            255,~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      elsif state.x <= 0 && state.dx < 0 # if the player is moving too far left~
    +            255,
    +** Processing line: ~            255,    #r~
     - Inside source: true
     *** True Line Result
    -      elsif state.x <= 0 && state.dx < 0 # if the player is moving too far left
    -** Processing line: ~        state.x = 0 # farthest left the player can be while remaining in the screen's scope~
    +            255,    #r
    +** Processing line: ~            0,    #g~
     - Inside source: true
     *** True Line Result
    -        state.x = 0 # farthest left the player can be while remaining in the screen's scope
    -** Processing line: ~        state.dx = 0~
    +            0,    #g
    +** Processing line: ~            255   #b~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    +            255   #b
    +** Processing line: ~          ]~
    +- Inside source: true
    +*** True Line Result
    +          ]
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -27276,166 +27655,178 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_sprite_selection~
    +** 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: ~*** Physics And Collisions - Bouncing On Collision - block.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Bouncing On Collision - block.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/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb~
     - Inside source: true
     *** True Line Result
    -    def calc_sprite_selection
    -** Processing line: ~      # Does the transition to bring down the select sprite screen~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
    +** Processing line: ~  DEGREES_TO_RADIANS = Math::PI / 180~
     - Inside source: true
     *** True Line Result
    -      # Does the transition to bring down the select sprite screen
    -** Processing line: ~      if state.mode == :selecting && state.select_menu.y != 0~
    +  DEGREES_TO_RADIANS = Math::PI / 180
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if state.mode == :selecting && state.select_menu.y != 0
    -** Processing line: ~        state.select_menu.y = 0  # sets y position of select menu (shown when 's' is pressed)~
    +
    +** Processing line: ~  class Block~
     - Inside source: true
     *** True Line Result
    -        state.select_menu.y = 0  # sets y position of select menu (shown when 's' is pressed)
    -** Processing line: ~        state.banner_coords.y = 680 # sets y position of Select Sprite banner~
    +  class Block
    +** Processing line: ~    def initialize(x, y, block_size, rotation)~
     - Inside source: true
     *** True Line Result
    -        state.banner_coords.y = 680 # sets y position of Select Sprite banner
    -** Processing line: ~        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|~
    +    def initialize(x, y, block_size, rotation)
    +** Processing line: ~      @x = x~
     - Inside source: true
     *** True Line Result
    -        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|
    -** Processing line: ~          [x, y - 720, w, h] # sets definition of sprites (change '-' to '+' and the sprites can't be seen)~
    +      @x = x
    +** Processing line: ~      @y = y~
     - Inside source: true
     *** True Line Result
    -          [x, y - 720, w, h] # sets definition of sprites (change '-' to '+' and the sprites can't be seen)
    -** Processing line: ~        end~
    +      @y = y
    +** Processing line: ~      @block_size = block_size~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      @block_size = block_size
    +** Processing line: ~      @rotation = rotation~
     - Inside source: true
     *** True Line Result
    -      end
    +      @rotation = rotation
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Does the transition to leave the select sprite screen~
    -- Inside source: true
    -*** True Line Result
    -      # Does the transition to leave the select sprite screen
    -** Processing line: ~      if state.mode == :creating  && state.select_menu.y != 720~
    +** Processing line: ~      #The repel velocity?~
     - Inside source: true
     *** True Line Result
    -      if state.mode == :creating  && state.select_menu.y != 720
    -** Processing line: ~        state.select_menu.y = 720 # sets y position of select menu (menu is retreated back up)~
    +      #The repel velocity?
    +** Processing line: ~      @velocity = {x: 2, y: 0}~
     - Inside source: true
     *** True Line Result
    -        state.select_menu.y = 720 # sets y position of select menu (menu is retreated back up)
    -** Processing line: ~        state.banner_coords.y = 1000 # sets y position of Select Sprite banner~
    +      @velocity = {x: 2, y: 0}
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.banner_coords.y = 1000 # sets y position of Select Sprite banner
    -** Processing line: ~        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|~
    +
    +** Processing line: ~      horizontal_offset = (3 * block_size) * Math.cos(rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -        state.sprite_coords = state.sprite_coords.map do |x, y, w, h|
    -** Processing line: ~          [x, y + 720, w, h] # sets definition of all elements in collection~
    +      horizontal_offset = (3 * block_size) * Math.cos(rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~      vertical_offset = block_size * Math.sin(rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -          [x, y + 720, w, h] # sets definition of all elements in collection
    -** Processing line: ~        end~
    +      vertical_offset = block_size * Math.sin(rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~      if rotation >= 0~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      if rotation >= 0
    +** Processing line: ~        theta = 90 - rotation~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        theta = 90 - rotation
    +** Processing line: ~        #The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def process_inputs~
    +        #The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit
    +** Processing line: ~        modifier = 5~
     - Inside source: true
     *** True Line Result
    -    def process_inputs
    -** Processing line: ~      # If the state.mode is back and if the menu has retreated back up~
    +        modifier = 5
    +** Processing line: ~        x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      # If the state.mode is back and if the menu has retreated back up
    -** Processing line: ~      # call methods that process user inputs~
    +        x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)
    +** Processing line: ~        y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      # call methods that process user inputs
    -** Processing line: ~      if state.mode == :creating~
    +        y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)
    +** Processing line: ~        @x1 = @x - x_offset~
     - Inside source: true
     *** True Line Result
    -      if state.mode == :creating
    -** Processing line: ~        process_inputs_player_movement~
    +        @x1 = @x - x_offset
    +** Processing line: ~        @y1 = @y + y_offset~
     - Inside source: true
     *** True Line Result
    -        process_inputs_player_movement
    -** Processing line: ~        process_inputs_place_tile~
    +        @y1 = @y + y_offset
    +** Processing line: ~        @x2 = @x1 + horizontal_offset~
     - Inside source: true
     *** True Line Result
    -        process_inputs_place_tile
    -** Processing line: ~      end~
    +        @x2 = @x1 + horizontal_offset
    +** Processing line: ~        @y2 = @y1 + (vertical_offset * 3)~
     - Inside source: true
     *** True Line Result
    -      end
    +        @y2 = @y1 + (vertical_offset * 3)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # For each sprite_coordinate added, check what sprite was selected~
    -- Inside source: true
    -*** True Line Result
    -      # For each sprite_coordinate added, check what sprite was selected
    -** Processing line: ~      if state.mode == :selecting~
    +** Processing line: ~        @imaginary_line = [ @x1, @y1, @x2, @y2 ]~
     - Inside source: true
     *** True Line Result
    -      if state.mode == :selecting
    -** Processing line: ~        state.sprite_coords.map do |x, y, order| # goes through all sprites in collection~
    +        @imaginary_line = [ @x1, @y1, @x2, @y2 ]
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        state.sprite_coords.map do |x, y, order| # goes through all sprites in collection
    -** Processing line: ~          # checks that a specific sprite was pressed based on x, y position~
    +      else
    +** Processing line: ~        theta = 90 + rotation~
     - Inside source: true
     *** True Line Result
    -          # checks that a specific sprite was pressed based on x, y position
    -** Processing line: ~          if inputs.mouse.down && # the && (and) sign means ALL statements must be true for the evaluation to be true~
    +        theta = 90 + rotation
    +** Processing line: ~        x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -          if inputs.mouse.down && # the && (and) sign means ALL statements must be true for the evaluation to be true
    -** Processing line: ~             inputs.mouse.down.point.x >= x      && # x is greater than or equal to sprite's x and~
    +        x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)
    +** Processing line: ~        y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -             inputs.mouse.down.point.x >= x      && # x is greater than or equal to sprite's x and
    -** Processing line: ~             inputs.mouse.down.point.x <= x + 50 && # x is less than or equal to 50 pixels to the right~
    +        y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)
    +** Processing line: ~        @x1 = @x + x_offset~
     - Inside source: true
     *** True Line Result
    -             inputs.mouse.down.point.x <= x + 50 && # x is less than or equal to 50 pixels to the right
    -** Processing line: ~             inputs.mouse.down.point.y >= y      && # y is greater than or equal to sprite's y~
    +        @x1 = @x + x_offset
    +** Processing line: ~        @y1 = @y + y_offset + 19~
     - Inside source: true
     *** True Line Result
    -             inputs.mouse.down.point.y >= y      && # y is greater than or equal to sprite's y
    -** Processing line: ~             inputs.mouse.down.point.y <= y + 50 # y is less than or equal to 50 pixels up~
    +        @y1 = @y + y_offset + 19
    +** Processing line: ~        @x2 = @x1 + horizontal_offset~
     - Inside source: true
     *** True Line Result
    -             inputs.mouse.down.point.y <= y + 50 # y is less than or equal to 50 pixels up
    -** Processing line: ~            state.sprite_selected = order # sprite is chosen~
    +        @x2 = @x1 + horizontal_offset
    +** Processing line: ~        @y2 = @y1 + (vertical_offset * 3)~
     - Inside source: true
     *** True Line Result
    -            state.sprite_selected = order # sprite is chosen
    -** Processing line: ~          end~
    +        @y2 = @y1 + (vertical_offset * 3)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +
    +** Processing line: ~        @imaginary_line = [ @x1, @y1, @x2, @y2 ]~
     - Inside source: true
     *** True Line Result
    -        end
    +        @imaginary_line = [ @x1, @y1, @x2, @y2 ]
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -27444,14 +27835,6 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      inputs_export_stage~
    -- Inside source: true
    -*** True Line Result
    -      inputs_export_stage
    -** Processing line: ~      process_inputs_show_available_sprites~
    -- Inside source: true
    -*** True Line Result
    -      process_inputs_show_available_sprites
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -27460,82 +27843,86 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Moves the player based on the keys they press on their keyboard~
    +** Processing line: ~    def draw args~
     - Inside source: true
     *** True Line Result
    -    # Moves the player based on the keys they press on their keyboard
    -** Processing line: ~    def process_inputs_player_movement~
    +    def draw args
    +** Processing line: ~      args.outputs.sprites << [~
     - Inside source: true
     *** True Line Result
    -    def process_inputs_player_movement
    -** Processing line: ~      # Sets dx to 0 if the player lets go of arrow keys (player won't move left or right)~
    +      args.outputs.sprites << [
    +** Processing line: ~        @x,~
     - Inside source: true
     *** True Line Result
    -      # Sets dx to 0 if the player lets go of arrow keys (player won't move left or right)
    -** Processing line: ~      if inputs.keyboard.key_up.right~
    +        @x,
    +** Processing line: ~        @y,~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_up.right
    -** Processing line: ~        state.dx = 0~
    +        @y,
    +** Processing line: ~        @block_size*3,~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      elsif inputs.keyboard.key_up.left~
    +        @block_size*3,
    +** Processing line: ~        @block_size,~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_up.left
    -** Processing line: ~        state.dx = 0~
    +        @block_size,
    +** Processing line: ~        "sprites/square-green.png",~
     - Inside source: true
     *** True Line Result
    -        state.dx = 0
    -** Processing line: ~      end~
    +        "sprites/square-green.png",
    +** Processing line: ~        @rotation~
     - Inside source: true
     *** True Line Result
    -      end
    +        @rotation
    +** Processing line: ~      ]~
    +- Inside source: true
    +*** True Line Result
    +      ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets dx to 3 in whatever direction the player chooses when they hold down (or press) the left or right keys~
    +** Processing line: ~      args.outputs.lines << @imaginary_line~
     - Inside source: true
     *** True Line Result
    -      # Sets dx to 3 in whatever direction the player chooses when they hold down (or press) the left or right keys
    -** Processing line: ~      if inputs.keyboard.key_held.right~
    +      args.outputs.lines << @imaginary_line
    +** Processing line: ~      args.outputs.solids << @debug_shape~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.right
    -** Processing line: ~        state.dx =  3~
    +      args.outputs.solids << @debug_shape
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.dx =  3
    -** Processing line: ~      elsif inputs.keyboard.key_held.left~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.left
    -** Processing line: ~        state.dx = -3~
    +
    +** Processing line: ~    def multiply_matricies~
     - Inside source: true
     *** True Line Result
    -        state.dx = -3
    -** Processing line: ~      end~
    +    def multiply_matricies
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets dy to 5 to make the player ~fly~ when they press the space bar on their keyboard~
    +** Processing line: ~    def calc args~
     - Inside source: true
     *** True Line Result
    -      # Sets dy to 5 to make the player ~fly~ when they press the space bar on their keyboard
    -** Processing line: ~      if inputs.keyboard.key_held.space~
    +    def calc args
    +** Processing line: ~      if collision? args~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.space
    -** Processing line: ~        state.dy = 5~
    +      if collision? args
    +** Processing line: ~          collide args~
     - Inside source: true
     *** True Line Result
    -        state.dy = 5
    +          collide args
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -27548,158 +27935,150 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Adds tile in the place the user holds down the mouse~
    +** Processing line: ~    #Determine if the ball and block are touching~
     - Inside source: true
     *** True Line Result
    -    # Adds tile in the place the user holds down the mouse
    -** Processing line: ~    def process_inputs_place_tile~
    +    #Determine if the ball and block are touching
    +** Processing line: ~    def collision? args~
     - Inside source: true
     *** True Line Result
    -    def process_inputs_place_tile
    -** Processing line: ~      if inputs.mouse.down # if mouse is pressed~
    +    def collision? args
    +** Processing line: ~      #The minimum area enclosed by the center of the ball and the 2 corners of the block~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.down # if mouse is pressed
    -** Processing line: ~        state.world_lookup = {}~
    +      #The minimum area enclosed by the center of the ball and the 2 corners of the block
    +** Processing line: ~      #If the area ever drops below this value, we know there is a collision~
     - Inside source: true
     *** True Line Result
    -        state.world_lookup = {}
    -** Processing line: ~        x, y = to_coord inputs.mouse.down.point # gets x, y coordinates for the grid~
    +      #If the area ever drops below this value, we know there is a collision
    +** Processing line: ~      min_area = ((@block_size * 3) * args.state.ball.radius) / 2~
     - Inside source: true
     *** True Line Result
    -        x, y = to_coord inputs.mouse.down.point # gets x, y coordinates for the grid
    +      min_area = ((@block_size * 3) * args.state.ball.radius) / 2
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # Checks if any coordinates duplicate (already exist in world)~
    -- Inside source: true
    -*** True Line Result
    -        # Checks if any coordinates duplicate (already exist in world)
    -** Processing line: ~        if state.world.any? { |existing_x, existing_y, n| existing_x == x && existing_y == y }~
    -- Inside source: true
    -*** True Line Result
    -        if state.world.any? { |existing_x, existing_y, n| existing_x == x && existing_y == y }
    -** Processing line: ~          #erases existing tile space by rejecting them from world~
    +** Processing line: ~      #https://www.mathopenref.com/coordtrianglearea.html~
     - Inside source: true
     *** True Line Result
    -          #erases existing tile space by rejecting them from world
    -** Processing line: ~          state.world = state.world.reject do |existing_x, existing_y, n|~
    +      #https://www.mathopenref.com/coordtrianglearea.html
    +** Processing line: ~      ax = @x1~
     - Inside source: true
     *** True Line Result
    -          state.world = state.world.reject do |existing_x, existing_y, n|
    -** Processing line: ~            existing_x == x && existing_y == y~
    +      ax = @x1
    +** Processing line: ~      ay = @y1~
     - Inside source: true
     *** True Line Result
    -            existing_x == x && existing_y == y
    -** Processing line: ~          end~
    +      ay = @y1
    +** Processing line: ~      bx = @x2~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        else~
    +      bx = @x2
    +** Processing line: ~      by = @y2~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          state.world << [x, y, state.sprite_selected] # If no duplicates, add the sprite~
    +      by = @y2
    +** Processing line: ~      cx = args.state.ball.center.x~
     - Inside source: true
     *** True Line Result
    -          state.world << [x, y, state.sprite_selected] # If no duplicates, add the sprite
    -** Processing line: ~        end~
    +      cx = args.state.ball.center.x
    +** Processing line: ~      cy = args.state.ball.center.y~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      cy = args.state.ball.center.y
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~      current_area = (ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))/2~
     - Inside source: true
     *** True Line Result
    -    end
    +      current_area = (ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))/2
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Stores/exports world collection's info (coordinates, sprite number) into a file~
    +** Processing line: ~      collision = false~
     - Inside source: true
     *** True Line Result
    -    # Stores/exports world collection's info (coordinates, sprite number) into a file
    -** Processing line: ~    def inputs_export_stage~
    +      collision = false
    +** Processing line: ~      if @rotation >= 0~
     - Inside source: true
     *** True Line Result
    -    def inputs_export_stage
    -** Processing line: ~      if inputs.keyboard.key_down.e # if "e" is pressed~
    +      if @rotation >= 0
    +** Processing line: ~        if (current_area < min_area &&~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_down.e # if "e" is pressed
    -** Processing line: ~        export_string = state.world.map do |x, y, sprite_number| # stores world info in a string~
    +        if (current_area < min_area &&
    +** Processing line: ~          current_area > 0 &&~
     - Inside source: true
     *** True Line Result
    -        export_string = state.world.map do |x, y, sprite_number| # stores world info in a string
    -** Processing line: ~          "#{x},#{y},#{sprite_number}"                           # using string interpolation~
    +          current_area > 0 &&
    +** Processing line: ~          args.state.ball.center.y > @y1 &&~
     - Inside source: true
     *** True Line Result
    -          "#{x},#{y},#{sprite_number}"                           # using string interpolation
    -** Processing line: ~        end~
    +          args.state.ball.center.y > @y1 &&
    +** Processing line: ~          args.state.ball.center.x < @x2)~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        gtk.write_file(MAP_FILE_PATH, export_string.join("\n")) # writes string into a file~
    +          args.state.ball.center.x < @x2)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        gtk.write_file(MAP_FILE_PATH, export_string.join("\n")) # writes string into a file
    -** Processing line: ~        state.map_saved_at = state.tick_count # frame number (passage of time) when the map was saved~
    +
    +** Processing line: ~          collision = true~
     - Inside source: true
     *** True Line Result
    -        state.map_saved_at = state.tick_count # frame number (passage of time) when the map was saved
    -** Processing line: ~      end~
    +          collision = true
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +        end
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      else
    +** Processing line: ~        if (current_area < min_area &&~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def process_inputs_show_available_sprites~
    +        if (current_area < min_area &&
    +** Processing line: ~          current_area > 0 &&~
     - Inside source: true
     *** True Line Result
    -    def process_inputs_show_available_sprites
    -** Processing line: ~      # Based on keyboard input, the entity (:creating and :selecting) switch~
    +          current_area > 0 &&
    +** Processing line: ~          args.state.ball.center.y > @y2 &&~
     - Inside source: true
     *** True Line Result
    -      # Based on keyboard input, the entity (:creating and :selecting) switch
    -** Processing line: ~      if inputs.keyboard.key_held.s && state.mode == :creating # if "s" is pressed and currently creating~
    +          args.state.ball.center.y > @y2 &&
    +** Processing line: ~          args.state.ball.center.x > @x1)~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.s && state.mode == :creating # if "s" is pressed and currently creating
    -** Processing line: ~        state.mode = :selecting # will change to selecting~
    +          args.state.ball.center.x > @x1)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.mode = :selecting # will change to selecting
    -** Processing line: ~        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off~
    +
    +** Processing line: ~        collision = true~
     - Inside source: true
     *** True Line Result
    -        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off
    -** Processing line: ~      elsif inputs.keyboard.key_held.s && state.mode == :selecting # if "s" is pressed and currently selecting~
    +        collision = true
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.s && state.mode == :selecting # if "s" is pressed and currently selecting
    -** Processing line: ~        state.mode = :creating # will change to creating~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        state.mode = :creating # will change to creating
    -** Processing line: ~        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        inputs.keyboard.clear # VERY IMPORTANT! If not present, it'll flicker between on and off
    -** Processing line: ~      end~
    +
    +** Processing line: ~      return collision~
     - Inside source: true
     *** True Line Result
    -      end
    +      return collision
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -27708,178 +28087,230 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Loads the world collection by reading from the map.txt file in the app folder~
    +** Processing line: ~    def collide args~
     - Inside source: true
     *** True Line Result
    -    # Loads the world collection by reading from the map.txt file in the app folder
    -** Processing line: ~    def attempt_load_world_from_file~
    +    def collide args
    +** Processing line: ~      #Slope of the block~
     - Inside source: true
     *** True Line Result
    -    def attempt_load_world_from_file
    -** Processing line: ~      return if state.world # return if the world collection is already populated~
    +      #Slope of the block
    +** Processing line: ~      slope = (@y2 - @y1) / (@x2 - @x1)~
     - Inside source: true
     *** True Line Result
    -      return if state.world # return if the world collection is already populated
    -** Processing line: ~      state.world ||= [] # initialized as an empty collection~
    +      slope = (@y2 - @y1) / (@x2 - @x1)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.world ||= [] # initialized as an empty collection
    -** Processing line: ~      exported_world = gtk.read_file(MAP_FILE_PATH) # reads the file using the path mentioned at top of code~
    +
    +** Processing line: ~      #Create a unit vector and tilt it (@rotation) number of degrees~
     - Inside source: true
     *** True Line Result
    -      exported_world = gtk.read_file(MAP_FILE_PATH) # reads the file using the path mentioned at top of code
    -** Processing line: ~      return unless exported_world # return unless the file read was successful~
    +      #Create a unit vector and tilt it (@rotation) number of degrees
    +** Processing line: ~      x = -Math.cos(@rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      return unless exported_world # return unless the file read was successful
    -** Processing line: ~      state.world = exported_world.each_line.map do |l| # perform action on each line of exported_world~
    +      x = -Math.cos(@rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~      y = Math.sin(@rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      state.world = exported_world.each_line.map do |l| # perform action on each line of exported_world
    -** Processing line: ~          l.split(',').map(&:to_i) # calls split using ',' as a delimiter, and invokes .map on the collection,~
    +      y = Math.sin(@rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          l.split(',').map(&:to_i) # calls split using ',' as a delimiter, and invokes .map on the collection,
    -** Processing line: ~                                   # calling to_i (converts to integers) on each element~
    +
    +** Processing line: ~      #Find the vector that is perpendicular to the slope~
     - Inside source: true
     *** True Line Result
    -                                   # calling to_i (converts to integers) on each element
    -** Processing line: ~      end~
    +      #Find the vector that is perpendicular to the slope
    +** Processing line: ~      perpVect = { x: x, y: y }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      perpVect = { x: x, y: y }
    +** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect~
     - Inside source: true
     *** True Line Result
    -    end
    +      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect
    +** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector~
    +- Inside source: true
    +*** True Line Result
    +      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Adds the change in y to y to determine the next y position of the player.~
    +** Processing line: ~      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball~
     - Inside source: true
     *** True Line Result
    -    # Adds the change in y to y to determine the next y position of the player.
    -** Processing line: ~    def next_y~
    +      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball
    +** Processing line: ~        x:args.state.ball.center.x-args.state.ball.velocity.x,~
     - Inside source: true
     *** True Line Result
    -    def next_y
    -** Processing line: ~      state.y + state.dy~
    +        x:args.state.ball.center.x-args.state.ball.velocity.x,
    +** Processing line: ~        y:args.state.ball.center.y-args.state.ball.velocity.y~
     - Inside source: true
     *** True Line Result
    -      state.y + state.dy
    -** Processing line: ~    end~
    +        y:args.state.ball.center.y-args.state.ball.velocity.y
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -    end
    +      }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Determines next x position of player~
    +** Processing line: ~      velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball~
     - Inside source: true
     *** True Line Result
    -    # Determines next x position of player
    -** Processing line: ~    def next_x~
    +      velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball
    +** Processing line: ~      theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x)         #the angle of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -    def next_x
    -** Processing line: ~      if state.dx < 0 # if the player moves left~
    +      theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x)         #the angle of the ball's velocity
    +** Processing line: ~      theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      if state.dx < 0 # if the player moves left
    -** Processing line: ~        return state.x - (state.tile_size - state.player_width) # subtracts since the change in x is negative (player is moving left)~
    +      theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        return state.x - (state.tile_size - state.player_width) # subtracts since the change in x is negative (player is moving left)
    -** Processing line: ~      else~
    +
    +** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        return state.x + (state.tile_size - state.player_width) # adds since the change in x is positive (player is moving right)~
    +      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity
    +** Processing line: ~      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -        return state.x + (state.tile_size - state.player_width) # adds since the change in x is positive (player is moving right)
    -** Processing line: ~      end~
    +      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~      frx = velocityMag * Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx~
     - Inside source: true
     *** True Line Result
    -    end
    +      frx = velocityMag * Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx
    +** Processing line: ~      fry = velocityMag * Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby~
    +- Inside source: true
    +*** True Line Result
    +      fry = velocityMag * Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def to_coord point~
    +** Processing line: ~      args.state.display_value = velocityMag~
     - Inside source: true
     *** True Line Result
    -    def to_coord point
    -** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
    +      args.state.display_value = velocityMag
    +** Processing line: ~      fsumx = fbx+frx                                                             #sum of x forces~
     - Inside source: true
     *** True Line Result
    -      # Integer divides (idiv) point.x to turn into grid
    -** Processing line: ~      # Then, you can just multiply each integer by state.tile_size~
    +      fsumx = fbx+frx                                                             #sum of x forces
    +** Processing line: ~      fsumy = fby+fry                                                             #sum of y forces~
     - Inside source: true
     *** True Line Result
    -      # Then, you can just multiply each integer by state.tile_size
    -** Processing line: ~      # later and huzzah. Grid coordinates~
    +      fsumy = fby+fry                                                             #sum of y forces
    +** Processing line: ~      fr = velocityMag                                                            #fr is the resulting magnitude~
     - Inside source: true
     *** True Line Result
    -      # later and huzzah. Grid coordinates
    -** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
    +      fr = velocityMag                                                            #fr is the resulting magnitude
    +** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)                                         #thetaNew is the resulting angle~
     - Inside source: true
     *** True Line Result
    -      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
    -** Processing line: ~    end~
    +      thetaNew = Math.atan2(fsumy, fsumx)                                         #thetaNew is the resulting angle
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +
    +** Processing line: ~      xnew = fr*Math.cos(thetaNew)                                                #resulting x velocity~
     - Inside source: true
     *** True Line Result
    -  end
    +      xnew = fr*Math.cos(thetaNew)                                                #resulting x velocity
    +** Processing line: ~      ynew = fr*Math.sin(thetaNew)                                                #resulting y velocity~
    +- Inside source: true
    +*** True Line Result
    +      ynew = fr*Math.sin(thetaNew)                                                #resulting y velocity
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $metroidvania_starter = MetroidvaniaStarter.new~
    +** Processing line: ~      dampener = 0.3~
     - Inside source: true
     *** True Line Result
    -  $metroidvania_starter = MetroidvaniaStarter.new
    +      dampener = 0.3
    +** Processing line: ~      ynew *= dampener * 0.5~
    +- Inside source: true
    +*** True Line Result
    +      ynew *= dampener * 0.5
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~      #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~      $metroidvania_starter.grid    = args.grid~
    +      #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity
    +** Processing line: ~      if ynew > -0.1~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.grid    = args.grid
    -** Processing line: ~      $metroidvania_starter.inputs  = args.inputs~
    +      if ynew > -0.1
    +** Processing line: ~        xnew *= dampener~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.inputs  = args.inputs
    -** Processing line: ~      $metroidvania_starter.state   = args.state~
    +        xnew *= dampener
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.state   = args.state
    -** Processing line: ~      $metroidvania_starter.outputs = args.outputs~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.outputs = args.outputs
    -** Processing line: ~      $metroidvania_starter.gtk     = args.gtk~
    +
    +** Processing line: ~      #Add the sine component of gravity back in (X component)~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.gtk     = args.gtk
    -** Processing line: ~      $metroidvania_starter.tick~
    +      #Add the sine component of gravity back in (X component)
    +** Processing line: ~      gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)~
     - Inside source: true
     *** True Line Result
    -      $metroidvania_starter.tick
    +      gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)
    +** Processing line: ~      xnew += gravity_x~
    +- Inside source: true
    +*** True Line Result
    +      xnew += gravity_x
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.state.ball.velocity.x = -xnew~
    +- Inside source: true
    +*** True Line Result
    +      args.state.ball.velocity.x = -xnew
    +** Processing line: ~      args.state.ball.velocity.y = -ynew~
    +- Inside source: true
    +*** True Line Result
    +      args.state.ball.velocity.y = -ynew
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #Set the position of the ball to the previous position so it doesn't warp throught the block~
    +- Inside source: true
    +*** True Line Result
    +      #Set the position of the ball to the previous position so it doesn't warp throught the block
    +** Processing line: ~      args.state.ball.center.x = previousPosition.x~
    +- Inside source: true
    +*** True Line Result
    +      args.state.ball.center.x = previousPosition.x
    +** Processing line: ~      args.state.ball.center.y = previousPosition.y~
    +- Inside source: true
    +*** True Line Result
    +      args.state.ball.center.y = previousPosition.y
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -27896,270 +28327,306 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Box Collision 3 - main.rb~
    +** Processing line: ~*** Physics And Collisions - Bouncing On Collision - cannon.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Physics And Collisions - Box Collision 3 - main.rb
    +*** Physics And Collisions - Bouncing On Collision - cannon.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/04_physics_and_collisions/06_box_collision_3/app/main.rb~
    +** Processing line: ~  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/06_box_collision_3/app/main.rb
    -** Processing line: ~  class Game~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb
    +** Processing line: ~  class Cannon~
     - Inside source: true
     *** True Line Result
    -  class Game
    -** Processing line: ~    attr_gtk~
    +  class Cannon
    +** Processing line: ~    def initialize args~
     - Inside source: true
     *** True Line Result
    -    attr_gtk
    -** Processing line: ~~
    +    def initialize args
    +** Processing line: ~      @pointA = {x: args.grid.right/2,y: args.grid.top}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def tick~
    +      @pointA = {x: args.grid.right/2,y: args.grid.top}
    +** Processing line: ~      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +    end
    +** Processing line: ~    def update args~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      input_edit_map~
    +    def update args
    +** Processing line: ~      activeBall = args.state.ball~
     - Inside source: true
     *** True Line Result
    -      input_edit_map
    -** Processing line: ~      input_player~
    +      activeBall = args.state.ball
    +** Processing line: ~      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}~
     - Inside source: true
     *** True Line Result
    -      input_player
    -** Processing line: ~      calc_player~
    +      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc_player
    -** Processing line: ~    end~
    +
    +** Processing line: ~      if args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      if args.inputs.mouse.click
    +** Processing line: ~        alpha = 0.01~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def defaults~
    +        alpha = 0.01
    +** Processing line: ~        activeBall.velocity.y = (@pointB.y - @pointA.y) * alpha~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      state.gravity           = -0.4~
    +        activeBall.velocity.y = (@pointB.y - @pointA.y) * alpha
    +** Processing line: ~        activeBall.velocity.x = (@pointB.x - @pointA.x) * alpha~
     - Inside source: true
     *** True Line Result
    -      state.gravity           = -0.4
    -** Processing line: ~      state.drag              = 0.15~
    +        activeBall.velocity.x = (@pointB.x - @pointA.x) * alpha
    +** Processing line: ~        activeBall.center = {x: (args.grid.w / 2), y: (args.grid.h)}~
     - Inside source: true
     *** True Line Result
    -      state.drag              = 0.15
    -** Processing line: ~      state.tile_size         = 32~
    +        activeBall.center = {x: (args.grid.w / 2), y: (args.grid.h)}
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      state.tile_size         = 32
    -** Processing line: ~      state.player.size       = 16~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      state.player.size       = 16
    -** Processing line: ~      state.player.jump_power = 12~
    +    end
    +** Processing line: ~    def render args~
     - Inside source: true
     *** True Line Result
    -      state.player.jump_power = 12
    +    def render args
    +** Processing line: ~      args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y]~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y]
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.tiles                 ||= []~
    +** 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: ~*** Physics And Collisions - Bouncing On Collision - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Bouncing On Collision - 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/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      state.tiles                 ||= []
    -** Processing line: ~      state.player.y              ||= 800~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
    +** Processing line: ~  INFINITY= 10**10~
     - Inside source: true
     *** True Line Result
    -      state.player.y              ||= 800
    -** Processing line: ~      state.player.x              ||= 100~
    +  INFINITY= 10**10
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.player.x              ||= 100
    -** Processing line: ~      state.player.dy             ||= 0~
    +
    +** Processing line: ~  require 'app/vector2d.rb'~
     - Inside source: true
     *** True Line Result
    -      state.player.dy             ||= 0
    -** Processing line: ~      state.player.dx             ||= 0~
    +  require 'app/vector2d.rb'
    +** Processing line: ~  require 'app/peg.rb'~
     - Inside source: true
     *** True Line Result
    -      state.player.dx             ||= 0
    -** Processing line: ~      state.player.jumped_down_at ||= 0~
    +  require 'app/peg.rb'
    +** Processing line: ~  require 'app/block.rb'~
     - Inside source: true
     *** True Line Result
    -      state.player.jumped_down_at ||= 0
    -** Processing line: ~      state.player.jumped_at      ||= 0~
    +  require 'app/block.rb'
    +** Processing line: ~  require 'app/ball.rb'~
     - Inside source: true
     *** True Line Result
    -      state.player.jumped_at      ||= 0
    +  require 'app/ball.rb'
    +** Processing line: ~  require 'app/cannon.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/cannon.rb'
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      calc_player_rect if !state.player.rect~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc_player_rect if !state.player.rect
    -** Processing line: ~    end~
    +
    +** Processing line: ~  #Method to init default values~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  #Method to init default values
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def render~
    +  def defaults args
    +** Processing line: ~    args.state.pegs ||= []~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      outputs.labels << [10, 10.from_top, "tile: click to add a tile, hold X key and click to delete a tile."]~
    +    args.state.pegs ||= []
    +** Processing line: ~    args.state.blocks ||= []~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 10.from_top, "tile: click to add a tile, hold X key and click to delete a tile."]
    -** Processing line: ~      outputs.labels << [10, 35.from_top, "move: use left and right to move, space to jump, down and space to jump down."]~
    +    args.state.blocks ||= []
    +** Processing line: ~    args.state.cannon ||= Cannon.new args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 35.from_top, "move: use left and right to move, space to jump, down and space to jump down."]
    -** Processing line: ~      outputs.labels << [10, 55.from_top, "      You can jump through or jump down through tiles with a height of 1."]~
    +    args.state.cannon ||= Cannon.new args
    +** Processing line: ~    args.state.ball ||= Ball.new args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 55.from_top, "      You can jump through or jump down through tiles with a height of 1."]
    -** Processing line: ~      outputs.background_color = [80, 80, 80]~
    +    args.state.ball ||= Ball.new args
    +** Processing line: ~    args.state.horizontal_offset ||= 0~
     - Inside source: true
     *** True Line Result
    -      outputs.background_color = [80, 80, 80]
    -** Processing line: ~      outputs.sprites << tiles.map(&:sprite)~
    +    args.state.horizontal_offset ||= 0
    +** Processing line: ~    init_pegs args~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << tiles.map(&:sprite)
    -** Processing line: ~      outputs.sprites << (player.rect.merge path: 'sprites/square/green.png')~
    +    init_pegs args
    +** Processing line: ~    init_blocks args~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << (player.rect.merge path: 'sprites/square/green.png')
    +    init_blocks args
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      mouse_overlay = {~
    +** Processing line: ~    args.state.display_value ||= "test"~
     - Inside source: true
     *** True Line Result
    -      mouse_overlay = {
    -** Processing line: ~        x: (inputs.mouse.x.ifloor state.tile_size),~
    +    args.state.display_value ||= "test"
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        x: (inputs.mouse.x.ifloor state.tile_size),
    -** Processing line: ~        y: (inputs.mouse.y.ifloor state.tile_size),~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        y: (inputs.mouse.y.ifloor state.tile_size),
    -** Processing line: ~        w: state.tile_size,~
    +
    +** Processing line: ~  begin :default_methods~
     - Inside source: true
     *** True Line Result
    -        w: state.tile_size,
    -** Processing line: ~        h: state.tile_size,~
    +  begin :default_methods
    +** Processing line: ~    def init_pegs args~
     - Inside source: true
     *** True Line Result
    -        h: state.tile_size,
    -** Processing line: ~        a: 100~
    +    def init_pegs args
    +** Processing line: ~      num_horizontal_pegs = 14~
     - Inside source: true
     *** True Line Result
    -        a: 100
    -** Processing line: ~      }~
    +      num_horizontal_pegs = 14
    +** Processing line: ~      num_rows = 5~
     - Inside source: true
     *** True Line Result
    -      }
    +      num_rows = 5
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode~
    +** Processing line: ~      return unless args.state.pegs.count < num_rows * num_horizontal_pegs~
     - Inside source: true
     *** True Line Result
    -      mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode
    +      return unless args.state.pegs.count < num_rows * num_horizontal_pegs
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if state.mouse_held~
    +** Processing line: ~      block_size = 32~
     - Inside source: true
     *** True Line Result
    -      if state.mouse_held
    -** Processing line: ~        outputs.primitives << mouse_overlay.border~
    +      block_size = 32
    +** Processing line: ~      block_spacing = 50~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << mouse_overlay.border
    -** Processing line: ~      else~
    +      block_spacing = 50
    +** Processing line: ~      total_width = num_horizontal_pegs * (block_size + block_spacing)~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        outputs.primitives << mouse_overlay.solid~
    +      total_width = num_horizontal_pegs * (block_size + block_spacing)
    +** Processing line: ~      starting_offset = (args.grid.w - total_width) / 2 + block_size~
     - Inside source: true
     *** True Line Result
    -        outputs.primitives << mouse_overlay.solid
    -** Processing line: ~      end~
    +      starting_offset = (args.grid.w - total_width) / 2 + block_size
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~      for i in (0...num_rows)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      for i in (0...num_rows)
    +** Processing line: ~        for j in (0...num_horizontal_pegs)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def input_edit_map~
    +        for j in (0...num_horizontal_pegs)
    +** Processing line: ~          row_offset = 0~
     - Inside source: true
     *** True Line Result
    -    def input_edit_map
    -** Processing line: ~      state.mouse_held = true  if inputs.mouse.down~
    +          row_offset = 0
    +** Processing line: ~          if i % 2 == 0~
     - Inside source: true
     *** True Line Result
    -      state.mouse_held = true  if inputs.mouse.down
    -** Processing line: ~      state.mouse_held = false if inputs.mouse.up~
    +          if i % 2 == 0
    +** Processing line: ~            row_offset = 20~
     - Inside source: true
     *** True Line Result
    -      state.mouse_held = false if inputs.mouse.up
    -** Processing line: ~~
    +            row_offset = 20
    +** Processing line: ~          else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if inputs.keyboard.x~
    +          else
    +** Processing line: ~            row_offset = -20~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.x
    -** Processing line: ~        state.delete_mode = true~
    +            row_offset = -20
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -        state.delete_mode = true
    -** Processing line: ~      elsif inputs.keyboard.key_up.x~
    +          end
    +** Processing line: ~          args.state.pegs.append(Peg.new(j * (block_size+block_spacing) + starting_offset + row_offset, (args.grid.h - block_size * 2) - (i * block_size * 2)-90, block_size))~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_up.x
    -** Processing line: ~        state.delete_mode = false~
    +          args.state.pegs.append(Peg.new(j * (block_size+block_spacing) + starting_offset + row_offset, (args.grid.h - block_size * 2) - (i * block_size * 2)-90, block_size))
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        state.delete_mode = false
    +        end
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -28168,158 +28635,158 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless state.mouse_held~
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      return unless state.mouse_held
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      ordinal = { x: (inputs.mouse.x.idiv state.tile_size),~
    +** Processing line: ~    def init_blocks args~
     - Inside source: true
     *** True Line Result
    -      ordinal = { x: (inputs.mouse.x.idiv state.tile_size),
    -** Processing line: ~                  y: (inputs.mouse.y.idiv state.tile_size) }~
    +    def init_blocks args
    +** Processing line: ~      return unless args.state.blocks.count < 10~
     - Inside source: true
     *** True Line Result
    -                  y: (inputs.mouse.y.idiv state.tile_size) }
    +      return unless args.state.blocks.count < 10
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      found = find_tile ordinal~
    +** Processing line: ~      #Sprites are rotated in degrees, but the Ruby math functions work on radians~
     - Inside source: true
     *** True Line Result
    -      found = find_tile ordinal
    -** Processing line: ~      if !found && !state.delete_mode~
    +      #Sprites are rotated in degrees, but the Ruby math functions work on radians
    +** Processing line: ~      radians_to_degrees = Math::PI / 180~
     - Inside source: true
     *** True Line Result
    -      if !found && !state.delete_mode
    -** Processing line: ~        tiles << (state.new_entity :tile, ordinal)~
    +      radians_to_degrees = Math::PI / 180
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        tiles << (state.new_entity :tile, ordinal)
    -** Processing line: ~        recompute_tiles~
    +
    +** Processing line: ~      block_size = 25~
     - Inside source: true
     *** True Line Result
    -        recompute_tiles
    -** Processing line: ~      elsif found && state.delete_mode~
    +      block_size = 25
    +** Processing line: ~      #Rotation angle (in degrees) of the blocks~
     - Inside source: true
     *** True Line Result
    -      elsif found && state.delete_mode
    -** Processing line: ~        tiles.delete found~
    +      #Rotation angle (in degrees) of the blocks
    +** Processing line: ~      rotation = 30~
     - Inside source: true
     *** True Line Result
    -        tiles.delete found
    -** Processing line: ~        recompute_tiles~
    +      rotation = 30
    +** Processing line: ~      vertical_offset = block_size * Math.sin(rotation * radians_to_degrees)~
     - Inside source: true
     *** True Line Result
    -        recompute_tiles
    -** Processing line: ~      end~
    +      vertical_offset = block_size * Math.sin(rotation * radians_to_degrees)
    +** Processing line: ~      horizontal_offset = (3 * block_size) * Math.cos(rotation * radians_to_degrees)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      horizontal_offset = (3 * block_size) * Math.cos(rotation * radians_to_degrees)
    +** Processing line: ~      center = args.grid.w / 2~
     - Inside source: true
     *** True Line Result
    -    end
    +      center = args.grid.w / 2
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def input_player~
    +** Processing line: ~      for i in (0...5)~
     - Inside source: true
     *** True Line Result
    -    def input_player
    -** Processing line: ~      player.dx += inputs.left_right~
    +      for i in (0...5)
    +** Processing line: ~        #Create a ramp of blocks. Not going to be perfect because of the float to integer conversion and anisotropic to isotropic coversion~
     - Inside source: true
     *** True Line Result
    -      player.dx += inputs.left_right
    -** Processing line: ~~
    +        #Create a ramp of blocks. Not going to be perfect because of the float to integer conversion and anisotropic to isotropic coversion
    +** Processing line: ~        args.state.blocks.append(Block.new((center + 100 + (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, rotation))~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if inputs.keyboard.key_down.space && inputs.keyboard.down~
    +        args.state.blocks.append(Block.new((center + 100 + (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, rotation))
    +** Processing line: ~        args.state.blocks.append(Block.new((center - 100 - (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, -rotation))~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_down.space && inputs.keyboard.down
    -** Processing line: ~        player.dy             = player.jump_power * -1~
    +        args.state.blocks.append(Block.new((center - 100 - (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, -rotation))
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        player.dy             = player.jump_power * -1
    -** Processing line: ~        player.jumped_at      = 0~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        player.jumped_at      = 0
    -** Processing line: ~        player.jumped_down_at = state.tick_count~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        player.jumped_down_at = state.tick_count
    -** Processing line: ~      elsif inputs.keyboard.key_down.space~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_down.space
    -** Processing line: ~        player.dy             = player.jump_power~
    +
    +** Processing line: ~  #Render loop~
     - Inside source: true
     *** True Line Result
    -        player.dy             = player.jump_power
    -** Processing line: ~        player.jumped_at      = state.tick_count~
    +  #Render loop
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -        player.jumped_at      = state.tick_count
    -** Processing line: ~        player.jumped_down_at = 0~
    +  def render args
    +** Processing line: ~    args.outputs.borders << args.state.game_area~
     - Inside source: true
     *** True Line Result
    -        player.jumped_down_at = 0
    -** Processing line: ~      end~
    +    args.outputs.borders << args.state.game_area
    +** Processing line: ~    render_pegs args~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    render_pegs args
    +** Processing line: ~    render_blocks args~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    render_blocks args
    +** Processing line: ~    args.state.cannon.render args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_player~
    +    args.state.cannon.render args
    +** Processing line: ~    args.state.ball.draw args~
     - Inside source: true
     *** True Line Result
    -    def calc_player
    -** Processing line: ~      calc_player_rect~
    +    args.state.ball.draw args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      calc_player_rect
    -** Processing line: ~      calc_below~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc_below
    -** Processing line: ~      calc_left~
    +
    +** Processing line: ~  begin :render_methods~
     - Inside source: true
     *** True Line Result
    -      calc_left
    -** Processing line: ~      calc_right~
    +  begin :render_methods
    +** Processing line: ~    #Draw the pegs in a grid pattern~
     - Inside source: true
     *** True Line Result
    -      calc_right
    -** Processing line: ~      calc_above~
    +    #Draw the pegs in a grid pattern
    +** Processing line: ~    def render_pegs args~
     - Inside source: true
     *** True Line Result
    -      calc_above
    -** Processing line: ~      calc_player_dy~
    +    def render_pegs args
    +** Processing line: ~      args.state.pegs.each do |peg|~
     - Inside source: true
     *** True Line Result
    -      calc_player_dy
    -** Processing line: ~      calc_player_dx~
    +      args.state.pegs.each do |peg|
    +** Processing line: ~        peg.draw args~
     - Inside source: true
     *** True Line Result
    -      calc_player_dx
    -** Processing line: ~      reset_player if player_off_stage?~
    +        peg.draw args
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      reset_player if player_off_stage?
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -28328,30 +28795,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_player_rect~
    -- Inside source: true
    -*** True Line Result
    -    def calc_player_rect
    -** Processing line: ~      player.rect      = current_player_rect~
    -- Inside source: true
    -*** True Line Result
    -      player.rect      = current_player_rect
    -** Processing line: ~      player.next_rect = player.rect.merge x: player.x + player.dx,~
    +** Processing line: ~    def render_blocks args~
     - Inside source: true
     *** True Line Result
    -      player.next_rect = player.rect.merge x: player.x + player.dx,
    -** Processing line: ~                                           y: player.y + player.dy~
    +    def render_blocks args
    +** Processing line: ~      args.state.blocks.each do |block|~
     - Inside source: true
     *** True Line Result
    -                                           y: player.y + player.dy
    -** Processing line: ~      player.prev_rect = player.rect.merge x: player.x - player.dx,~
    +      args.state.blocks.each do |block|
    +** Processing line: ~        block.draw args~
     - Inside source: true
     *** True Line Result
    -      player.prev_rect = player.rect.merge x: player.x - player.dx,
    -** Processing line: ~                                           y: player.y - player.dy~
    +        block.draw args
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                                           y: player.y - player.dy
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -28360,50 +28819,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_below~
    -- Inside source: true
    -*** True Line Result
    -    def calc_below
    -** Processing line: ~      return unless player.dy <= 0~
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      return unless player.dy <= 0
    -** Processing line: ~      tiles_below = find_tiles { |t| t.rect.top <= player.y }~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      tiles_below = find_tiles { |t| t.rect.top <= player.y }
    -** Processing line: ~      collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)~
    +
    +** Processing line: ~  #Calls all methods necessary for performing calculations~
     - Inside source: true
     *** True Line Result
    -      collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)
    -** Processing line: ~      return unless collision~
    +  #Calls all methods necessary for performing calculations
    +** Processing line: ~  def calc args~
     - Inside source: true
     *** True Line Result
    -      return unless collision
    -** Processing line: ~      if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10~
    +  def calc args
    +** Processing line: ~    args.state.pegs.each do |peg|~
     - Inside source: true
     *** True Line Result
    -      if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10
    -** Processing line: ~        player.dy = -1~
    +    args.state.pegs.each do |peg|
    +** Processing line: ~      peg.calc args~
     - Inside source: true
     *** True Line Result
    -        player.dy = -1
    -** Processing line: ~      else~
    +      peg.calc args
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        player.y  = collision.rect.y + state.tile_size~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        player.y  = collision.rect.y + state.tile_size
    -** Processing line: ~        player.dy = 0~
    +
    +** Processing line: ~    args.state.blocks.each do |block|~
     - Inside source: true
     *** True Line Result
    -        player.dy = 0
    -** Processing line: ~      end~
    +    args.state.blocks.each do |block|
    +** Processing line: ~      block.calc args~
     - Inside source: true
     *** True Line Result
    -      end
    +      block.calc args
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -28412,158 +28867,154 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_left~
    -- Inside source: true
    -*** True Line Result
    -    def calc_left
    -** Processing line: ~      return unless player.dx < 0~
    +** Processing line: ~    args.state.ball.update args~
     - Inside source: true
     *** True Line Result
    -      return unless player.dx < 0
    -** Processing line: ~      tiles_left = find_tiles { |t| t.rect.right <= player.prev_rect.left }~
    +    args.state.ball.update args
    +** Processing line: ~    args.state.cannon.update args~
     - Inside source: true
     *** True Line Result
    -      tiles_left = find_tiles { |t| t.rect.right <= player.prev_rect.left }
    -** Processing line: ~      collision = find_colliding_tile tiles_left, (player.rect.merge x: player.next_rect.x)~
    +    args.state.cannon.update args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      collision = find_colliding_tile tiles_left, (player.rect.merge x: player.next_rect.x)
    -** Processing line: ~      return unless collision~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      return unless collision
    -** Processing line: ~      player.x  = collision.rect.right~
    +
    +** Processing line: ~  begin :calc_methods~
     - Inside source: true
     *** True Line Result
    -      player.x  = collision.rect.right
    -** Processing line: ~      player.dx = 0~
    +  begin :calc_methods
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      player.dx = 0
    -** Processing line: ~    end~
    +
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_right~
    -- Inside source: true
    -*** True Line Result
    -    def calc_right
    -** Processing line: ~      return unless player.dx > 0~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      return unless player.dx > 0
    -** Processing line: ~      tiles_right = find_tiles { |t| t.rect.left >= player.prev_rect.right }~
    +  def tick args
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -      tiles_right = find_tiles { |t| t.rect.left >= player.prev_rect.right }
    -** Processing line: ~      collision = find_colliding_tile tiles_right, (player.rect.merge x: player.next_rect.x)~
    +    defaults args
    +** Processing line: ~    render args~
     - Inside source: true
     *** True Line Result
    -      collision = find_colliding_tile tiles_right, (player.rect.merge x: player.next_rect.x)
    -** Processing line: ~      return unless collision~
    +    render args
    +** Processing line: ~    calc args~
     - Inside source: true
     *** True Line Result
    -      return unless collision
    -** Processing line: ~      player.x  = collision.rect.left - player.rect.w~
    +    calc args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      player.x  = collision.rect.left - player.rect.w
    -** Processing line: ~      player.dx = 0~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      player.dx = 0
    -** Processing line: ~    end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    def calc_above~
    -- Inside source: true
    +** Processing line: ~*** Physics And Collisions - Bouncing On Collision - peg.rb~
    +- Header detected.
     *** True Line Result
    -    def calc_above
    -** Processing line: ~      return unless player.dy > 0~
    -- Inside source: true
    +
     *** True Line Result
    -      return unless player.dy > 0
    -** Processing line: ~      tiles_above = find_tiles { |t| t.rect.y >= player.y }~
    -- Inside source: true
    +*** Physics And Collisions - Bouncing On Collision - peg.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -      tiles_above = find_tiles { |t| t.rect.y >= player.y }
    -** Processing line: ~      collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb~
     - Inside source: true
     *** True Line Result
    -      collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)
    -** Processing line: ~      return unless collision~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb
    +** Processing line: ~  class Peg~
     - Inside source: true
     *** True Line Result
    -      return unless collision
    -** Processing line: ~      return if collision.neighbors.t == :none~
    +  class Peg
    +** Processing line: ~    def initialize(x, y, block_size)~
     - Inside source: true
     *** True Line Result
    -      return if collision.neighbors.t == :none
    -** Processing line: ~      player.dy = 0~
    +    def initialize(x, y, block_size)
    +** Processing line: ~      @x = x                    # x cordinate of the LEFT side of the peg~
     - Inside source: true
     *** True Line Result
    -      player.dy = 0
    -** Processing line: ~      player.y  = collision.rect.bottom - player.rect.h~
    +      @x = x                    # x cordinate of the LEFT side of the peg
    +** Processing line: ~      @y = y                    # y cordinate of the RIGHT side of the peg~
     - Inside source: true
     *** True Line Result
    -      player.y  = collision.rect.bottom - player.rect.h
    -** Processing line: ~    end~
    +      @y = y                    # y cordinate of the RIGHT side of the peg
    +** Processing line: ~      @block_size = block_size  # diameter of the peg~
     - Inside source: true
     *** True Line Result
    -    end
    +      @block_size = block_size  # diameter of the peg
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_player_dx~
    +** Processing line: ~      @radius = @block_size/2.0 # radius of the peg~
     - Inside source: true
     *** True Line Result
    -    def calc_player_dx
    -** Processing line: ~      player.y  += player.dy~
    +      @radius = @block_size/2.0 # radius of the peg
    +** Processing line: ~      @center = {               # cordinatees of the CENTER of the peg~
     - Inside source: true
     *** True Line Result
    -      player.y  += player.dy
    -** Processing line: ~      player.dy += state.gravity~
    +      @center = {               # cordinatees of the CENTER of the peg
    +** Processing line: ~        x: @x+@block_size/2.0,~
     - Inside source: true
     *** True Line Result
    -      player.dy += state.gravity
    -** Processing line: ~      player.dy += player.dy * state.drag ** 2 * -1~
    +        x: @x+@block_size/2.0,
    +** Processing line: ~        y: @y+@block_size/2.0~
     - Inside source: true
     *** True Line Result
    -      player.dy += player.dy * state.drag ** 2 * -1
    -** Processing line: ~    end~
    +        y: @y+@block_size/2.0
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -    end
    +      }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_player_dy~
    +** Processing line: ~      @r = 255 # color of the peg~
     - Inside source: true
     *** True Line Result
    -    def calc_player_dy
    -** Processing line: ~      player.dx  = player.dx.clamp(-5,  5)~
    +      @r = 255 # color of the peg
    +** Processing line: ~      @g = 0~
     - Inside source: true
     *** True Line Result
    -      player.dx  = player.dx.clamp(-5,  5)
    -** Processing line: ~      player.dx *= 0.9~
    +      @g = 0
    +** Processing line: ~      @b = 0~
     - Inside source: true
     *** True Line Result
    -      player.dx *= 0.9
    -** Processing line: ~      player.x  += player.dx~
    +      @b = 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      player.x  += player.dx
    +
    +** Processing line: ~      @velocity = {x: 2, y: 0}~
    +- Inside source: true
    +*** True Line Result
    +      @velocity = {x: 2, y: 0}
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -28572,110 +29023,98 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def reset_player~
    -- Inside source: true
    -*** True Line Result
    -    def reset_player
    -** Processing line: ~      player.x  = 100~
    -- Inside source: true
    -*** True Line Result
    -      player.x  = 100
    -** Processing line: ~      player.y  = 720~
    +** Processing line: ~    def draw args~
     - Inside source: true
     *** True Line Result
    -      player.y  = 720
    -** Processing line: ~      player.dy = 0~
    +    def draw args
    +** Processing line: ~      args.outputs.sprites << [ # draw the peg according to the @x, @y, @radius, and the RGB~
     - Inside source: true
     *** True Line Result
    -      player.dy = 0
    -** Processing line: ~    end~
    +      args.outputs.sprites << [ # draw the peg according to the @x, @y, @radius, and the RGB
    +** Processing line: ~        @x,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        @x,
    +** Processing line: ~        @y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def recompute_tiles~
    +        @y,
    +** Processing line: ~        @radius*2.0,~
     - Inside source: true
     *** True Line Result
    -    def recompute_tiles
    -** Processing line: ~      tiles.each do |t|~
    +        @radius*2.0,
    +** Processing line: ~        @radius*2.0,~
     - Inside source: true
     *** True Line Result
    -      tiles.each do |t|
    -** Processing line: ~        t.w = state.tile_size~
    +        @radius*2.0,
    +** Processing line: ~        "sprites/circle-white.png",~
     - Inside source: true
     *** True Line Result
    -        t.w = state.tile_size
    -** Processing line: ~        t.h = state.tile_size~
    +        "sprites/circle-white.png",
    +** Processing line: ~        0,~
     - Inside source: true
     *** True Line Result
    -        t.h = state.tile_size
    -** Processing line: ~        t.neighbors = tile_neighbors t, tiles~
    +        0,
    +** Processing line: ~        255,~
     - Inside source: true
     *** True Line Result
    -        t.neighbors = tile_neighbors t, tiles
    -** Processing line: ~~
    +        255,
    +** Processing line: ~        @r,    #r~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        t.rect = [t.x * state.tile_size,~
    +        @r,    #r
    +** Processing line: ~        @g,    #g~
     - Inside source: true
     *** True Line Result
    -        t.rect = [t.x * state.tile_size,
    -** Processing line: ~                  t.y * state.tile_size,~
    +        @g,    #g
    +** Processing line: ~        @b   #b~
     - Inside source: true
     *** True Line Result
    -                  t.y * state.tile_size,
    -** Processing line: ~                  state.tile_size,~
    +        @b   #b
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -                  state.tile_size,
    -** Processing line: ~                  state.tile_size].rect.to_hash~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                  state.tile_size].rect.to_hash
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        sprite_sub_path = t.neighbors.mask.map { |m| flip_bit m }.join("")~
    -- Inside source: true
    -*** True Line Result
    -        sprite_sub_path = t.neighbors.mask.map { |m| flip_bit m }.join("")
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        t.sprite = {~
    +** Processing line: ~    def calc args~
     - Inside source: true
     *** True Line Result
    -        t.sprite = {
    -** Processing line: ~          x: t.x * state.tile_size,~
    +    def calc args
    +** Processing line: ~      if collisionWithBounce? args # if the is a collision with the bouncing ball~
     - Inside source: true
     *** True Line Result
    -          x: t.x * state.tile_size,
    -** Processing line: ~          y: t.y * state.tile_size,~
    +      if collisionWithBounce? args # if the is a collision with the bouncing ball
    +** Processing line: ~        collide args~
     - Inside source: true
     *** True Line Result
    -          y: t.y * state.tile_size,
    -** Processing line: ~          w: state.tile_size,~
    +        collide args
    +** Processing line: ~        @r = 0~
     - Inside source: true
     *** True Line Result
    -          w: state.tile_size,
    -** Processing line: ~          h: state.tile_size,~
    +        @r = 0
    +** Processing line: ~        @b = 0~
     - Inside source: true
     *** True Line Result
    -          h: state.tile_size,
    -** Processing line: ~          path: "sprites/tile/wall-#{sprite_sub_path}.png"~
    +        @b = 0
    +** Processing line: ~        @g = 255~
     - Inside source: true
     *** True Line Result
    -          path: "sprites/tile/wall-#{sprite_sub_path}.png"
    -** Processing line: ~        }~
    +        @g = 255
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        }
    +      else
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -28688,58 +29127,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 flip_bit bit~
    -- Inside source: true
    -*** True Line Result
    -    def flip_bit bit
    -** Processing line: ~      return 0 if bit == 1~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      return 0 if bit == 1
    -** Processing line: ~      return 1~
    +
    +** Processing line: ~    # do two circles (the ball and this peg) intersect~
     - Inside source: true
     *** True Line Result
    -      return 1
    -** Processing line: ~    end~
    +    # do two circles (the ball and this peg) intersect
    +** Processing line: ~    def collisionWithBounce? args~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    def collisionWithBounce? args
    +** Processing line: ~      squareDistance = (  # the squared distance between the ball's center and this peg's center~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def player~
    +      squareDistance = (  # the squared distance between the ball's center and this peg's center
    +** Processing line: ~        (args.state.ball.center.x - @center.x) ** 2.0 +~
     - Inside source: true
     *** True Line Result
    -    def player
    -** Processing line: ~      state.player~
    +        (args.state.ball.center.x - @center.x) ** 2.0 +
    +** Processing line: ~        (args.state.ball.center.y - @center.y) ** 2.0~
     - Inside source: true
     *** True Line Result
    -      state.player
    -** Processing line: ~    end~
    +        (args.state.ball.center.y - @center.y) ** 2.0
    +** Processing line: ~      )~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      )
    +** Processing line: ~      radiusSum = (  # the sum of the radius squared of the this peg and the ball~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def player_off_stage?~
    +      radiusSum = (  # the sum of the radius squared of the this peg and the ball
    +** Processing line: ~        (args.state.ball.radius + @radius) ** 2.0~
     - Inside source: true
     *** True Line Result
    -    def player_off_stage?
    -** Processing line: ~      player.rect.top < grid.bottom ||~
    +        (args.state.ball.radius + @radius) ** 2.0
    +** Processing line: ~      )~
     - Inside source: true
     *** True Line Result
    -      player.rect.top < grid.bottom ||
    -** Processing line: ~      player.rect.right < grid.left ||~
    +      )
    +** Processing line: ~      # if the squareDistance is less or equal to radiusSum, then there is a radial intersection between the ball and this peg~
     - Inside source: true
     *** True Line Result
    -      player.rect.right < grid.left ||
    -** Processing line: ~      player.rect.left > grid.right~
    +      # if the squareDistance is less or equal to radiusSum, then there is a radial intersection between the ball and this peg
    +** Processing line: ~      return (squareDistance <= radiusSum)~
     - Inside source: true
     *** True Line Result
    -      player.rect.left > grid.right
    +      return (squareDistance <= radiusSum)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -28748,522 +29183,474 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def current_player_rect~
    -- Inside source: true
    -*** True Line Result
    -    def current_player_rect
    -** Processing line: ~      { x: player.x, y: player.y, w: player.size, h: player.size }~
    +** Processing line: ~    # ! The following links explain the getRepelMagnitude function !~
     - Inside source: true
     *** True Line Result
    -      { x: player.x, y: player.y, w: player.size, h: player.size }
    -** Processing line: ~    end~
    +    # ! The following links explain the getRepelMagnitude function !
    +** Processing line: ~    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_4.png~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_4.png
    +** Processing line: ~    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_5.png~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def tiles~
    +    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_5.png
    +** Processing line: ~    # https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/LinearCollider.md~
     - Inside source: true
     *** True Line Result
    -    def tiles
    -** Processing line: ~      state.tiles~
    +    # https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/LinearCollider.md
    +** Processing line: ~    def getRepelMagnitude (args, fbx, fby, vrx, vry, ballMag)~
     - Inside source: true
     *** True Line Result
    -      state.tiles
    -** Processing line: ~    end~
    +    def getRepelMagnitude (args, fbx, fby, vrx, vry, ballMag)
    +** Processing line: ~      a = fbx ; b = vrx ; c = fby~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      a = fbx ; b = vrx ; c = fby
    +** Processing line: ~      d = vry ; e = ballMag~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def find_tile ordinal~
    +      d = vry ; e = ballMag
    +** Processing line: ~      if b**2 + d**2 == 0~
     - Inside source: true
     *** True Line Result
    -    def find_tile ordinal
    -** Processing line: ~      tiles.find { |t| t.x == ordinal.x && t.y == ordinal.y }~
    +      if b**2 + d**2 == 0
    +** Processing line: ~        #unexpected~
     - Inside source: true
     *** True Line Result
    -      tiles.find { |t| t.x == ordinal.x && t.y == ordinal.y }
    -** Processing line: ~    end~
    +        #unexpected
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def find_tiles &block~
    -- Inside source: true
    -*** True Line Result
    -    def find_tiles &block
    -** Processing line: ~      tiles.find_all(&block)~
    +** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
     - Inside source: true
     *** True Line Result
    -      tiles.find_all(&block)
    -** Processing line: ~    end~
    +      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    +** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
     - Inside source: true
     *** True Line Result
    -    end
    +      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def find_colliding_tile tiles, target~
    +** Processing line: ~      err = 0.00001~
     - Inside source: true
     *** True Line Result
    -    def find_colliding_tile tiles, target
    -** Processing line: ~      tiles.find { |t| t.rect.intersect_rect? target }~
    +      err = 0.00001
    +** Processing line: ~      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5~
     - Inside source: true
     *** True Line Result
    -      tiles.find { |t| t.rect.intersect_rect? target }
    -** Processing line: ~    end~
    +      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    +** Processing line: ~      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5~
     - Inside source: true
     *** True Line Result
    -    end
    +      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    +** Processing line: ~      r = 0~
    +- Inside source: true
    +*** True Line Result
    +      r = 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def tile_neighbors tile, other_points~
    +** Processing line: ~      if (ballMag >= o-err and ballMag <= o+err)~
     - Inside source: true
     *** True Line Result
    -    def tile_neighbors tile, other_points
    -** Processing line: ~      t = find_tile x: tile.x + 0, y: tile.y + 1~
    +      if (ballMag >= o-err and ballMag <= o+err)
    +** Processing line: ~        r = x1~
     - Inside source: true
     *** True Line Result
    -      t = find_tile x: tile.x + 0, y: tile.y + 1
    -** Processing line: ~      r = find_tile x: tile.x + 1, y: tile.y + 0~
    +        r = x1
    +** Processing line: ~      elsif (ballMag >= p-err and ballMag <= p+err)~
     - Inside source: true
     *** True Line Result
    -      r = find_tile x: tile.x + 1, y: tile.y + 0
    -** Processing line: ~      b = find_tile x: tile.x + 0, y: tile.y - 1~
    +      elsif (ballMag >= p-err and ballMag <= p+err)
    +** Processing line: ~        r = x2~
     - Inside source: true
     *** True Line Result
    -      b = find_tile x: tile.x + 0, y: tile.y - 1
    -** Processing line: ~      l = find_tile x: tile.x - 1, y: tile.y + 0~
    +        r = x2
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -      l = find_tile x: tile.x - 1, y: tile.y + 0
    -** Processing line: ~~
    +      else
    +** Processing line: ~        #unexpected~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      tile_t, tile_r, tile_b, tile_l = 0~
    +        #unexpected
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      tile_t, tile_r, tile_b, tile_l = 0
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      tile_t = 1 if t~
    -- Inside source: true
    -*** True Line Result
    -      tile_t = 1 if t
    -** Processing line: ~      tile_r = 1 if r~
    +** Processing line: ~      if (args.state.ball.center.x > @center.x)~
     - Inside source: true
     *** True Line Result
    -      tile_r = 1 if r
    -** Processing line: ~      tile_b = 1 if b~
    +      if (args.state.ball.center.x > @center.x)
    +** Processing line: ~        return x2*-1~
     - Inside source: true
     *** True Line Result
    -      tile_b = 1 if b
    -** Processing line: ~      tile_l = 1 if l~
    +        return x2*-1
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      tile_l = 1 if l
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.new_entity :neighbors, mask: [tile_t, tile_r, tile_b, tile_l],~
    -- Inside source: true
    -*** True Line Result
    -      state.new_entity :neighbors, mask: [tile_t, tile_r, tile_b, tile_l],
    -** Processing line: ~                                   t:    t ? :some : :none,~
    -- Inside source: true
    -*** True Line Result
    -                                   t:    t ? :some : :none,
    -** Processing line: ~                                   b:    b ? :some : :none,~
    +** Processing line: ~      return x2~
     - Inside source: true
     *** True Line Result
    -                                   b:    b ? :some : :none,
    -** Processing line: ~                                   l:    l ? :some : :none,~
    +      return x2
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                   l:    l ? :some : :none,
    -** Processing line: ~                                   r:    r ? :some : :none~
    +
    +** Processing line: ~      #return r~
     - Inside source: true
     *** True Line Result
    -                                   r:    r ? :some : :none
    +      #return r
     ** 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 tick args~
    +** Processing line: ~    #this sets the new velocity of the ball once it has collided with this peg~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $game ||= Game.new~
    +    #this sets the new velocity of the ball once it has collided with this peg
    +** Processing line: ~    def collide args~
     - Inside source: true
     *** True Line Result
    -    $game ||= Game.new
    -** Processing line: ~    $game.args = args~
    +    def collide args
    +** Processing line: ~      normalOfRCCollision = [                                                     #this is the normal of the collision in COMPONENT FORM~
     - Inside source: true
     *** True Line Result
    -    $game.args = args
    -** Processing line: ~    $game.tick~
    +      normalOfRCCollision = [                                                     #this is the normal of the collision in COMPONENT FORM
    +** Processing line: ~        {x: @center.x, y: @center.y},                                             #see https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.mathscard.co.uk%2Fonline%2Fcircle-coordinate-geometry%2F&psig=AOvVaw2GcD-e2-nJR_IUKpw3hO98&ust=1605731315521000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjBo7e1iu0CFQAAAAAdAAAAABAD~
     - Inside source: true
     *** True Line Result
    -    $game.tick
    -** Processing line: ~  end~
    +        {x: @center.x, y: @center.y},                                             #see https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.mathscard.co.uk%2Fonline%2Fcircle-coordinate-geometry%2F&psig=AOvVaw2GcD-e2-nJR_IUKpw3hO98&ust=1605731315521000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjBo7e1iu0CFQAAAAAdAAAAABAD
    +** Processing line: ~        {x: args.state.ball.center.x, y: args.state.ball.center.y},~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        {x: args.state.ball.center.x, y: args.state.ball.center.y},
    +** 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: ~*** Physics And Collisions - Jump Physics - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Jump Physics - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~      normalSlope = (                                                             #normalSlope is the slope of normalOfRCCollision~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/07_jump_physics/app/main.rb~
    +      normalSlope = (                                                             #normalSlope is the slope of normalOfRCCollision
    +** Processing line: ~        (normalOfRCCollision[1].y - normalOfRCCollision[0].y) /~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/07_jump_physics/app/main.rb
    -** Processing line: ~  =begin~
    +        (normalOfRCCollision[1].y - normalOfRCCollision[0].y) /
    +** Processing line: ~        (normalOfRCCollision[1].x - normalOfRCCollision[0].x)~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +        (normalOfRCCollision[1].x - normalOfRCCollision[0].x)
    +** Processing line: ~      )~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +      )
    +** Processing line: ~      slope = normalSlope**-1.0 * -1                                              # slope is the slope of the tangent~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +      slope = normalSlope**-1.0 * -1                                              # slope is the slope of the tangent
    +** Processing line: ~      # args.state.display_value = slope~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
    +      # args.state.display_value = slope
    +** Processing line: ~      pointA = {                                                                  # pointA and pointB are using the var slope to tangent in COMPONENT FORM~
     - Inside source: true
     *** True Line Result
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
    +      pointA = {                                                                  # pointA and pointB are using the var slope to tangent in COMPONENT FORM
    +** Processing line: ~        x: args.state.ball.center.x-1,~
     - Inside source: true
     *** True Line Result
    -     For example, if we want to create a new button, we would declare it as a new entity and
    -** Processing line: ~     then define its properties. (Remember, you can use state to define ANY property and it will~
    +        x: args.state.ball.center.x-1,
    +** Processing line: ~        y: -(slope-args.state.ball.center.y)~
     - Inside source: true
     *** True Line Result
    -     then define its properties. (Remember, you can use state to define ANY property and it will
    -** Processing line: ~     be retained across frames.)~
    +        y: -(slope-args.state.ball.center.y)
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -     be retained across frames.)
    -** Processing line: ~~
    +      }
    +** Processing line: ~      pointB = {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
    +      pointB = {
    +** Processing line: ~        x: args.state.ball.center.x+1,~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array. The values generate a solid.
    -** Processing line: ~     The parameters for a solid are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
    +        x: args.state.ball.center.x+1,
    +** Processing line: ~        y: slope+args.state.ball.center.y~
     - Inside source: true
     *** True Line Result
    -     The parameters for a solid are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    -** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +        y: slope+args.state.ball.center.y
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +      }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - num1.greater(num2): Returns the greater value.~
    +** Processing line: ~      perpVect = {x: pointB.x - pointA.x, y:pointB.y - pointA.y}                  # perpVect is to be VECTOR of the perpendicular tangent~
     - Inside source: true
     *** True Line Result
    -   - num1.greater(num2): Returns the greater value.
    -** Processing line: ~~
    +      perpVect = {x: pointB.x - pointA.x, y:pointB.y - pointA.y}                  # perpVect is to be VECTOR of the perpendicular tangent
    +** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
    +      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect
    +** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector~
     - Inside source: true
     *** True Line Result
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -** Processing line: ~     using their keys.~
    +      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector
    +** Processing line: ~      perpVect = {x: -perpVect.y, y: perpVect.x}                                  # swap the x and y and multiply by -1 to make the vector perpendicular~
     - Inside source: true
     *** True Line Result
    -     using their keys.
    -** Processing line: ~~
    +      perpVect = {x: -perpVect.y, y: perpVect.x}                                  # swap the x and y and multiply by -1 to make the vector perpendicular
    +** Processing line: ~      args.state.display_value = perpVect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.~
    +      args.state.display_value = perpVect
    +** Processing line: ~      if perpVect.y > 0                                                           #ensure perpVect points upward~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    -** Processing line: ~~
    +      if perpVect.y > 0                                                           #ensure perpVect points upward
    +** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  =end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This sample app is a game that requires the user to jump from one platform to the next.~
    -- Inside source: true
    -*** True Line Result
    -  # This sample app is a game that requires the user to jump from one platform to the next.
    -** Processing line: ~  # As the player successfully clears platforms, they become smaller and move faster.~
    +** Processing line: ~      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball~
     - Inside source: true
     *** True Line Result
    -  # As the player successfully clears platforms, they become smaller and move faster.
    -** Processing line: ~~
    +      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball
    +** Processing line: ~        x:args.state.ball.center.x-args.state.ball.velocity.x,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  class VerticalPlatformer~
    +        x:args.state.ball.center.x-args.state.ball.velocity.x,
    +** Processing line: ~        y:args.state.ball.center.y-args.state.ball.velocity.y~
     - Inside source: true
     *** True Line Result
    -  class VerticalPlatformer
    -** Processing line: ~    attr_gtk~
    +        y:args.state.ball.center.y-args.state.ball.velocity.y
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -    attr_gtk
    +      }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # declares vertical platformer as new entity~
    -- Inside source: true
    -*** True Line Result
    -    # declares vertical platformer as new entity
    -** Processing line: ~    def s~
    +** Processing line: ~      yInterc = pointA.y + -slope*pointA.x~
     - Inside source: true
     *** True Line Result
    -    def s
    -** Processing line: ~      state.vertical_platformer ||= state.new_entity(:vertical_platformer)~
    +      yInterc = pointA.y + -slope*pointA.x
    +** Processing line: ~      if slope == INFINITY                                                        # the perpVect presently either points in the correct dirrection or it is 180 degrees off we need to correct this~
     - Inside source: true
     *** True Line Result
    -      state.vertical_platformer ||= state.new_entity(:vertical_platformer)
    -** Processing line: ~      state.vertical_platformer~
    +      if slope == INFINITY                                                        # the perpVect presently either points in the correct dirrection or it is 180 degrees off we need to correct this
    +** Processing line: ~        if previousPosition.x < pointA.x~
     - Inside source: true
     *** True Line Result
    -      state.vertical_platformer
    -** Processing line: ~    end~
    +        if previousPosition.x < pointA.x
    +** Processing line: ~          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~          yInterc = -INFINITY~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # creates a new platform using a hash~
    +          yInterc = -INFINITY
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    # creates a new platform using a hash
    -** Processing line: ~    def new_platform hash~
    +        end
    +** Processing line: ~      elsif previousPosition.y < slope*previousPosition.x + yInterc               # check if ball is bellow or above the collider to determine if perpVect is - or +~
     - Inside source: true
     *** True Line Result
    -    def new_platform hash
    -** Processing line: ~      s.new_entity_strict(:platform, hash) # platform key~
    +      elsif previousPosition.y < slope*previousPosition.x + yInterc               # check if ball is bellow or above the collider to determine if perpVect is - or +
    +** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
     - Inside source: true
     *** True Line Result
    -      s.new_entity_strict(:platform, hash) # platform key
    -** Processing line: ~    end~
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # calls methods needed for game to run properly~
    -- Inside source: true
    -*** True Line Result
    -    # calls methods needed for game to run properly
    -** Processing line: ~    def tick~
    +** Processing line: ~      velocityMag =                                                               # the current velocity magnitude of the ball~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +      velocityMag =                                                               # the current velocity magnitude of the ball
    +** Processing line: ~        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
    +** Processing line: ~      theta_ball=~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      calc~
    +      theta_ball=
    +** Processing line: ~        Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x)         #the angle of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~      input~
    +        Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x)         #the angle of the ball's velocity
    +** Processing line: ~      theta_repel=~
     - Inside source: true
     *** True Line Result
    -      input
    -** Processing line: ~    end~
    +      theta_repel=
    +** Processing line: ~        Math.atan2(args.state.ball.center.y,args.state.ball.center.x)             #the angle of the repelling force(perpVect)~
     - Inside source: true
     *** True Line Result
    -    end
    +        Math.atan2(args.state.ball.center.y,args.state.ball.center.x)             #the angle of the repelling force(perpVect)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets default values~
    -- Inside source: true
    -*** True Line Result
    -    # Sets default values
    -** Processing line: ~    def defaults~
    +** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      s.platforms ||= [ # initializes platforms collection with two platforms using hashes~
    +      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity
    +** Processing line: ~      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity~
     - Inside source: true
     *** True Line Result
    -      s.platforms ||= [ # initializes platforms collection with two platforms using hashes
    -** Processing line: ~        new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),~
    +      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity
    +** Processing line: ~      repelMag = getRepelMagnitude(                                               # the magniude of the collision vector~
     - Inside source: true
     *** True Line Result
    -        new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),
    -** Processing line: ~        new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher~
    +      repelMag = getRepelMagnitude(                                               # the magniude of the collision vector
    +** Processing line: ~        args,~
     - Inside source: true
     *** True Line Result
    -        new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher
    -** Processing line: ~      ]~
    +        args,
    +** Processing line: ~        fbx,~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~~
    +        fbx,
    +** Processing line: ~        fby,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      s.tick_count  = args.state.tick_count~
    +        fby,
    +** Processing line: ~        perpVect.x,~
     - Inside source: true
     *** True Line Result
    -      s.tick_count  = args.state.tick_count
    -** Processing line: ~      s.gravity     = -0.3 # what goes up must come down because of gravity~
    +        perpVect.x,
    +** Processing line: ~        perpVect.y,~
     - Inside source: true
     *** True Line Result
    -      s.gravity     = -0.3 # what goes up must come down because of gravity
    -** Processing line: ~      s.player.platforms_cleared ||= 0 # counts how many platforms the player has successfully cleared~
    +        perpVect.y,
    +** Processing line: ~        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5~
     - Inside source: true
     *** True Line Result
    -      s.player.platforms_cleared ||= 0 # counts how many platforms the player has successfully cleared
    -** Processing line: ~      s.player.x  ||= 0           # sets player values~
    +        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
    +** Processing line: ~      )~
     - Inside source: true
     *** True Line Result
    -      s.player.x  ||= 0           # sets player values
    -** Processing line: ~      s.player.y  ||= 100~
    +      )
    +** Processing line: ~      frx = repelMag* Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx~
     - Inside source: true
     *** True Line Result
    -      s.player.y  ||= 100
    -** Processing line: ~      s.player.w  ||= 64~
    +      frx = repelMag* Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx
    +** Processing line: ~      fry = repelMag* Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby~
     - Inside source: true
     *** True Line Result
    -      s.player.w  ||= 64
    -** Processing line: ~      s.player.h  ||= 64~
    +      fry = repelMag* Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      s.player.h  ||= 64
    -** Processing line: ~      s.player.dy ||= 0           # change in position~
    +
    +** Processing line: ~      fsumx = fbx+frx                            # sum of x forces~
     - Inside source: true
     *** True Line Result
    -      s.player.dy ||= 0           # change in position
    -** Processing line: ~      s.player.dx ||= 0~
    +      fsumx = fbx+frx                            # sum of x forces
    +** Processing line: ~      fsumy = fby+fry                            # sum of y forces~
     - Inside source: true
     *** True Line Result
    -      s.player.dx ||= 0
    -** Processing line: ~      s.player_jump_power           = 15~
    +      fsumy = fby+fry                            # sum of y forces
    +** Processing line: ~      fr = velocityMag                           # fr is the resulting magnitude~
     - Inside source: true
     *** True Line Result
    -      s.player_jump_power           = 15
    -** Processing line: ~      s.player_jump_power_duration  = 10~
    +      fr = velocityMag                           # fr is the resulting magnitude
    +** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)        # thetaNew is the resulting angle~
     - Inside source: true
     *** True Line Result
    -      s.player_jump_power_duration  = 10
    -** Processing line: ~      s.player_max_run_speed        = 5~
    +      thetaNew = Math.atan2(fsumy, fsumx)        # thetaNew is the resulting angle
    +** Processing line: ~      xnew = fr*Math.cos(thetaNew)               # resulting x velocity~
     - Inside source: true
     *** True Line Result
    -      s.player_max_run_speed        = 5
    -** Processing line: ~      s.player_speed_slowdown_rate  = 0.9~
    +      xnew = fr*Math.cos(thetaNew)               # resulting x velocity
    +** Processing line: ~      ynew = fr*Math.sin(thetaNew)               # resulting y velocity~
     - Inside source: true
     *** True Line Result
    -      s.player_speed_slowdown_rate  = 0.9
    -** Processing line: ~      s.player_acceleration         = 1~
    +      ynew = fr*Math.sin(thetaNew)               # resulting y velocity
    +** Processing line: ~      if (args.state.ball.center.x >= @center.x) # this is necessary for the ball colliding on the right side of the peg~
     - Inside source: true
     *** True Line Result
    -      s.player_acceleration         = 1
    -** Processing line: ~      s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)~
    +      if (args.state.ball.center.x >= @center.x) # this is necessary for the ball colliding on the right side of the peg
    +** Processing line: ~        xnew=xnew.abs~
     - Inside source: true
     *** True Line Result
    -      s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)
    -** Processing line: ~    end~
    +        xnew=xnew.abs
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs objects onto the screen~
    +** Processing line: ~      args.state.ball.velocity.x = xnew                                           # set the x-velocity to the new velocity~
     - Inside source: true
     *** True Line Result
    -    # Outputs objects onto the screen
    -** Processing line: ~    def render~
    +      args.state.ball.velocity.x = xnew                                           # set the x-velocity to the new velocity
    +** Processing line: ~      if args.state.ball.center.y > @center.y                                     # if the ball is above the middle of the peg we need to temporarily ignore some of the gravity~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      outputs.solids << s.platforms.map do |p| # outputs platforms onto screen~
    +      if args.state.ball.center.y > @center.y                                     # if the ball is above the middle of the peg we need to temporarily ignore some of the gravity
    +** Processing line: ~        args.state.ball.velocity.y = ynew + GRAVITY * 0.01~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << s.platforms.map do |p| # outputs platforms onto screen
    -** Processing line: ~        [p.x + 300, p.y - s.camera[:y], p.w, p.h] # add 300 to place platform in horizontal center~
    +        args.state.ball.velocity.y = ynew + GRAVITY * 0.01
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        [p.x + 300, p.y - s.camera[:y], p.w, p.h] # add 300 to place platform in horizontal center
    -** Processing line: ~        # don't forget, position of platform is denoted by bottom left hand corner~
    +      else
    +** Processing line: ~        args.state.ball.velocity.y = ynew - GRAVITY * 0.01                        # if the ball is bellow the middle of the peg we need to temporarily increase the power of the gravity~
     - Inside source: true
     *** True Line Result
    -        # don't forget, position of platform is denoted by bottom left hand corner
    +        args.state.ball.velocity.y = ynew - GRAVITY * 0.01                        # if the ball is bellow the middle of the peg we need to temporarily increase the power of the gravity
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29272,70 +29659,74 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # outputs player using hash~
    +** Processing line: ~      args.state.ball.center.x+= args.state.ball.velocity.x                       # update the position of the ball so it never looks like the ball is intersecting the circle~
     - Inside source: true
     *** True Line Result
    -      # outputs player using hash
    -** Processing line: ~      outputs.solids << {~
    +      args.state.ball.center.x+= args.state.ball.velocity.x                       # update the position of the ball so it never looks like the ball is intersecting the circle
    +** Processing line: ~      args.state.ball.center.y+= args.state.ball.velocity.y~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << {
    -** Processing line: ~        x: s.player.x + 300, # player positioned on top of platform~
    +      args.state.ball.center.y+= args.state.ball.velocity.y
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        x: s.player.x + 300, # player positioned on top of platform
    -** Processing line: ~        y: s.player.y - s.camera[:y],~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        y: s.player.y - s.camera[:y],
    -** Processing line: ~        w: s.player.w,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        w: s.player.w,
    -** Processing line: ~        h: s.player.h,~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -        h: s.player.h,
    -** Processing line: ~        r: 100,              # color saturation~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -        r: 100,              # color saturation
    -** Processing line: ~        g: 100,~
    -- Inside source: true
    +
    +** Processing line: ~*** Physics And Collisions - Bouncing On Collision - vector2d.rb~
    +- Header detected.
     *** True Line Result
    -        g: 100,
    -** Processing line: ~        b: 200~
    +
    +*** True Line Result
    +*** Physics And Collisions - Bouncing On Collision - vector2d.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/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb~
     - Inside source: true
     *** True Line Result
    -        b: 200
    -** Processing line: ~      }~
    +  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb
    +** Processing line: ~  class Vector2d~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~    end~
    +  class Vector2d
    +** Processing line: ~      attr_accessor :x, :y~
     - Inside source: true
     *** True Line Result
    -    end
    +      attr_accessor :x, :y
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Performs calculations~
    -- Inside source: true
    -*** True Line Result
    -    # Performs calculations
    -** Processing line: ~    def calc~
    +** Processing line: ~      def initialize x=0, y=0~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      s.platforms.each do |p| # for each platform in the collection~
    +      def initialize x=0, y=0
    +** Processing line: ~        @x=x~
     - Inside source: true
     *** True Line Result
    -      s.platforms.each do |p| # for each platform in the collection
    -** Processing line: ~        p.rect = [p.x, p.y, p.w, p.h] # set the definition~
    +        @x=x
    +** Processing line: ~        @y=y~
     - Inside source: true
     *** True Line Result
    -        p.rect = [p.x, p.y, p.w, p.h] # set the definition
    +        @y=y
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29344,106 +29735,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # sets player point by adding half the player's width to the player's x~
    -- Inside source: true
    -*** True Line Result
    -      # sets player point by adding half the player's width to the player's x
    -** Processing line: ~      s.player.point = [s.player.x + s.player.w.half, s.player.y] # change + to - and see what happens!~
    +** Processing line: ~      #returns a vector multiplied by scalar x~
     - Inside source: true
     *** True Line Result
    -      s.player.point = [s.player.x + s.player.w.half, s.player.y] # change + to - and see what happens!
    -** Processing line: ~~
    +      #returns a vector multiplied by scalar x
    +** Processing line: ~      #x [float] scalar~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # search the platforms collection to find if the player's point is inside the rect of a platform~
    +      #x [float] scalar
    +** Processing line: ~      def mult x~
     - Inside source: true
     *** True Line Result
    -      # search the platforms collection to find if the player's point is inside the rect of a platform
    -** Processing line: ~      collision = s.platforms.find { |p| s.player.point.inside_rect? p.rect }~
    +      def mult x
    +** Processing line: ~        r = Vector2d.new(0,0)~
     - Inside source: true
     *** True Line Result
    -      collision = s.platforms.find { |p| s.player.point.inside_rect? p.rect }
    -** Processing line: ~~
    +        r = Vector2d.new(0,0)
    +** Processing line: ~        r.x=@x*x~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # if collision occurred and player is moving down (or not moving vertically at all)~
    +        r.x=@x*x
    +** Processing line: ~        r.y=@y*x~
     - Inside source: true
     *** True Line Result
    -      # if collision occurred and player is moving down (or not moving vertically at all)
    -** Processing line: ~      if collision && s.player.dy <= 0~
    +        r.y=@y*x
    +** Processing line: ~        r~
     - Inside source: true
     *** True Line Result
    -      if collision && s.player.dy <= 0
    -** Processing line: ~        s.player.y = collision.rect.y + collision.rect.h - 2 # player positioned on top of platform~
    +        r
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        s.player.y = collision.rect.y + collision.rect.h - 2 # player positioned on top of platform
    -** Processing line: ~        s.player.dy = 0 if s.player.dy < 0 # player stops moving vertically~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s.player.dy = 0 if s.player.dy < 0 # player stops moving vertically
    -** Processing line: ~        if !s.player.platform~
    +
    +** Processing line: ~      # vect [Vector2d] vector to copy~
     - Inside source: true
     *** True Line Result
    -        if !s.player.platform
    -** Processing line: ~          s.player.dx = 0 # no horizontal movement~
    +      # vect [Vector2d] vector to copy
    +** Processing line: ~      def copy vect~
     - Inside source: true
     *** True Line Result
    -          s.player.dx = 0 # no horizontal movement
    -** Processing line: ~        end~
    +      def copy vect
    +** Processing line: ~        Vector2d.new(@x, @y)~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        # changes horizontal position of player by multiplying collision change in x (dx) by speed and adding it to current x~
    +        Vector2d.new(@x, @y)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        # changes horizontal position of player by multiplying collision change in x (dx) by speed and adding it to current x
    -** Processing line: ~        s.player.x += collision.dx * collision.speed~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s.player.x += collision.dx * collision.speed
    -** Processing line: ~        s.player.platform = collision # player is on the platform that it collided with (or landed on)~
    +
    +** Processing line: ~      #returns a new vector equivalent to this+vect~
     - Inside source: true
     *** True Line Result
    -        s.player.platform = collision # player is on the platform that it collided with (or landed on)
    -** Processing line: ~        if s.player.falling # if player is falling~
    +      #returns a new vector equivalent to this+vect
    +** Processing line: ~      #vect [Vector2d] vector to add to self~
     - Inside source: true
     *** True Line Result
    -        if s.player.falling # if player is falling
    -** Processing line: ~          s.player.dx = 0  # no horizontal movement~
    +      #vect [Vector2d] vector to add to self
    +** Processing line: ~      def add vect~
     - Inside source: true
     *** True Line Result
    -          s.player.dx = 0  # no horizontal movement
    -** Processing line: ~        end~
    +      def add vect
    +** Processing line: ~        Vector2d.new(@x+vect.x,@y+vect.y)~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        s.player.falling = false~
    +        Vector2d.new(@x+vect.x,@y+vect.y)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        s.player.falling = false
    -** Processing line: ~        s.player.jumped_at = nil~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s.player.jumped_at = nil
    -** Processing line: ~      else~
    +
    +** Processing line: ~      #returns a new vector equivalent to this-vect~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        s.player.platform = nil # player is not on a platform~
    +      #returns a new vector equivalent to this-vect
    +** Processing line: ~      #vect [Vector2d] vector to subtract to self~
     - Inside source: true
     *** True Line Result
    -        s.player.platform = nil # player is not on a platform
    -** Processing line: ~        s.player.y  += s.player.dy # velocity is the change in position~
    +      #vect [Vector2d] vector to subtract to self
    +** Processing line: ~      def sub vect~
     - Inside source: true
     *** True Line Result
    -        s.player.y  += s.player.dy # velocity is the change in position
    -** Processing line: ~        s.player.dy += s.gravity # acceleration is the change in velocity; what goes up must come down~
    +      def sub vect
    +** Processing line: ~        Vector2d.new(@x-vect.c, @y-vect.y)~
     - Inside source: true
     *** True Line Result
    -        s.player.dy += s.gravity # acceleration is the change in velocity; what goes up must come down
    +        Vector2d.new(@x-vect.c, @y-vect.y)
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29452,46 +29839,38 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      s.platforms.each do |p| # for each platform in the collection~
    -- Inside source: true
    -*** True Line Result
    -      s.platforms.each do |p| # for each platform in the collection
    -** Processing line: ~        p.x += p.dx * p.speed # x is incremented by product of dx and speed (causes platform to move horizontally)~
    -- Inside source: true
    -*** True Line Result
    -        p.x += p.dx * p.speed # x is incremented by product of dx and speed (causes platform to move horizontally)
    -** Processing line: ~        # changes platform's x so it moves left and right across the screen (between -300 and 300 pixels)~
    +** Processing line: ~      #return the magnitude of the vector~
     - Inside source: true
     *** True Line Result
    -        # changes platform's x so it moves left and right across the screen (between -300 and 300 pixels)
    -** Processing line: ~        if p.x < -300 # if platform goes too far left~
    +      #return the magnitude of the vector
    +** Processing line: ~      def mag~
     - Inside source: true
     *** True Line Result
    -        if p.x < -300 # if platform goes too far left
    -** Processing line: ~          p.dx *= -1 # dx is scaled down~
    +      def mag
    +** Processing line: ~        ((@x**2)+(@y**2))**0.5~
     - Inside source: true
     *** True Line Result
    -          p.dx *= -1 # dx is scaled down
    -** Processing line: ~          p.x = -300 # as far left as possible within scope~
    +        ((@x**2)+(@y**2))**0.5
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -          p.x = -300 # as far left as possible within scope
    -** Processing line: ~        elsif p.x > (1000 - p.w) # if platform's x is greater than 300~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        elsif p.x > (1000 - p.w) # if platform's x is greater than 300
    -** Processing line: ~          p.dx *= -1~
    +
    +** Processing line: ~      #returns a new normalize version of the vector~
     - Inside source: true
     *** True Line Result
    -          p.dx *= -1
    -** Processing line: ~          p.x = (1000 - p.w) # set to 300 (as far right as possible within scope)~
    +      #returns a new normalize version of the vector
    +** Processing line: ~      def normalize~
     - Inside source: true
     *** True Line Result
    -          p.x = (1000 - p.w) # set to 300 (as far right as possible within scope)
    -** Processing line: ~        end~
    +      def normalize
    +** Processing line: ~        Vector2d.new(@x/mag, @y/mag)~
     - Inside source: true
     *** True Line Result
    -        end
    +        Vector2d.new(@x/mag, @y/mag)
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29500,170 +29879,154 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      delta = (s.player.y - s.camera[:y] - 100) # used to position camera view~
    +** Processing line: ~      #TODO delet?~
     - Inside source: true
     *** True Line Result
    -      delta = (s.player.y - s.camera[:y] - 100) # used to position camera view
    -** Processing line: ~~
    +      #TODO delet?
    +** Processing line: ~      def distABS vect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if delta > -200~
    +      def distABS vect
    +** Processing line: ~        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()~
     - Inside source: true
     *** True Line Result
    -      if delta > -200
    -** Processing line: ~        s.camera[:y] += delta * 0.01 # allows player to see view as they move upwards~
    +        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        s.camera[:y] += delta * 0.01 # allows player to see view as they move upwards
    -** Processing line: ~        s.player.x  += s.player.dx # velocity is change in position; change in x increases by dx~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        s.player.x  += s.player.dx # velocity is change in position; change in x increases by dx
    +    end
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~        # searches platform collection to find platforms located more than 300 pixels above the player~
    -- Inside source: true
    +** Processing line: ~*** Physics And Collisions - Arbitrary Collision - ball.rb~
    +- Header detected.
     *** True Line Result
    -        # searches platform collection to find platforms located more than 300 pixels above the player
    -** Processing line: ~        has_platforms = s.platforms.find { |p| p.y > (s.player.y + 300) }~
    -- Inside source: true
    +
     *** True Line Result
    -        has_platforms = s.platforms.find { |p| p.y > (s.player.y + 300) }
    -** Processing line: ~        if !has_platforms # if there are no platforms 300 pixels above the player~
    -- Inside source: true
    +*** Physics And Collisions - Arbitrary Collision - ball.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -        if !has_platforms # if there are no platforms 300 pixels above the player
    -** Processing line: ~          width = 700 - (700 * (0.1 * s.player.platforms_cleared)) # the next platform is smaller than previous~
    -- Inside source: true
    +
     *** True Line Result
    -          width = 700 - (700 * (0.1 * s.player.platforms_cleared)) # the next platform is smaller than previous
    -** Processing line: ~          s.player.platforms_cleared += 1 # player successfully cleared another platform~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/ball.rb~
     - Inside source: true
     *** True Line Result
    -          s.player.platforms_cleared += 1 # player successfully cleared another platform
    -** Processing line: ~          last_platform = s.platforms[-1] # platform just cleared becomes last platform~
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/ball.rb
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          last_platform = s.platforms[-1] # platform just cleared becomes last platform
    -** Processing line: ~          # another platform is created 300 pixels above the last platform, and this~
    +
    +** Processing line: ~  class Ball~
     - Inside source: true
     *** True Line Result
    -          # another platform is created 300 pixels above the last platform, and this
    -** Processing line: ~          # new platform has a smaller width and moves faster than all previous platforms~
    +  class Ball
    +** Processing line: ~      attr_accessor :velocity, :child, :parent, :number, :leastChain~
     - Inside source: true
     *** True Line Result
    -          # new platform has a smaller width and moves faster than all previous platforms
    -** Processing line: ~          s.platforms << new_platform(x: (700 - width) * rand, # random x position~
    +      attr_accessor :velocity, :child, :parent, :number, :leastChain
    +** Processing line: ~      attr_reader :x, :y, :hypotenuse, :width, :height~
     - Inside source: true
     *** True Line Result
    -          s.platforms << new_platform(x: (700 - width) * rand, # random x position
    -** Processing line: ~                                      y: last_platform.y + 300,~
    +      attr_reader :x, :y, :hypotenuse, :width, :height
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                      y: last_platform.y + 300,
    -** Processing line: ~                                      w: width,~
    +
    +** Processing line: ~      def initialize args, number, leastChain, parent, child~
     - Inside source: true
     *** True Line Result
    -                                      w: width,
    -** Processing line: ~                                      h: 32,~
    +      def initialize args, number, leastChain, parent, child
    +** Processing line: ~          #Start the ball in the top center~
     - Inside source: true
     *** True Line Result
    -                                      h: 32,
    -** Processing line: ~                                      dx: 1.randomize(:sign), # random change in x~
    +          #Start the ball in the top center
    +** Processing line: ~          @number = number~
     - Inside source: true
     *** True Line Result
    -                                      dx: 1.randomize(:sign), # random change in x
    -** Processing line: ~                                      speed: 2 * s.player.platforms_cleared,~
    +          @number = number
    +** Processing line: ~          @leastChain = leastChain~
     - Inside source: true
     *** True Line Result
    -                                      speed: 2 * s.player.platforms_cleared,
    -** Processing line: ~                                      rect: nil)~
    +          @leastChain = leastChain
    +** Processing line: ~          @x = args.grid.w / 2~
     - Inside source: true
     *** True Line Result
    -                                      rect: nil)
    -** Processing line: ~        end~
    +          @x = args.grid.w / 2
    +** Processing line: ~          @y = args.grid.h - 20~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      else~
    +          @y = args.grid.h - 20
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        s.as_hash.clear # otherwise clear the hash (no new platform is necessary)~
    +
    +** Processing line: ~          @velocity = Vector2d.new(2, -2)~
     - Inside source: true
     *** True Line Result
    -        s.as_hash.clear # otherwise clear the hash (no new platform is necessary)
    -** Processing line: ~      end~
    +          @velocity = Vector2d.new(2, -2)
    +** Processing line: ~          @width =  10~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +          @width =  10
    +** Processing line: ~          @height = 10~
     - Inside source: true
     *** True Line Result
    -    end
    +          @height = 10
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Takes input from the user to move the player~
    -- Inside source: true
    -*** True Line Result
    -    # Takes input from the user to move the player
    -** Processing line: ~    def input~
    -- Inside source: true
    -*** True Line Result
    -    def input
    -** Processing line: ~      if inputs.keyboard.space # if the space bar is pressed~
    +** Processing line: ~          @left_wall = (args.state.board_width + args.grid.w / 8)~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.space # if the space bar is pressed
    -** Processing line: ~        s.player.jumped_at ||= s.tick_count # set to current frame~
    +          @left_wall = (args.state.board_width + args.grid.w / 8)
    +** Processing line: ~          @right_wall = @left_wall + args.state.board_width~
     - Inside source: true
     *** True Line Result
    -        s.player.jumped_at ||= s.tick_count # set to current frame
    +          @right_wall = @left_wall + args.state.board_width
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # if the time that has passed since the jump is less than the duration of a jump (10 frames)~
    -- Inside source: true
    -*** True Line Result
    -        # if the time that has passed since the jump is less than the duration of a jump (10 frames)
    -** Processing line: ~        # and the player is not falling~
    -- Inside source: true
    -*** True Line Result
    -        # and the player is not falling
    -** Processing line: ~        if s.player.jumped_at.elapsed_time < s.player_jump_power_duration && !s.player.falling~
    +** Processing line: ~          @max_velocity = MAX_VELOCITY~
     - Inside source: true
     *** True Line Result
    -        if s.player.jumped_at.elapsed_time < s.player_jump_power_duration && !s.player.falling
    -** Processing line: ~          s.player.dy = s.player_jump_power # player jumps up~
    +          @max_velocity = MAX_VELOCITY
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          s.player.dy = s.player_jump_power # player jumps up
    -** Processing line: ~        end~
    +
    +** Processing line: ~          @child = child~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +          @child = child
    +** Processing line: ~          @parent = parent~
     - Inside source: true
     *** True Line Result
    -      end
    +          @parent = parent
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if inputs.keyboard.key_up.space # if space bar is in "up" state~
    +** Processing line: ~          @past = [{x: @x, y: @y}]~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_up.space # if space bar is in "up" state
    -** Processing line: ~        s.player.falling = true # player is falling~
    +          @past = [{x: @x, y: @y}]
    +** Processing line: ~          @next = nil~
     - Inside source: true
     *** True Line Result
    -        s.player.falling = true # player is falling
    +          @next = nil
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29672,198 +30035,166 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if inputs.keyboard.left # if left key is pressed~
    -- Inside source: true
    -*** True Line Result
    -      if inputs.keyboard.left # if left key is pressed
    -** Processing line: ~        s.player.dx -= s.player_acceleration # player's position changes, decremented by acceleration~
    -- Inside source: true
    -*** True Line Result
    -        s.player.dx -= s.player_acceleration # player's position changes, decremented by acceleration
    -** Processing line: ~        s.player.dx = s.player.dx.greater(-s.player_max_run_speed) # dx is either current dx or -5, whichever is greater~
    -- Inside source: true
    -*** True Line Result
    -        s.player.dx = s.player.dx.greater(-s.player_max_run_speed) # dx is either current dx or -5, whichever is greater
    -** Processing line: ~      elsif inputs.keyboard.right # if right key is pressed~
    +** Processing line: ~      def reassignLeastChain (lc=nil)~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.right # if right key is pressed
    -** Processing line: ~        s.player.dx += s.player_acceleration # player's position changes, incremented by acceleration~
    +      def reassignLeastChain (lc=nil)
    +** Processing line: ~        if (lc == nil)~
     - Inside source: true
     *** True Line Result
    -        s.player.dx += s.player_acceleration # player's position changes, incremented by acceleration
    -** Processing line: ~        s.player.dx  = s.player.dx.lesser(s.player_max_run_speed) # dx is either current dx or 5, whichever is lesser~
    +        if (lc == nil)
    +** Processing line: ~          lc = @number~
     - Inside source: true
     *** True Line Result
    -        s.player.dx  = s.player.dx.lesser(s.player_max_run_speed) # dx is either current dx or 5, whichever is lesser
    -** Processing line: ~      else~
    +          lc = @number
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        s.player.dx *= s.player_speed_slowdown_rate # scales dx down~
    +        end
    +** Processing line: ~        @leastChain = lc~
     - Inside source: true
     *** True Line Result
    -        s.player.dx *= s.player_speed_slowdown_rate # scales dx down
    -** Processing line: ~      end~
    +        @leastChain = lc
    +** Processing line: ~        if (parent != nil)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +        if (parent != nil)
    +** Processing line: ~          @parent.reassignLeastChain(lc)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +          @parent.reassignLeastChain(lc)
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  end
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $game = VerticalPlatformer.new~
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  $game = VerticalPlatformer.new
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~      def makeLeader args~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $game.args = args~
    +      def makeLeader args
    +** Processing line: ~        if isLeader~
     - Inside source: true
     *** True Line Result
    -    $game.args = args
    -** Processing line: ~    $game.tick~
    +        if isLeader
    +** Processing line: ~          return~
     - Inside source: true
     *** True Line Result
    -    $game.tick
    -** Processing line: ~  end~
    +          return
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        end
    +** Processing line: ~        @parent.reassignLeastChain~
     - 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: ~*** Physics And Collisions - Bouncing On Collision - ball.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Bouncing On Collision - ball.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/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb~
    +        @parent.reassignLeastChain
    +** Processing line: ~        args.state.ballParents.push(self)~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb
    -** Processing line: ~  GRAVITY = -0.08~
    +        args.state.ballParents.push(self)
    +** Processing line: ~        @parent = nil~
     - Inside source: true
     *** True Line Result
    -  GRAVITY = -0.08
    +        @parent = nil
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class Ball~
    -- Inside source: true
    -*** True Line Result
    -  class Ball
    -** Processing line: ~      attr_accessor :velocity, :center, :radius, :collision_enabled~
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :velocity, :center, :radius, :collision_enabled
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def initialize args~
    -- Inside source: true
    -*** True Line Result
    -      def initialize args
    -** Processing line: ~          #Start the ball in the top center~
    +** Processing line: ~      def isLeader~
     - Inside source: true
     *** True Line Result
    -          #Start the ball in the top center
    -** Processing line: ~          #@x = args.grid.w / 2~
    +      def isLeader
    +** Processing line: ~        return (parent == nil)~
     - Inside source: true
     *** True Line Result
    -          #@x = args.grid.w / 2
    -** Processing line: ~          #@y = args.grid.h - 20~
    +        return (parent == nil)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -          #@y = args.grid.h - 20
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @velocity = {x: 0, y: 0}~
    +** Processing line: ~      def receiveNext (p)~
     - Inside source: true
     *** True Line Result
    -          @velocity = {x: 0, y: 0}
    -** Processing line: ~          #@width =  20~
    +      def receiveNext (p)
    +** Processing line: ~        #trace!~
     - Inside source: true
     *** True Line Result
    -          #@width =  20
    -** Processing line: ~          #@height = @width~
    +        #trace!
    +** Processing line: ~        if parent != nil~
     - Inside source: true
     *** True Line Result
    -          #@height = @width
    -** Processing line: ~          @radius = 20.0 / 2.0~
    +        if parent != nil
    +** Processing line: ~          @x = p[:x]~
     - Inside source: true
     *** True Line Result
    -          @radius = 20.0 / 2.0
    -** Processing line: ~          @center = {x: (args.grid.w / 2), y: (args.grid.h)}~
    +          @x = p[:x]
    +** Processing line: ~          @y = p[:y]~
     - Inside source: true
     *** True Line Result
    -          @center = {x: (args.grid.w / 2), y: (args.grid.h)}
    -** Processing line: ~~
    +          @y = p[:y]
    +** Processing line: ~          @velocity = p[:velocity]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          #@left_wall = (args.state.board_width + args.grid.w / 8)~
    +          @velocity = p[:velocity]
    +** Processing line: ~          #puts @x.to_s + "|" + @y.to_s + "|"+@velocity.to_s~
     - Inside source: true
     *** True Line Result
    -          #@left_wall = (args.state.board_width + args.grid.w / 8)
    -** Processing line: ~          #@right_wall = @left_wall + args.state.board_width~
    +          #puts @x.to_s + "|" + @y.to_s + "|"+@velocity.to_s
    +** Processing line: ~          @past.append(p)~
     - Inside source: true
     *** True Line Result
    -          #@right_wall = @left_wall + args.state.board_width
    -** Processing line: ~          @left_wall = 0~
    +          @past.append(p)
    +** Processing line: ~          if (@past.length >= BALL_DISTANCE)~
     - Inside source: true
     *** True Line Result
    -          @left_wall = 0
    -** Processing line: ~          @right_wall = $args.grid.right~
    +          if (@past.length >= BALL_DISTANCE)
    +** Processing line: ~            if (@child != nil)~
     - Inside source: true
     *** True Line Result
    -          @right_wall = $args.grid.right
    -** Processing line: ~~
    +            if (@child != nil)
    +** Processing line: ~              @child.receiveNext(@past[0])~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @max_velocity = 7~
    +              @child.receiveNext(@past[0])
    +** Processing line: ~              @past.shift~
     - Inside source: true
     *** True Line Result
    -          @max_velocity = 7
    -** Processing line: ~          @collision_enabled = true~
    +              @past.shift
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -          @collision_enabled = true
    +            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
    @@ -29880,94 +30211,82 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
           def update args
    -** Processing line: ~        @center.x += @velocity.x~
    -- Inside source: true
    -*** True Line Result
    -        @center.x += @velocity.x
    -** Processing line: ~        @center.y += @velocity.y~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @center.y += @velocity.y
    -** Processing line: ~        @velocity.y += GRAVITY~
    +
    +** Processing line: ~          if isLeader~
     - Inside source: true
     *** True Line Result
    -        @velocity.y += GRAVITY
    -** Processing line: ~~
    +          if isLeader
    +** Processing line: ~            wallBounds args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        alpha = 0.2~
    +            wallBounds args
    +** Processing line: ~            @x += @velocity.x~
     - Inside source: true
     *** True Line Result
    -        alpha = 0.2
    -** Processing line: ~        if @center.y-@radius <= 0~
    +            @x += @velocity.x
    +** Processing line: ~            @y += @velocity.y~
     - Inside source: true
     *** True Line Result
    -        if @center.y-@radius <= 0
    -** Processing line: ~          @velocity.y  = (@velocity.y.abs*0.7).abs~
    +            @y += @velocity.y
    +** Processing line: ~            @past.append({x: @x, y: @y, velocity: @velocity})~
     - Inside source: true
     *** True Line Result
    -          @velocity.y  = (@velocity.y.abs*0.7).abs
    -** Processing line: ~          @velocity.x  = (@velocity.x.abs*0.9).abs * ((@velocity.x < 0) ? -1 : 1)~
    +            @past.append({x: @x, y: @y, velocity: @velocity})
    +** Processing line: ~            #puts @past~
     - Inside source: true
     *** True Line Result
    -          @velocity.x  = (@velocity.x.abs*0.9).abs * ((@velocity.x < 0) ? -1 : 1)
    +            #puts @past
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          if @velocity.y.abs() < alpha~
    -- Inside source: true
    -*** True Line Result
    -          if @velocity.y.abs() < alpha
    -** Processing line: ~            @velocity.y=0~
    +** Processing line: ~            if (@past.length >= BALL_DISTANCE)~
     - Inside source: true
     *** True Line Result
    -            @velocity.y=0
    -** Processing line: ~          end~
    +            if (@past.length >= BALL_DISTANCE)
    +** Processing line: ~              if (@child != nil)~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          if @velocity.x.abs() < alpha~
    +              if (@child != nil)
    +** Processing line: ~                @child.receiveNext(@past[0])~
     - Inside source: true
     *** True Line Result
    -          if @velocity.x.abs() < alpha
    -** Processing line: ~            @velocity.x=0~
    +                @child.receiveNext(@past[0])
    +** Processing line: ~                @past.shift~
     - Inside source: true
     *** True Line Result
    -            @velocity.x=0
    -** Processing line: ~          end~
    +                @past.shift
    +** Processing line: ~              end~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +              end
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -        end
    +            end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        if @center.x > args.grid.right+@radius*2~
    -- Inside source: true
    -*** True Line Result
    -        if @center.x > args.grid.right+@radius*2
    -** Processing line: ~          @center.x = 0-@radius~
    +** Processing line: ~          else~
     - Inside source: true
     *** True Line Result
    -          @center.x = 0-@radius
    -** Processing line: ~        elsif @center.x< 0-@radius*2~
    +          else
    +** Processing line: ~            puts "unexpected"~
     - Inside source: true
     *** True Line Result
    -        elsif @center.x< 0-@radius*2
    -** Processing line: ~          @center.x = args.grid.right + @radius~
    +            puts "unexpected"
    +** Processing line: ~            raise "unexpected"~
     - Inside source: true
     *** True Line Result
    -          @center.x = args.grid.right + @radius
    -** Processing line: ~        end~
    +            raise "unexpected"
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -        end
    +          end
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -29980,330 +30299,7942 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
           def wallBounds args
    -** Processing line: ~          #if @x < @left_wall || @x + @width > @right_wall~
    +** Processing line: ~          b= false~
     - Inside source: true
     *** True Line Result
    -          #if @x < @left_wall || @x + @width > @right_wall
    -** Processing line: ~              #@velocity.x *= -1.1~
    +          b= false
    +** Processing line: ~          if @x < @left_wall~
     - Inside source: true
     *** True Line Result
    -              #@velocity.x *= -1.1
    -** Processing line: ~              #if @velocity.x > @max_velocity~
    +          if @x < @left_wall
    +** Processing line: ~            @velocity.x = @velocity.x.abs() * 1~
     - Inside source: true
     *** True Line Result
    -              #if @velocity.x > @max_velocity
    -** Processing line: ~                  #@velocity.x = @max_velocity~
    +            @velocity.x = @velocity.x.abs() * 1
    +** Processing line: ~            b=true~
     - Inside source: true
     *** True Line Result
    -                  #@velocity.x = @max_velocity
    -** Processing line: ~              #elsif @velocity.x < @max_velocity * -1~
    +            b=true
    +** Processing line: ~          elsif @x + @width > @right_wall~
     - Inside source: true
     *** True Line Result
    -              #elsif @velocity.x < @max_velocity * -1
    -** Processing line: ~                  #@velocity.x = @max_velocity * -1~
    +          elsif @x + @width > @right_wall
    +** Processing line: ~            @velocity.x = @velocity.x.abs() * -1~
     - Inside source: true
     *** True Line Result
    -                  #@velocity.x = @max_velocity * -1
    -** Processing line: ~              #end~
    +            @velocity.x = @velocity.x.abs() * -1
    +** Processing line: ~            b=true~
     - Inside source: true
     *** True Line Result
    -              #end
    -** Processing line: ~          #end~
    +            b=true
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -          #end
    -** Processing line: ~          #if @y < 0 || @y + @height > args.grid.h~
    +          end
    +** Processing line: ~          if @y < 0~
     - Inside source: true
     *** True Line Result
    -          #if @y < 0 || @y + @height > args.grid.h
    -** Processing line: ~              #@velocity.y *= -1.1~
    +          if @y < 0
    +** Processing line: ~            @velocity.y = @velocity.y.abs() * 1~
     - Inside source: true
     *** True Line Result
    -              #@velocity.y *= -1.1
    -** Processing line: ~              #if @velocity.y > @max_velocity~
    +            @velocity.y = @velocity.y.abs() * 1
    +** Processing line: ~            b=true~
     - Inside source: true
     *** True Line Result
    -              #if @velocity.y > @max_velocity
    -** Processing line: ~                  #@velocity.y = @max_velocity~
    +            b=true
    +** Processing line: ~          elsif @y + @height > args.grid.h~
     - Inside source: true
     *** True Line Result
    -                  #@velocity.y = @max_velocity
    -** Processing line: ~              #elsif @velocity.y < @max_velocity * -1~
    +          elsif @y + @height > args.grid.h
    +** Processing line: ~            @velocity.y = @velocity.y.abs() * -1~
     - Inside source: true
     *** True Line Result
    -              #elsif @velocity.y < @max_velocity * -1
    -** Processing line: ~                  #@velocity.y = @max_velocity * -1~
    +            @velocity.y = @velocity.y.abs() * -1
    +** Processing line: ~            b=true~
     - Inside source: true
     *** True Line Result
    -                  #@velocity.y = @max_velocity * -1
    -** Processing line: ~              #end~
    +            b=true
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -              #end
    -** Processing line: ~          #end~
    +          end
    +** Processing line: ~          mag = (@velocity.x**2.0 + @velocity.y**2.0)**0.5~
     - Inside source: true
     *** True Line Result
    -          #end
    -** Processing line: ~      end~
    +          mag = (@velocity.x**2.0 + @velocity.y**2.0)**0.5
    +** Processing line: ~          if (b == true && mag < MAX_VELOCITY)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          if (b == true && mag < MAX_VELOCITY)
    +** Processing line: ~            @velocity.x*=1.1;~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #render the ball to the screen~
    +            @velocity.x*=1.1;
    +** Processing line: ~            @velocity.y*=1.1;~
     - Inside source: true
     *** True Line Result
    -      #render the ball to the screen
    -** Processing line: ~      def draw args~
    +            @velocity.y*=1.1;
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #render the ball to the screen~
    +- Inside source: true
    +*** True Line Result
    +      #render the ball to the screen
    +** Processing line: ~      def draw args~
     - Inside source: true
     *** True Line Result
           def draw args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          #update args~
    +- Inside source: true
    +*** True Line Result
    +          #update args
     ** Processing line: ~          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];
    -** Processing line: ~          args.outputs.sprites << [~
    +          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];
    +** Processing line: ~          #args.outputs.sprits << {~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.sprits << {
    +** Processing line: ~            #x: @x,~
    +- Inside source: true
    +*** True Line Result
    +            #x: @x,
    +** Processing line: ~            #y: @y,~
    +- Inside source: true
    +*** True Line Result
    +            #y: @y,
    +** Processing line: ~            #w: @width,~
    +- Inside source: true
    +*** True Line Result
    +            #w: @width,
    +** Processing line: ~            #h: @height,~
    +- Inside source: true
    +*** True Line Result
    +            #h: @height,
    +** Processing line: ~            #path: "sprites/ball10.png"~
    +- Inside source: true
    +*** True Line Result
    +            #path: "sprites/ball10.png"
    +** Processing line: ~          #}~
    +- Inside source: true
    +*** True Line Result
    +          #}
    +** Processing line: ~          #args.outputs.sprites <<[@x, @y, @width, @height, "sprites/ball10.png"]~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.sprites <<[@x, @y, @width, @height, "sprites/ball10.png"]
    +** Processing line: ~          args.outputs.sprites << {x: @x, y: @y, w: @width, h: @height, path:"sprites/ball10.png" }~
    +- Inside source: true
    +*** True Line Result
    +          args.outputs.sprites << {x: @x, y: @y, w: @width, h: @height, path:"sprites/ball10.png" }
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def getDraw args~
    +- Inside source: true
    +*** True Line Result
    +      def getDraw args
    +** Processing line: ~        #wallBounds args~
    +- Inside source: true
    +*** True Line Result
    +        #wallBounds args
    +** Processing line: ~        #update args~
    +- Inside source: true
    +*** True Line Result
    +        #update args
    +** Processing line: ~        #args.outputs.labels << [@x, @y, @number.to_s + "|" + @leastChain.to_s]~
    +- Inside source: true
    +*** True Line Result
    +        #args.outputs.labels << [@x, @y, @number.to_s + "|" + @leastChain.to_s]
    +** Processing line: ~        return [@x, @y, @width, @height, "sprites/ball10.png"]~
    +- Inside source: true
    +*** True Line Result
    +        return [@x, @y, @width, @height, "sprites/ball10.png"]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def getPoints args~
    +- Inside source: true
    +*** True Line Result
    +      def getPoints args
    +** Processing line: ~        points = [~
    +- Inside source: true
    +*** True Line Result
    +        points = [
    +** Processing line: ~          {x:@x+@width/2, y: @y},~
    +- Inside source: true
    +*** True Line Result
    +          {x:@x+@width/2, y: @y},
    +** Processing line: ~          {x:@x+@width, y:@y+@height/2},~
    +- Inside source: true
    +*** True Line Result
    +          {x:@x+@width, y:@y+@height/2},
    +** Processing line: ~          {x:@x+@width/2,y:@y+@height},~
    +- Inside source: true
    +*** True Line Result
    +          {x:@x+@width/2,y:@y+@height},
    +** Processing line: ~          {x:@x,y:@y+@height/2}~
    +- Inside source: true
    +*** True Line Result
    +          {x:@x,y:@y+@height/2}
    +** Processing line: ~        ]~
    +- Inside source: true
    +*** True Line Result
    +        ]
    +** Processing line: ~        #psize = 5.0~
    +- Inside source: true
    +*** True Line Result
    +        #psize = 5.0
    +** Processing line: ~        #for p in points~
    +- Inside source: true
    +*** True Line Result
    +        #for p in points
    +** Processing line: ~          #args.outputs.solids << [p.x-psize/2.0, p.y-psize/2.0, psize, psize, 0, 0, 0];~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.solids << [p.x-psize/2.0, p.y-psize/2.0, psize, psize, 0, 0, 0];
    +** Processing line: ~        #end~
    +- Inside source: true
    +*** True Line Result
    +        #end
    +** Processing line: ~        return points~
    +- Inside source: true
    +*** True Line Result
    +        return points
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def serialize~
    +- Inside source: true
    +*** True Line Result
    +      def serialize
    +** Processing line: ~        {x: @x, y:@y}~
    +- Inside source: true
    +*** True Line Result
    +        {x: @x, y:@y}
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def inspect~
    +- Inside source: true
    +*** True Line Result
    +      def inspect
    +** Processing line: ~        serialize.to_s~
    +- Inside source: true
    +*** True Line Result
    +        serialize.to_s
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def to_s~
    +- Inside source: true
    +*** True Line Result
    +      def to_s
    +** Processing line: ~        serialize.to_s~
    +- Inside source: true
    +*** True Line Result
    +        serialize.to_s
    +** 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: ~*** Physics And Collisions - Arbitrary Collision - blocks.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Arbitrary Collision - blocks.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/04_physics_and_collisions/09_arbitrary_collision/app/blocks.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/blocks.rb
    +** Processing line: ~  MAX_COUNT=100~
    +- Inside source: true
    +*** True Line Result
    +  MAX_COUNT=100
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  def universalUpdateOne args, shape~
    +- Inside source: true
    +*** True Line Result
    +  def universalUpdateOne args, shape
    +** Processing line: ~    didHit = false~
    +- Inside source: true
    +*** True Line Result
    +    didHit = false
    +** Processing line: ~    hitters = []~
    +- Inside source: true
    +*** True Line Result
    +    hitters = []
    +** Processing line: ~    #puts shape.to_s~
    +- Inside source: true
    +*** True Line Result
    +    #puts shape.to_s
    +** Processing line: ~    toCollide = nil~
    +- Inside source: true
    +*** True Line Result
    +    toCollide = nil
    +** Processing line: ~    for b in args.state.balls~
    +- Inside source: true
    +*** True Line Result
    +    for b in args.state.balls
    +** Processing line: ~      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)~
    +- Inside source: true
    +*** True Line Result
    +      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)
    +** Processing line: ~        didSquare = false~
    +- Inside source: true
    +*** True Line Result
    +        didSquare = false
    +** Processing line: ~        for s in shape.squareColliders~
    +- Inside source: true
    +*** True Line Result
    +        for s in shape.squareColliders
    +** Processing line: ~          if (s.collision?(args, b))~
    +- Inside source: true
    +*** True Line Result
    +          if (s.collision?(args, b))
    +** Processing line: ~            didSquare = true~
    +- Inside source: true
    +*** True Line Result
    +            didSquare = true
    +** Processing line: ~            didHit = true~
    +- Inside source: true
    +*** True Line Result
    +            didHit = true
    +** Processing line: ~            #s.collide(args, b)~
    +- Inside source: true
    +*** True Line Result
    +            #s.collide(args, b)
    +** Processing line: ~            toCollide = s~
    +- Inside source: true
    +*** True Line Result
    +            toCollide = s
    +** Processing line: ~            #hitter = b~
    +- Inside source: true
    +*** True Line Result
    +            #hitter = b
    +** Processing line: ~            hitters.append(b)~
    +- Inside source: true
    +*** True Line Result
    +            hitters.append(b)
    +** Processing line: ~          end #end if~
    +- Inside source: true
    +*** True Line Result
    +          end #end if
    +** Processing line: ~        end #end for~
    +- Inside source: true
    +*** True Line Result
    +        end #end for
    +** Processing line: ~        if (didSquare == false)~
    +- Inside source: true
    +*** True Line Result
    +        if (didSquare == false)
    +** Processing line: ~          for c in shape.colliders~
    +- Inside source: true
    +*** True Line Result
    +          for c in shape.colliders
    +** Processing line: ~            #puts args.state.ball.velocity~
    +- Inside source: true
    +*** True Line Result
    +            #puts args.state.ball.velocity
    +** Processing line: ~            if c.collision?(args, b.getPoints(args),b)~
    +- Inside source: true
    +*** True Line Result
    +            if c.collision?(args, b.getPoints(args),b)
    +** Processing line: ~              #c.collide args, b~
    +- Inside source: true
    +*** True Line Result
    +              #c.collide args, b
    +** Processing line: ~              toCollide = c~
    +- Inside source: true
    +*** True Line Result
    +              toCollide = c
    +** Processing line: ~              didHit = true~
    +- Inside source: true
    +*** True Line Result
    +              didHit = true
    +** Processing line: ~              hitters.append(b)~
    +- Inside source: true
    +*** True Line Result
    +              hitters.append(b)
    +** Processing line: ~            end #end if~
    +- Inside source: true
    +*** True Line Result
    +            end #end if
    +** Processing line: ~          end #end for~
    +- Inside source: true
    +*** True Line Result
    +          end #end for
    +** Processing line: ~        end #end if~
    +- Inside source: true
    +*** True Line Result
    +        end #end if
    +** Processing line: ~      end#end if~
    +- Inside source: true
    +*** True Line Result
    +      end#end if
    +** Processing line: ~    end#end for~
    +- Inside source: true
    +*** True Line Result
    +    end#end for
    +** Processing line: ~    if (didHit)~
    +- Inside source: true
    +*** True Line Result
    +    if (didHit)
    +** Processing line: ~      shape.count=0~
    +- Inside source: true
    +*** True Line Result
    +      shape.count=0
    +** Processing line: ~      hitters = hitters.uniq~
    +- Inside source: true
    +*** True Line Result
    +      hitters = hitters.uniq
    +** Processing line: ~      for hitter in hitters~
    +- Inside source: true
    +*** True Line Result
    +      for hitter in hitters
    +** Processing line: ~        hitter.makeLeader args~
    +- Inside source: true
    +*** True Line Result
    +        hitter.makeLeader args
    +** Processing line: ~        #toCollide.collide(args, hitter)~
    +- Inside source: true
    +*** True Line Result
    +        #toCollide.collide(args, hitter)
    +** Processing line: ~        if shape.home == "squares"~
    +- Inside source: true
    +*** True Line Result
    +        if shape.home == "squares"
    +** Processing line: ~          args.state.squares.delete(shape)~
    +- Inside source: true
    +*** True Line Result
    +          args.state.squares.delete(shape)
    +** Processing line: ~        elsif shape.home == "tshapes"~
    +- Inside source: true
    +*** True Line Result
    +        elsif shape.home == "tshapes"
    +** Processing line: ~          args.state.tshapes.delete(shape)~
    +- Inside source: true
    +*** True Line Result
    +          args.state.tshapes.delete(shape)
    +** Processing line: ~        else shape.home == "lines"~
    +- Inside source: true
    +*** True Line Result
    +        else shape.home == "lines"
    +** Processing line: ~          args.state.lines.delete(shape)~
    +- Inside source: true
    +*** True Line Result
    +          args.state.lines.delete(shape)
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #puts "HIT!" + hitter.number~
    +- Inside source: true
    +*** True Line Result
    +      #puts "HIT!" + hitter.number
    +** 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 universalUpdate args, shape~
    +- Inside source: true
    +*** True Line Result
    +  def universalUpdate args, shape
    +** Processing line: ~    #puts shape.home~
    +- Inside source: true
    +*** True Line Result
    +    #puts shape.home
    +** Processing line: ~    if (shape.count <= 1)~
    +- Inside source: true
    +*** True Line Result
    +    if (shape.count <= 1)
    +** Processing line: ~      universalUpdateOne args, shape~
    +- Inside source: true
    +*** True Line Result
    +      universalUpdateOne args, shape
    +** Processing line: ~      return~
    +- Inside source: true
    +*** True Line Result
    +      return
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    didHit = false~
    +- Inside source: true
    +*** True Line Result
    +    didHit = false
    +** Processing line: ~    hitter = nil~
    +- Inside source: true
    +*** True Line Result
    +    hitter = nil
    +** Processing line: ~    for b in args.state.ballParents~
    +- Inside source: true
    +*** True Line Result
    +    for b in args.state.ballParents
    +** Processing line: ~      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)~
    +- Inside source: true
    +*** True Line Result
    +      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)
    +** Processing line: ~        didSquare = false~
    +- Inside source: true
    +*** True Line Result
    +        didSquare = false
    +** Processing line: ~        for s in shape.squareColliders~
    +- Inside source: true
    +*** True Line Result
    +        for s in shape.squareColliders
    +** Processing line: ~          if (s.collision?(args, b))~
    +- Inside source: true
    +*** True Line Result
    +          if (s.collision?(args, b))
    +** Processing line: ~            didSquare = true~
    +- Inside source: true
    +*** True Line Result
    +            didSquare = true
    +** Processing line: ~            didHit = true~
    +- Inside source: true
    +*** True Line Result
    +            didHit = true
    +** Processing line: ~            s.collide(args, b)~
    +- Inside source: true
    +*** True Line Result
    +            s.collide(args, b)
    +** Processing line: ~            hitter = b~
    +- Inside source: true
    +*** True Line Result
    +            hitter = b
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        if (didSquare == false)~
    +- Inside source: true
    +*** True Line Result
    +        if (didSquare == false)
    +** Processing line: ~          for c in shape.colliders~
    +- Inside source: true
    +*** True Line Result
    +          for c in shape.colliders
    +** Processing line: ~            #puts args.state.ball.velocity~
    +- Inside source: true
    +*** True Line Result
    +            #puts args.state.ball.velocity
    +** Processing line: ~            if c.collision?(args, b.getPoints(args),b)~
    +- Inside source: true
    +*** True Line Result
    +            if c.collision?(args, b.getPoints(args),b)
    +** Processing line: ~              c.collide args, b~
    +- Inside source: true
    +*** True Line Result
    +              c.collide args, b
    +** Processing line: ~              didHit = true~
    +- Inside source: true
    +*** True Line Result
    +              didHit = true
    +** Processing line: ~              hitter = b~
    +- Inside source: true
    +*** True Line Result
    +              hitter = b
    +** 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: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~    if (didHit)~
    +- Inside source: true
    +*** True Line Result
    +    if (didHit)
    +** Processing line: ~      shape.count=shape.count-1~
    +- Inside source: true
    +*** True Line Result
    +      shape.count=shape.count-1
    +** Processing line: ~      shape.damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])~
    +- Inside source: true
    +*** True Line Result
    +      shape.damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~    i=0~
    +- Inside source: true
    +*** True Line Result
    +    i=0
    +** Processing line: ~    while i < shape.damageCount.length~
    +- Inside source: true
    +*** True Line Result
    +    while i < shape.damageCount.length
    +** Processing line: ~      if shape.damageCount[i][0] <= 0~
    +- Inside source: true
    +*** True Line Result
    +      if shape.damageCount[i][0] <= 0
    +** Processing line: ~        shape.damageCount.delete_at(i)~
    +- Inside source: true
    +*** True Line Result
    +        shape.damageCount.delete_at(i)
    +** Processing line: ~        i-=1~
    +- Inside source: true
    +*** True Line Result
    +        i-=1
    +** Processing line: ~      elsif shape.damageCount[i][1].elapsed_time > BALL_DISTANCE and shape.damageCount[i][0] > 1~
    +- Inside source: true
    +*** True Line Result
    +      elsif shape.damageCount[i][1].elapsed_time > BALL_DISTANCE and shape.damageCount[i][0] > 1
    +** Processing line: ~        shape.count-=1~
    +- Inside source: true
    +*** True Line Result
    +        shape.count-=1
    +** Processing line: ~        shape.damageCount[i][0]-=1~
    +- Inside source: true
    +*** True Line Result
    +        shape.damageCount[i][0]-=1
    +** Processing line: ~        shape.damageCount[i][1] = args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +        shape.damageCount[i][1] = args.state.tick_count
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      i+=1~
    +- Inside source: true
    +*** True Line Result
    +      i+=1
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  class Square~
    +- Inside source: true
    +*** True Line Result
    +  class Square
    +** Processing line: ~     attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +- Inside source: true
    +*** True Line Result
    +     attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    +** Processing line: ~     def initialize(args, x, y, block_size, orientation, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +     def initialize(args, x, y, block_size, orientation, block_offset)
    +** Processing line: ~          @x = x * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @x = x * block_size
    +** Processing line: ~          @y = y * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @y = y * block_size
    +** Processing line: ~          @block_size = block_size~
    +- Inside source: true
    +*** True Line Result
    +          @block_size = block_size
    +** Processing line: ~          @block_offset = block_offset~
    +- Inside source: true
    +*** True Line Result
    +          @block_offset = block_offset
    +** Processing line: ~          @orientation = orientation~
    +- Inside source: true
    +*** True Line Result
    +          @orientation = orientation
    +** Processing line: ~          @damageCount = []~
    +- Inside source: true
    +*** True Line Result
    +          @damageCount = []
    +** Processing line: ~          @home = 'squares'~
    +- Inside source: true
    +*** True Line Result
    +          @home = 'squares'
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          Kernel.srand()~
    +- Inside source: true
    +*** True Line Result
    +          Kernel.srand()
    +** Processing line: ~          @r = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @r = rand(255)
    +** Processing line: ~          @g = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @g = rand(255)
    +** Processing line: ~          @b = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @b = rand(255)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +- Inside source: true
    +*** True Line Result
    +          @count = rand(MAX_COUNT)+1
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    +- Inside source: true
    +*** True Line Result
    +          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    +** Processing line: ~          @x_adjusted = @x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +          @x_adjusted = @x + x_offset
    +** Processing line: ~          @y_adjusted = @y~
    +- Inside source: true
    +*** True Line Result
    +          @y_adjusted = @y
    +** Processing line: ~          @size_adjusted = @block_size * 2 - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          @size_adjusted = @block_size * 2 - @block_offset
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          hypotenuse=args.state.ball_hypotenuse~
    +- Inside source: true
    +*** True Line Result
    +          hypotenuse=args.state.ball_hypotenuse
    +** Processing line: ~          @bold = [(@x_adjusted-hypotenuse/2)-1, (@y_adjusted-hypotenuse/2)-1, @size_adjusted + hypotenuse + 2, @size_adjusted + hypotenuse + 2]~
    +- Inside source: true
    +*** True Line Result
    +          @bold = [(@x_adjusted-hypotenuse/2)-1, (@y_adjusted-hypotenuse/2)-1, @size_adjusted + hypotenuse + 2, @size_adjusted + hypotenuse + 2]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @points = [~
    +- Inside source: true
    +*** True Line Result
    +          @points = [
    +** Processing line: ~            {x:@x_adjusted, y:@y_adjusted},~
    +- Inside source: true
    +*** True Line Result
    +            {x:@x_adjusted, y:@y_adjusted},
    +** Processing line: ~            {x:@x_adjusted+@size_adjusted, y:@y_adjusted},~
    +- Inside source: true
    +*** True Line Result
    +            {x:@x_adjusted+@size_adjusted, y:@y_adjusted},
    +** Processing line: ~            {x:@x_adjusted+@size_adjusted, y:@y_adjusted+@size_adjusted},~
    +- Inside source: true
    +*** True Line Result
    +            {x:@x_adjusted+@size_adjusted, y:@y_adjusted+@size_adjusted},
    +** Processing line: ~            {x:@x_adjusted, y:@y_adjusted+@size_adjusted}~
    +- Inside source: true
    +*** True Line Result
    +            {x:@x_adjusted, y:@y_adjusted+@size_adjusted}
    +** Processing line: ~          ]~
    +- Inside source: true
    +*** True Line Result
    +          ]
    +** Processing line: ~          @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +          @squareColliders = [
    +** Processing line: ~            SquareCollider.new(@points[0].x,@points[0].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +            SquareCollider.new(@points[0].x,@points[0].y,{x:-1,y:-1}),
    +** Processing line: ~            SquareCollider.new(@points[1].x-COLLISIONWIDTH,@points[1].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +            SquareCollider.new(@points[1].x-COLLISIONWIDTH,@points[1].y,{x:1,y:-1}),
    +** Processing line: ~            SquareCollider.new(@points[2].x-COLLISIONWIDTH,@points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +            SquareCollider.new(@points[2].x-COLLISIONWIDTH,@points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~            SquareCollider.new(@points[3].x,@points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +            SquareCollider.new(@points[3].x,@points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~          ]~
    +- Inside source: true
    +*** True Line Result
    +          ]
    +** Processing line: ~          @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +          @colliders = [
    +** Processing line: ~            LinearCollider.new(@points[0],@points[1], :neg),~
    +- Inside source: true
    +*** True Line Result
    +            LinearCollider.new(@points[0],@points[1], :neg),
    +** Processing line: ~            LinearCollider.new(@points[1],@points[2], :neg),~
    +- Inside source: true
    +*** True Line Result
    +            LinearCollider.new(@points[1],@points[2], :neg),
    +** Processing line: ~            LinearCollider.new(@points[2],@points[3], :pos),~
    +- Inside source: true
    +*** True Line Result
    +            LinearCollider.new(@points[2],@points[3], :pos),
    +** Processing line: ~            LinearCollider.new(@points[0],@points[3], :pos)~
    +- Inside source: true
    +*** True Line Result
    +            LinearCollider.new(@points[0],@points[3], :pos)
    +** Processing line: ~          ]~
    +- Inside source: true
    +*** True Line Result
    +          ]
    +** Processing line: ~     end~
    +- Inside source: true
    +*** True Line Result
    +     end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~     def draw(args)~
    +- Inside source: true
    +*** True Line Result
    +     def draw(args)
    +** Processing line: ~      #Offset the coordinates to the edge of the game area~
    +- Inside source: true
    +*** True Line Result
    +      #Offset the coordinates to the edge of the game area
    +** Processing line: ~      x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    +- Inside source: true
    +*** True Line Result
    +      x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    +** Processing line: ~      #args.outputs.solids << [@x + x_offset, @y, @block_size * 2 - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.solids << [@x + x_offset, @y, @block_size * 2 - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    +** Processing line: ~      args.outputs.solids <<{x: (@x + x_offset), y: (@y), w: (@block_size * 2 - @block_offset), h: (@block_size * 2 - @block_offset), r: @r , g: @g , b: @b }~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.solids <<{x: (@x + x_offset), y: (@y), w: (@block_size * 2 - @block_offset), h: (@block_size * 2 - @block_offset), r: @r , g: @g , b: @b }
    +** Processing line: ~      #args.outputs.solids << @bold.append([255,0,0])~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.solids << @bold.append([255,0,0])
    +** Processing line: ~      args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~     end~
    +- Inside source: true
    +*** True Line Result
    +     end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~     def update args~
    +- Inside source: true
    +*** True Line Result
    +     def update args
    +** Processing line: ~       universalUpdate args, self~
    +- Inside source: true
    +*** True Line Result
    +       universalUpdate args, self
    +** 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: ~  class TShape~
    +- Inside source: true
    +*** True Line Result
    +  class TShape
    +** Processing line: ~      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +- Inside source: true
    +*** True Line Result
    +      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    +** Processing line: ~      def initialize(args, x, y, block_size, orientation, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +      def initialize(args, x, y, block_size, orientation, block_offset)
    +** Processing line: ~          @x = x * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @x = x * block_size
    +** Processing line: ~          @y = y * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @y = y * block_size
    +** Processing line: ~          @block_size = block_size~
    +- Inside source: true
    +*** True Line Result
    +          @block_size = block_size
    +** Processing line: ~          @block_offset = block_offset~
    +- Inside source: true
    +*** True Line Result
    +          @block_offset = block_offset
    +** Processing line: ~          @orientation = orientation~
    +- Inside source: true
    +*** True Line Result
    +          @orientation = orientation
    +** Processing line: ~          @damageCount = []~
    +- Inside source: true
    +*** True Line Result
    +          @damageCount = []
    +** Processing line: ~          @home = "tshapes"~
    +- Inside source: true
    +*** True Line Result
    +          @home = "tshapes"
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          Kernel.srand()~
    +- Inside source: true
    +*** True Line Result
    +          Kernel.srand()
    +** Processing line: ~          @r = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @r = rand(255)
    +** Processing line: ~          @g = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @g = rand(255)
    +** Processing line: ~          @b = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @b = rand(255)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +- Inside source: true
    +*** True Line Result
    +          @count = rand(MAX_COUNT)+1
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @shapePoints = getShapePoints(args)~
    +- Inside source: true
    +*** True Line Result
    +          @shapePoints = getShapePoints(args)
    +** Processing line: ~          minX={x:INFINITY, y:0}~
    +- Inside source: true
    +*** True Line Result
    +          minX={x:INFINITY, y:0}
    +** Processing line: ~          minY={x:0, y:INFINITY}~
    +- Inside source: true
    +*** True Line Result
    +          minY={x:0, y:INFINITY}
    +** Processing line: ~          maxX={x:-INFINITY, y:0}~
    +- Inside source: true
    +*** True Line Result
    +          maxX={x:-INFINITY, y:0}
    +** Processing line: ~          maxY={x:0, y:-INFINITY}~
    +- Inside source: true
    +*** True Line Result
    +          maxY={x:0, y:-INFINITY}
    +** Processing line: ~          for p in @shapePoints~
    +- Inside source: true
    +*** True Line Result
    +          for p in @shapePoints
    +** Processing line: ~            if p.x < minX.x~
    +- Inside source: true
    +*** True Line Result
    +            if p.x < minX.x
    +** Processing line: ~              minX = p~
    +- Inside source: true
    +*** True Line Result
    +              minX = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.x > maxX.x~
    +- Inside source: true
    +*** True Line Result
    +            if p.x > maxX.x
    +** Processing line: ~              maxX = p~
    +- Inside source: true
    +*** True Line Result
    +              maxX = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.y < minY.y~
    +- Inside source: true
    +*** True Line Result
    +            if p.y < minY.y
    +** Processing line: ~              minY = p~
    +- Inside source: true
    +*** True Line Result
    +              minY = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.y > maxY.y~
    +- Inside source: true
    +*** True Line Result
    +            if p.y > maxY.y
    +** Processing line: ~              maxY = p~
    +- Inside source: true
    +*** True Line Result
    +              maxY = p
    +** 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: ~          hypotenuse=args.state.ball_hypotenuse~
    +- Inside source: true
    +*** True Line Result
    +          hypotenuse=args.state.ball_hypotenuse
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]~
    +- Inside source: true
    +*** True Line Result
    +          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      def getShapePoints(args)~
    +- Inside source: true
    +*** True Line Result
    +      def getShapePoints(args)
    +** Processing line: ~        points=[]~
    +- Inside source: true
    +*** True Line Result
    +        points=[]
    +** Processing line: ~        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +- Inside source: true
    +*** True Line Result
    +        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        if @orientation == :right~
    +- Inside source: true
    +*** True Line Result
    +        if @orientation == :right
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]
    +** Processing line: ~            points = [~
    +- Inside source: true
    +*** True Line Result
    +            points = [
    +** Processing line: ~              {x:@x + x_offset, y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},
    +** Processing line: ~              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},
    +** Processing line: ~              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},
    +** Processing line: ~              {x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @squareColliders = [
    +** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[2].x,points[2].y-COLLISIONWIDTH,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[2].x,points[2].y-COLLISIONWIDTH,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[3].x-COLLISIONWIDTH,points[3].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[3].x-COLLISIONWIDTH,points[3].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[5].x,points[5].y,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[5].x,points[5].y,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @colliders = [
    +** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[1], :neg),
    +** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[1],points[2], :neg),
    +** Processing line: ~              LinearCollider.new(points[2],points[3], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[2],points[3], :neg),
    +** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[3],points[4], :neg),
    +** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[4],points[5], :pos),
    +** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[5],points[6], :neg),
    +** Processing line: ~              LinearCollider.new(points[6],points[7], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[6],points[7], :pos),
    +** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[7], :pos)
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~        elsif @orientation == :up~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :up
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]
    +** Processing line: ~            points = [~
    +- Inside source: true
    +*** True Line Result
    +            points = [
    +** Processing line: ~              {x:@x + x_offset, y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y},
    +** Processing line: ~              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y+(@block_size - @block_offset)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y+(@block_size - @block_offset)},
    +** Processing line: ~              {x:@x + x_offset + @block_size + @block_size, y:@y+(@block_size - @block_offset)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size + @block_size, y:@y+(@block_size - @block_offset)},
    +** Processing line: ~              {x:@x + x_offset + @block_size + @block_size, y:@y+@block_size*2},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size + @block_size, y:@y+@block_size*2},
    +** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+@block_size*2},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size, y:@y+@block_size*2},
    +** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+(@block_size - @block_offset)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size, y:@y+(@block_size - @block_offset)},
    +** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size - @block_offset)}~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y+(@block_size - @block_offset)}
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @squareColliders = [
    +** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[3].x,points[3].y,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[3].x,points[3].y,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @colliders = [
    +** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[1], :neg),
    +** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[1],points[2], :neg),
    +** Processing line: ~              LinearCollider.new(points[2],points[3], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[2],points[3], :pos),
    +** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[3],points[4], :neg),
    +** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[4],points[5], :pos),
    +** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[5],points[6], :neg),
    +** Processing line: ~              LinearCollider.new(points[6],points[7], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[6],points[7], :pos),
    +** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[7], :pos)
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~        elsif @orientation == :left~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :left
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~            xh = @x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +            xh = @x + x_offset
    +** Processing line: ~            #points = [~
    +- Inside source: true
    +*** True Line Result
    +            #points = [
    +** Processing line: ~              #{x:@x + x_offset, y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:@x + x_offset, y:@y},
    +** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y},
    +** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},
    +** Processing line: ~              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},
    +** Processing line: ~              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},
    +** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},
    +** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},
    +** Processing line: ~              #{x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}~
    +- Inside source: true
    +*** True Line Result
    +              #{x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}
    +** Processing line: ~            #]~
    +- Inside source: true
    +*** True Line Result
    +            #]
    +** Processing line: ~            points = [~
    +- Inside source: true
    +*** True Line Result
    +            points = [
    +** Processing line: ~              {x:@x + x_offset + @block_size, y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size, y:@y},
    +** Processing line: ~              {x:@x + x_offset + @block_size + (@block_size - @block_offset), y:@y},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size + (@block_size - @block_offset), y:@y},
    +** Processing line: ~              {x:@x + x_offset + @block_size + (@block_size - @block_offset),y:@y+@block_size*3- @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size + (@block_size - @block_offset),y:@y+@block_size*3- @block_offset},
    +** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+@block_size*3- @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size, y:@y+@block_size*3- @block_offset},
    +** Processing line: ~              {x:@x + x_offset+@block_size, y:@y+@block_size*2- @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+@block_size, y:@y+@block_size*2- @block_offset},
    +** Processing line: ~              {x:@x + x_offset, y:@y+@block_size*2- @block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y+@block_size*2- @block_offset},
    +** Processing line: ~              {x:@x + x_offset, y:@y+@block_size},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y+@block_size},
    +** Processing line: ~              {x:@x + x_offset+@block_size, y:@y+@block_size}~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+@block_size, y:@y+@block_size}
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @squareColliders = [
    +** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[6].x,points[6].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[6].x,points[6].y,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[7].x-COLLISIONWIDTH,points[7].y-COLLISIONWIDTH,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[7].x-COLLISIONWIDTH,points[7].y-COLLISIONWIDTH,{x:-1,y:-1}),
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @colliders = [
    +** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[1], :neg),
    +** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[1],points[2], :neg),
    +** Processing line: ~              LinearCollider.new(points[2],points[3], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[2],points[3], :pos),
    +** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[3],points[4], :neg),
    +** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[4],points[5], :pos),
    +** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[5],points[6], :neg),
    +** Processing line: ~              LinearCollider.new(points[6],points[7], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[6],points[7], :neg),
    +** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[7], :pos)
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~        elsif @orientation == :down~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :down
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~            points = [~
    +- Inside source: true
    +*** True Line Result
    +            points = [
    +** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size*2)-@block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y+(@block_size*2)-@block_offset},
    +** Processing line: ~              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size*2)-@block_offset},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size*2)-@block_offset},
    +** Processing line: ~              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size)},
    +** Processing line: ~              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y+(@block_size)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y+(@block_size)},
    +** Processing line: ~              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y},#~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y},#
    +** Processing line: ~              {x:@x + x_offset+ @block_size, y:@y},#~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset+ @block_size, y:@y},#
    +** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+(@block_size)},~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset + @block_size, y:@y+(@block_size)},
    +** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size)}~
    +- Inside source: true
    +*** True Line Result
    +              {x:@x + x_offset, y:@y+(@block_size)}
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @squareColliders = [
    +** Processing line: ~              SquareCollider.new(points[0].x,points[0].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[0].x,points[0].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[5].x,points[5].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[5].x,points[5].y,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:-1,y:-1}),
    +** Processing line: ~              SquareCollider.new(points[7].x,points[7].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +              SquareCollider.new(points[7].x,points[7].y,{x:-1,y:-1}),
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~            @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +            @colliders = [
    +** Processing line: ~              LinearCollider.new(points[0],points[1], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[1], :pos),
    +** Processing line: ~              LinearCollider.new(points[1],points[2], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[1],points[2], :pos),
    +** Processing line: ~              LinearCollider.new(points[2],points[3], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[2],points[3], :neg),
    +** Processing line: ~              LinearCollider.new(points[3],points[4], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[3],points[4], :pos),
    +** Processing line: ~              LinearCollider.new(points[4],points[5], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[4],points[5], :neg),
    +** Processing line: ~              LinearCollider.new(points[5],points[6], :pos),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[5],points[6], :pos),
    +** Processing line: ~              LinearCollider.new(points[6],points[7], :neg),~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[6],points[7], :neg),
    +** Processing line: ~              LinearCollider.new(points[0],points[7], :neg)~
    +- Inside source: true
    +*** True Line Result
    +              LinearCollider.new(points[0],points[7], :neg)
    +** Processing line: ~            ]~
    +- Inside source: true
    +*** True Line Result
    +            ]
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        return points~
    +- Inside source: true
    +*** True Line Result
    +        return points
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def draw(args)~
    +- Inside source: true
    +*** True Line Result
    +      def draw(args)
    +** Processing line: ~          #Offset the coordinates to the edge of the game area~
    +- Inside source: true
    +*** True Line Result
    +          #Offset the coordinates to the edge of the game area
    +** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +- Inside source: true
    +*** True Line Result
    +          x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          if @orientation == :right~
    +- Inside source: true
    +*** True Line Result
    +          if @orientation == :right
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: @y, w: @block_size - @block_offset, h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset), y: @y, w: @block_size - @block_offset, h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2), h: (@block_size), r: @r , g: @g, b: @b }~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2), h: (@block_size), r: @r , g: @g, b: @b }
    +** Processing line: ~          elsif @orientation == :up~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :up
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset), y: (@y), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size), h: (@block_size * 2), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size), h: (@block_size * 2), r: @r , g: @g, b: @b}
    +** Processing line: ~          elsif @orientation == :left~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :left
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~          elsif @orientation == :down~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :down
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    +** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: ( @block_size * 2 - @block_offset), r: @r , g: @g, b: @b}~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: ( @block_size * 2 - @block_offset), r: @r , g: @g, b: @b}
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          #psize = 5.0~
    +- Inside source: true
    +*** True Line Result
    +          #psize = 5.0
    +** Processing line: ~          #for p in @shapePoints~
    +- Inside source: true
    +*** True Line Result
    +          #for p in @shapePoints
    +** Processing line: ~            #args.outputs.solids << [p.x-psize/2, p.y-psize/2, psize, psize, 0, 0, 0]~
    +- Inside source: true
    +*** True Line Result
    +            #args.outputs.solids << [p.x-psize/2, p.y-psize/2, psize, psize, 0, 0, 0]
    +** Processing line: ~          #end~
    +- Inside source: true
    +*** True Line Result
    +          #end
    +** Processing line: ~          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +- Inside source: true
    +*** True Line Result
    +          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def updateOne_old args~
    +- Inside source: true
    +*** True Line Result
    +      def updateOne_old args
    +** Processing line: ~        didHit = false~
    +- Inside source: true
    +*** True Line Result
    +        didHit = false
    +** Processing line: ~        hitter = nil~
    +- Inside source: true
    +*** True Line Result
    +        hitter = nil
    +** Processing line: ~        toCollide = nil~
    +- Inside source: true
    +*** True Line Result
    +        toCollide = nil
    +** Processing line: ~        for b in args.state.balls~
    +- Inside source: true
    +*** True Line Result
    +        for b in args.state.balls
    +** Processing line: ~          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)~
    +- Inside source: true
    +*** True Line Result
    +          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    +** Processing line: ~            didSquare = false~
    +- Inside source: true
    +*** True Line Result
    +            didSquare = false
    +** Processing line: ~            for s in @squareColliders~
    +- Inside source: true
    +*** True Line Result
    +            for s in @squareColliders
    +** Processing line: ~              if (s.collision?(args, b))~
    +- Inside source: true
    +*** True Line Result
    +              if (s.collision?(args, b))
    +** Processing line: ~                didSquare = true~
    +- Inside source: true
    +*** True Line Result
    +                didSquare = true
    +** Processing line: ~                didHit = true~
    +- Inside source: true
    +*** True Line Result
    +                didHit = true
    +** Processing line: ~                #s.collide(args, b)~
    +- Inside source: true
    +*** True Line Result
    +                #s.collide(args, b)
    +** Processing line: ~                toCollide = s~
    +- Inside source: true
    +*** True Line Result
    +                toCollide = s
    +** Processing line: ~                hitter = b~
    +- Inside source: true
    +*** True Line Result
    +                hitter = b
    +** Processing line: ~                break~
    +- Inside source: true
    +*** True Line Result
    +                break
    +** Processing line: ~              end~
    +- Inside source: true
    +*** True Line Result
    +              end
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if (didSquare == false)~
    +- Inside source: true
    +*** True Line Result
    +            if (didSquare == false)
    +** Processing line: ~              for c in @colliders~
    +- Inside source: true
    +*** True Line Result
    +              for c in @colliders
    +** Processing line: ~                #puts args.state.ball.velocity~
    +- Inside source: true
    +*** True Line Result
    +                #puts args.state.ball.velocity
    +** Processing line: ~                if c.collision?(args, b.getPoints(args),b)~
    +- Inside source: true
    +*** True Line Result
    +                if c.collision?(args, b.getPoints(args),b)
    +** Processing line: ~                  #c.collide args, b~
    +- Inside source: true
    +*** True Line Result
    +                  #c.collide args, b
    +** Processing line: ~                  toCollide = c~
    +- Inside source: true
    +*** True Line Result
    +                  toCollide = c
    +** Processing line: ~                  didHit = true~
    +- Inside source: true
    +*** True Line Result
    +                  didHit = true
    +** Processing line: ~                  hitter = b~
    +- Inside source: true
    +*** True Line Result
    +                  hitter = b
    +** Processing line: ~                  break~
    +- Inside source: true
    +*** True Line Result
    +                  break
    +** 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: ~          if didHit~
    +- Inside source: true
    +*** True Line Result
    +          if didHit
    +** Processing line: ~            break~
    +- Inside source: true
    +*** True Line Result
    +            break
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        if (didHit)~
    +- Inside source: true
    +*** True Line Result
    +        if (didHit)
    +** Processing line: ~          @count=0~
    +- Inside source: true
    +*** True Line Result
    +          @count=0
    +** Processing line: ~          hitter.makeLeader args~
    +- Inside source: true
    +*** True Line Result
    +          hitter.makeLeader args
    +** Processing line: ~          #toCollide.collide(args, hitter)~
    +- Inside source: true
    +*** True Line Result
    +          #toCollide.collide(args, hitter)
    +** Processing line: ~          args.state.tshapes.delete(self)~
    +- Inside source: true
    +*** True Line Result
    +          args.state.tshapes.delete(self)
    +** Processing line: ~          #puts "HIT!" + hitter.number~
    +- Inside source: true
    +*** True Line Result
    +          #puts "HIT!" + hitter.number
    +** 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 update_old args~
    +- Inside source: true
    +*** True Line Result
    +      def update_old args
    +** Processing line: ~        if (@count == 1)~
    +- Inside source: true
    +*** True Line Result
    +        if (@count == 1)
    +** Processing line: ~          updateOne args~
    +- Inside source: true
    +*** True Line Result
    +          updateOne args
    +** Processing line: ~          return~
    +- Inside source: true
    +*** True Line Result
    +          return
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        didHit = false~
    +- Inside source: true
    +*** True Line Result
    +        didHit = false
    +** Processing line: ~        hitter = nil~
    +- Inside source: true
    +*** True Line Result
    +        hitter = nil
    +** Processing line: ~        for b in args.state.ballParents~
    +- Inside source: true
    +*** True Line Result
    +        for b in args.state.ballParents
    +** Processing line: ~          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)~
    +- Inside source: true
    +*** True Line Result
    +          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    +** Processing line: ~            didSquare = false~
    +- Inside source: true
    +*** True Line Result
    +            didSquare = false
    +** Processing line: ~            for s in @squareColliders~
    +- Inside source: true
    +*** True Line Result
    +            for s in @squareColliders
    +** Processing line: ~              if (s.collision?(args, b))~
    +- Inside source: true
    +*** True Line Result
    +              if (s.collision?(args, b))
    +** Processing line: ~                didSquare = true~
    +- Inside source: true
    +*** True Line Result
    +                didSquare = true
    +** Processing line: ~                didHit=true~
    +- Inside source: true
    +*** True Line Result
    +                didHit=true
    +** Processing line: ~                s.collide(args, b)~
    +- Inside source: true
    +*** True Line Result
    +                s.collide(args, b)
    +** Processing line: ~                hitter = b~
    +- Inside source: true
    +*** True Line Result
    +                hitter = b
    +** Processing line: ~              end~
    +- Inside source: true
    +*** True Line Result
    +              end
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if (didSquare == false)~
    +- Inside source: true
    +*** True Line Result
    +            if (didSquare == false)
    +** Processing line: ~              for c in @colliders~
    +- Inside source: true
    +*** True Line Result
    +              for c in @colliders
    +** Processing line: ~                #puts args.state.ball.velocity~
    +- Inside source: true
    +*** True Line Result
    +                #puts args.state.ball.velocity
    +** Processing line: ~                if c.collision?(args, b.getPoints(args), b)~
    +- Inside source: true
    +*** True Line Result
    +                if c.collision?(args, b.getPoints(args), b)
    +** Processing line: ~                  c.collide args, b~
    +- Inside source: true
    +*** True Line Result
    +                  c.collide args, b
    +** Processing line: ~                  didHit=true~
    +- Inside source: true
    +*** True Line Result
    +                  didHit=true
    +** Processing line: ~                  hitter = b~
    +- Inside source: true
    +*** True Line Result
    +                  hitter = b
    +** 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: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        if (didHit)~
    +- Inside source: true
    +*** True Line Result
    +        if (didHit)
    +** Processing line: ~          @count=@count-1~
    +- Inside source: true
    +*** True Line Result
    +          @count=@count-1
    +** Processing line: ~          @damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])~
    +- Inside source: true
    +*** True Line Result
    +          @damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          if (@count == 0)~
    +- Inside source: true
    +*** True Line Result
    +          if (@count == 0)
    +** Processing line: ~            args.state.tshapes.delete(self)~
    +- Inside source: true
    +*** True Line Result
    +            args.state.tshapes.delete(self)
    +** 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: ~        i=0~
    +- Inside source: true
    +*** True Line Result
    +        i=0
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        while i < @damageCount.length~
    +- Inside source: true
    +*** True Line Result
    +        while i < @damageCount.length
    +** Processing line: ~          if @damageCount[i][0] <= 0~
    +- Inside source: true
    +*** True Line Result
    +          if @damageCount[i][0] <= 0
    +** Processing line: ~            @damageCount.delete_at(i)~
    +- Inside source: true
    +*** True Line Result
    +            @damageCount.delete_at(i)
    +** Processing line: ~            i-=1~
    +- Inside source: true
    +*** True Line Result
    +            i-=1
    +** Processing line: ~          elsif @damageCount[i][1].elapsed_time > BALL_DISTANCE~
    +- Inside source: true
    +*** True Line Result
    +          elsif @damageCount[i][1].elapsed_time > BALL_DISTANCE
    +** Processing line: ~            @count-=1~
    +- Inside source: true
    +*** True Line Result
    +            @count-=1
    +** Processing line: ~            @damageCount[i][0]-=1~
    +- Inside source: true
    +*** True Line Result
    +            @damageCount[i][0]-=1
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~          if (@count == 0)~
    +- Inside source: true
    +*** True Line Result
    +          if (@count == 0)
    +** Processing line: ~            args.state.tshapes.delete(self)~
    +- Inside source: true
    +*** True Line Result
    +            args.state.tshapes.delete(self)
    +** Processing line: ~            return~
    +- Inside source: true
    +*** True Line Result
    +            return
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~          i+=1~
    +- Inside source: true
    +*** True Line Result
    +          i+=1
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end #end update~
    +- Inside source: true
    +*** True Line Result
    +      end #end update
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def update args~
    +- Inside source: true
    +*** True Line Result
    +      def update args
    +** Processing line: ~        universalUpdate args, self~
    +- Inside source: true
    +*** True Line Result
    +        universalUpdate args, self
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  class Line~
    +- Inside source: true
    +*** True Line Result
    +  class Line
    +** Processing line: ~      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +- Inside source: true
    +*** True Line Result
    +      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    +** Processing line: ~      def initialize(args, x, y, block_size, orientation, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +      def initialize(args, x, y, block_size, orientation, block_offset)
    +** Processing line: ~          @x = x * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @x = x * block_size
    +** Processing line: ~          @y = y * block_size~
    +- Inside source: true
    +*** True Line Result
    +          @y = y * block_size
    +** Processing line: ~          @block_size = block_size~
    +- Inside source: true
    +*** True Line Result
    +          @block_size = block_size
    +** Processing line: ~          @block_offset = block_offset~
    +- Inside source: true
    +*** True Line Result
    +          @block_offset = block_offset
    +** Processing line: ~          @orientation = orientation~
    +- Inside source: true
    +*** True Line Result
    +          @orientation = orientation
    +** Processing line: ~          @damageCount = []~
    +- Inside source: true
    +*** True Line Result
    +          @damageCount = []
    +** Processing line: ~          @home = "lines"~
    +- Inside source: true
    +*** True Line Result
    +          @home = "lines"
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          Kernel.srand()~
    +- Inside source: true
    +*** True Line Result
    +          Kernel.srand()
    +** Processing line: ~          @r = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @r = rand(255)
    +** Processing line: ~          @g = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @g = rand(255)
    +** Processing line: ~          @b = rand(255)~
    +- Inside source: true
    +*** True Line Result
    +          @b = rand(255)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +- Inside source: true
    +*** True Line Result
    +          @count = rand(MAX_COUNT)+1
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @shapePoints = getShapePoints(args)~
    +- Inside source: true
    +*** True Line Result
    +          @shapePoints = getShapePoints(args)
    +** Processing line: ~          minX={x:INFINITY, y:0}~
    +- Inside source: true
    +*** True Line Result
    +          minX={x:INFINITY, y:0}
    +** Processing line: ~          minY={x:0, y:INFINITY}~
    +- Inside source: true
    +*** True Line Result
    +          minY={x:0, y:INFINITY}
    +** Processing line: ~          maxX={x:-INFINITY, y:0}~
    +- Inside source: true
    +*** True Line Result
    +          maxX={x:-INFINITY, y:0}
    +** Processing line: ~          maxY={x:0, y:-INFINITY}~
    +- Inside source: true
    +*** True Line Result
    +          maxY={x:0, y:-INFINITY}
    +** Processing line: ~          for p in @shapePoints~
    +- Inside source: true
    +*** True Line Result
    +          for p in @shapePoints
    +** Processing line: ~            if p.x < minX.x~
    +- Inside source: true
    +*** True Line Result
    +            if p.x < minX.x
    +** Processing line: ~              minX = p~
    +- Inside source: true
    +*** True Line Result
    +              minX = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.x > maxX.x~
    +- Inside source: true
    +*** True Line Result
    +            if p.x > maxX.x
    +** Processing line: ~              maxX = p~
    +- Inside source: true
    +*** True Line Result
    +              maxX = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.y < minY.y~
    +- Inside source: true
    +*** True Line Result
    +            if p.y < minY.y
    +** Processing line: ~              minY = p~
    +- Inside source: true
    +*** True Line Result
    +              minY = p
    +** Processing line: ~            end~
    +- Inside source: true
    +*** True Line Result
    +            end
    +** Processing line: ~            if p.y > maxY.y~
    +- Inside source: true
    +*** True Line Result
    +            if p.y > maxY.y
    +** Processing line: ~              maxY = p~
    +- Inside source: true
    +*** True Line Result
    +              maxY = p
    +** 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: ~          hypotenuse=args.state.ball_hypotenuse~
    +- Inside source: true
    +*** True Line Result
    +          hypotenuse=args.state.ball_hypotenuse
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]~
    +- Inside source: true
    +*** True Line Result
    +          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def getShapePoints(args)~
    +- Inside source: true
    +*** True Line Result
    +      def getShapePoints(args)
    +** Processing line: ~        points=[]~
    +- Inside source: true
    +*** True Line Result
    +        points=[]
    +** Processing line: ~        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +- Inside source: true
    +*** True Line Result
    +        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        if @orientation == :right~
    +- Inside source: true
    +*** True Line Result
    +        if @orientation == :right
    +** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~          xa =@x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +          xa =@x + x_offset
    +** Processing line: ~          ya =@y~
    +- Inside source: true
    +*** True Line Result
    +          ya =@y
    +** Processing line: ~          wa =@block_size * 3 - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          wa =@block_size * 3 - @block_offset
    +** Processing line: ~          ha =(@block_size - @block_offset)~
    +- Inside source: true
    +*** True Line Result
    +          ha =(@block_size - @block_offset)
    +** Processing line: ~        elsif @orientation == :up~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :up
    +** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~          xa =@x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +          xa =@x + x_offset
    +** Processing line: ~          ya =@y~
    +- Inside source: true
    +*** True Line Result
    +          ya =@y
    +** Processing line: ~          wa =@block_size - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          wa =@block_size - @block_offset
    +** Processing line: ~          ha =@block_size * 3 - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          ha =@block_size * 3 - @block_offset
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        elsif @orientation == :left~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :left
    +** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~          xa =@x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +          xa =@x + x_offset
    +** Processing line: ~          ya =@y~
    +- Inside source: true
    +*** True Line Result
    +          ya =@y
    +** Processing line: ~          wa =@block_size * 3 - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          wa =@block_size * 3 - @block_offset
    +** Processing line: ~          ha =@block_size - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          ha =@block_size - @block_offset
    +** Processing line: ~        elsif @orientation == :down~
    +- Inside source: true
    +*** True Line Result
    +        elsif @orientation == :down
    +** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~          xa =@x + x_offset~
    +- Inside source: true
    +*** True Line Result
    +          xa =@x + x_offset
    +** Processing line: ~          ya =@y~
    +- Inside source: true
    +*** True Line Result
    +          ya =@y
    +** Processing line: ~          wa =@block_size - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          wa =@block_size - @block_offset
    +** Processing line: ~          ha =@block_size * 3 - @block_offset~
    +- Inside source: true
    +*** True Line Result
    +          ha =@block_size * 3 - @block_offset
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~        points = [~
    +- Inside source: true
    +*** True Line Result
    +        points = [
    +** Processing line: ~          {x: xa, y:ya},~
    +- Inside source: true
    +*** True Line Result
    +          {x: xa, y:ya},
    +** Processing line: ~          {x: xa + wa,y:ya},~
    +- Inside source: true
    +*** True Line Result
    +          {x: xa + wa,y:ya},
    +** Processing line: ~          {x: xa + wa,y:ya+ha},~
    +- Inside source: true
    +*** True Line Result
    +          {x: xa + wa,y:ya+ha},
    +** Processing line: ~          {x: xa, y:ya+ha},~
    +- Inside source: true
    +*** True Line Result
    +          {x: xa, y:ya+ha},
    +** Processing line: ~        ]~
    +- Inside source: true
    +*** True Line Result
    +        ]
    +** Processing line: ~        @squareColliders = [~
    +- Inside source: true
    +*** True Line Result
    +        @squareColliders = [
    +** Processing line: ~          SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +          SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    +** Processing line: ~          SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +- Inside source: true
    +*** True Line Result
    +          SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    +** Processing line: ~          SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +          SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    +** Processing line: ~          SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +- Inside source: true
    +*** True Line Result
    +          SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    +** Processing line: ~        ]~
    +- Inside source: true
    +*** True Line Result
    +        ]
    +** Processing line: ~        @colliders = [~
    +- Inside source: true
    +*** True Line Result
    +        @colliders = [
    +** Processing line: ~          LinearCollider.new(points[0],points[1], :neg),~
    +- Inside source: true
    +*** True Line Result
    +          LinearCollider.new(points[0],points[1], :neg),
    +** Processing line: ~          LinearCollider.new(points[1],points[2], :neg),~
    +- Inside source: true
    +*** True Line Result
    +          LinearCollider.new(points[1],points[2], :neg),
    +** Processing line: ~          LinearCollider.new(points[2],points[3], :pos),~
    +- Inside source: true
    +*** True Line Result
    +          LinearCollider.new(points[2],points[3], :pos),
    +** Processing line: ~          LinearCollider.new(points[0],points[3], :pos),~
    +- Inside source: true
    +*** True Line Result
    +          LinearCollider.new(points[0],points[3], :pos),
    +** Processing line: ~        ]~
    +- Inside source: true
    +*** True Line Result
    +        ]
    +** Processing line: ~        return points~
    +- Inside source: true
    +*** True Line Result
    +        return points
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def update args~
    +- Inside source: true
    +*** True Line Result
    +      def update args
    +** Processing line: ~        universalUpdate args, self~
    +- Inside source: true
    +*** True Line Result
    +        universalUpdate args, self
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      def draw(args)~
    +- Inside source: true
    +*** True Line Result
    +      def draw(args)
    +** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    +- Inside source: true
    +*** True Line Result
    +          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          if @orientation == :right~
    +- Inside source: true
    +*** True Line Result
    +          if @orientation == :right
    +** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~          elsif @orientation == :up~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :up
    +** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~          elsif @orientation == :left~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :left
    +** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    +** Processing line: ~          elsif @orientation == :down~
    +- Inside source: true
    +*** True Line Result
    +          elsif @orientation == :down
    +** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +- Inside source: true
    +*** True Line Result
    +              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +- Inside source: true
    +*** True Line Result
    +          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~#+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: ~*** Physics And Collisions - Arbitrary Collision - linear_collider.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Arbitrary Collision - linear_collider.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/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  COLLISIONWIDTH=8~
    +- Inside source: true
    +*** True Line Result
    +  COLLISIONWIDTH=8
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  class LinearCollider~
    +- Inside source: true
    +*** True Line Result
    +  class LinearCollider
    +** Processing line: ~    attr_reader :pointA, :pointB~
    +- Inside source: true
    +*** True Line Result
    +    attr_reader :pointA, :pointB
    +** Processing line: ~    def initialize (pointA, pointB, mode,collisionWidth=COLLISIONWIDTH)~
    +- Inside source: true
    +*** True Line Result
    +    def initialize (pointA, pointB, mode,collisionWidth=COLLISIONWIDTH)
    +** Processing line: ~      @pointA = pointA~
    +- Inside source: true
    +*** True Line Result
    +      @pointA = pointA
    +** Processing line: ~      @pointB = pointB~
    +- Inside source: true
    +*** True Line Result
    +      @pointB = pointB
    +** Processing line: ~      @mode = mode~
    +- Inside source: true
    +*** True Line Result
    +      @mode = mode
    +** Processing line: ~      @collisionWidth = collisionWidth~
    +- Inside source: true
    +*** True Line Result
    +      @collisionWidth = collisionWidth
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if (@pointA.x > @pointB.x)~
    +- Inside source: true
    +*** True Line Result
    +      if (@pointA.x > @pointB.x)
    +** Processing line: ~        @pointA, @pointB = @pointB, @pointA~
    +- Inside source: true
    +*** True Line Result
    +        @pointA, @pointB = @pointB, @pointA
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @linearCollider_collision_once = false~
    +- Inside source: true
    +*** True Line Result
    +      @linearCollider_collision_once = false
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def collisionSlope args~
    +- Inside source: true
    +*** True Line Result
    +    def collisionSlope args
    +** Processing line: ~      if (@pointB.x-@pointA.x == 0)~
    +- Inside source: true
    +*** True Line Result
    +      if (@pointB.x-@pointA.x == 0)
    +** Processing line: ~        return INFINITY~
    +- Inside source: true
    +*** True Line Result
    +        return INFINITY
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)~
    +- Inside source: true
    +*** True Line Result
    +      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)
    +** 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: ~    def collision? (args, points, ball=nil)~
    +- Inside source: true
    +*** True Line Result
    +    def collision? (args, points, ball=nil)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      slope = collisionSlope args~
    +- Inside source: true
    +*** True Line Result
    +      slope = collisionSlope args
    +** Processing line: ~      result = false~
    +- Inside source: true
    +*** True Line Result
    +      result = false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line~
    +- Inside source: true
    +*** True Line Result
    +      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line
    +** Processing line: ~      vect=nil;mag=nil;vect=nil;~
    +- Inside source: true
    +*** True Line Result
    +      vect=nil;mag=nil;vect=nil;
    +** Processing line: ~      if @mode == :both~
    +- Inside source: true
    +*** True Line Result
    +      if @mode == :both
    +** Processing line: ~        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +- Inside source: true
    +*** True Line Result
    +        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +** Processing line: ~        mag  = (vect.x**2 + vect.y**2)**0.5~
    +- Inside source: true
    +*** True Line Result
    +        mag  = (vect.x**2 + vect.y**2)**0.5
    +** Processing line: ~        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}~
    +- Inside source: true
    +*** True Line Result
    +        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}
    +** Processing line: ~      else~
    +- Inside source: true
    +*** True Line Result
    +      else
    +** Processing line: ~        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +- Inside source: true
    +*** True Line Result
    +        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +** Processing line: ~        mag  = (vect.x**2 + vect.y**2)**0.5~
    +- Inside source: true
    +*** True Line Result
    +        mag  = (vect.x**2 + vect.y**2)**0.5
    +** Processing line: ~        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}~
    +- Inside source: true
    +*** True Line Result
    +        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;~
    +- Inside source: true
    +*** True Line Result
    +      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;
    +** Processing line: ~      if @mode == :pos~
    +- Inside source: true
    +*** True Line Result
    +      if @mode == :pos
    +** Processing line: ~        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    +** Processing line: ~        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    +** Processing line: ~        rpointC = {x:@pointB.x, y:@pointB.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointC = {x:@pointB.x, y:@pointB.y}
    +** Processing line: ~        rpointD = {x:@pointA.x, y:@pointA.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointD = {x:@pointA.x, y:@pointA.y}
    +** Processing line: ~      elsif @mode == :neg~
    +- Inside source: true
    +*** True Line Result
    +      elsif @mode == :neg
    +** Processing line: ~        rpointA = {x:@pointA.x, y:@pointA.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointA = {x:@pointA.x, y:@pointA.y}
    +** Processing line: ~        rpointB = {x:@pointB.x, y:@pointB.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointB = {x:@pointB.x, y:@pointB.y}
    +** Processing line: ~        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    +** Processing line: ~        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    +** Processing line: ~      elsif @mode == :both~
    +- Inside source: true
    +*** True Line Result
    +      elsif @mode == :both
    +** Processing line: ~        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    +** Processing line: ~        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    +** Processing line: ~        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    +** Processing line: ~        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}~
    +- Inside source: true
    +*** True Line Result
    +        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      #four point rectangle~
    +- Inside source: true
    +*** True Line Result
    +      #four point rectangle
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if ball != nil~
    +- Inside source: true
    +*** True Line Result
    +      if ball != nil
    +** Processing line: ~        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]~
    +- Inside source: true
    +*** True Line Result
    +        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]
    +** Processing line: ~        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]~
    +- Inside source: true
    +*** True Line Result
    +        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]
    +** Processing line: ~        correct = 1~
    +- Inside source: true
    +*** True Line Result
    +        correct = 1
    +** Processing line: ~        rect1 = [ball.x, ball.y, ball.width, ball.height]~
    +- Inside source: true
    +*** True Line Result
    +        rect1 = [ball.x, ball.y, ball.width, ball.height]
    +** Processing line: ~        #$r1 = rect1~
    +- Inside source: true
    +*** True Line Result
    +        #$r1 = rect1
    +** Processing line: ~        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]~
    +- Inside source: true
    +*** True Line Result
    +        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]
    +** Processing line: ~        #$r2 = rect2~
    +- Inside source: true
    +*** True Line Result
    +        #$r2 = rect2
    +** Processing line: ~        if rect1.intersect_rect?(rect2) == false~
    +- Inside source: true
    +*** True Line Result
    +        if rect1.intersect_rect?(rect2) == false
    +** Processing line: ~          return false~
    +- Inside source: true
    +*** True Line Result
    +          return false
    +** 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: ~      #area of a triangle~
    +- Inside source: true
    +*** True Line Result
    +      #area of a triangle
    +** Processing line: ~      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }~
    +- Inside source: true
    +*** True Line Result
    +      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #if at least on point is in the rectangle then collision? is true - otherwise false~
    +- Inside source: true
    +*** True Line Result
    +      #if at least on point is in the rectangle then collision? is true - otherwise false
    +** Processing line: ~      for point in points~
    +- Inside source: true
    +*** True Line Result
    +      for point in points
    +** Processing line: ~        #Check whether a given point lies inside a rectangle or not:~
    +- Inside source: true
    +*** True Line Result
    +        #Check whether a given point lies inside a rectangle or not:
    +** Processing line: ~        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured~
    +- Inside source: true
    +*** True Line Result
    +        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured
    +** Processing line: ~        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)~
    +- Inside source: true
    +*** True Line Result
    +        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)
    +** Processing line: ~        areaSum = [~
    +- Inside source: true
    +*** True Line Result
    +        areaSum = [
    +** Processing line: ~          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),~
    +- Inside source: true
    +*** True Line Result
    +          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),
    +** Processing line: ~          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)~
    +- Inside source: true
    +*** True Line Result
    +          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)
    +** Processing line: ~        ].inject(0){|sum,x| sum + x }~
    +- Inside source: true
    +*** True Line Result
    +        ].inject(0){|sum,x| sum + x }
    +** Processing line: ~        e = 0.0001 #allow for minor error~
    +- Inside source: true
    +*** True Line Result
    +        e = 0.0001 #allow for minor error
    +** Processing line: ~        if areaRec>= areaSum-e and areaRec<= areaSum+e~
    +- Inside source: true
    +*** True Line Result
    +        if areaRec>= areaSum-e and areaRec<= areaSum+e
    +** Processing line: ~          result = true~
    +- Inside source: true
    +*** True Line Result
    +          result = true
    +** Processing line: ~          #return true~
    +- Inside source: true
    +*** True Line Result
    +          #return true
    +** Processing line: ~          break~
    +- Inside source: true
    +*** True Line Result
    +          break
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]
    +** Processing line: ~      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]
    +** Processing line: ~      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)~
    +- Inside source: true
    +*** True Line Result
    +      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)
    +** Processing line: ~      return result~
    +- Inside source: true
    +*** True Line Result
    +      return result
    +** Processing line: ~    end #end collision?~
    +- Inside source: true
    +*** True Line Result
    +    end #end collision?
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)~
    +- Inside source: true
    +*** True Line Result
    +    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)
    +** Processing line: ~      a = fbx ; b = vrx ; c = fby~
    +- Inside source: true
    +*** True Line Result
    +      a = fbx ; b = vrx ; c = fby
    +** Processing line: ~      d = vry ; e = ballMag~
    +- Inside source: true
    +*** True Line Result
    +      d = vry ; e = ballMag
    +** Processing line: ~      if b**2 + d**2 == 0~
    +- Inside source: true
    +*** True Line Result
    +      if b**2 + d**2 == 0
    +** Processing line: ~        #unexpected~
    +- Inside source: true
    +*** True Line Result
    +        #unexpected
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
    +- Inside source: true
    +*** True Line Result
    +      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    +** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
    +- Inside source: true
    +*** True Line Result
    +      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    +** Processing line: ~      err = 0.00001~
    +- Inside source: true
    +*** True Line Result
    +      err = 0.00001
    +** Processing line: ~      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5~
    +- Inside source: true
    +*** True Line Result
    +      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    +** Processing line: ~      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5~
    +- Inside source: true
    +*** True Line Result
    +      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    +** Processing line: ~      r = 0~
    +- Inside source: true
    +*** True Line Result
    +      r = 0
    +** Processing line: ~      if (ballMag >= o-err and ballMag <= o+err)~
    +- Inside source: true
    +*** True Line Result
    +      if (ballMag >= o-err and ballMag <= o+err)
    +** Processing line: ~        r = x1~
    +- Inside source: true
    +*** True Line Result
    +        r = x1
    +** Processing line: ~      elsif (ballMag >= p-err and ballMag <= p+err)~
    +- Inside source: true
    +*** True Line Result
    +      elsif (ballMag >= p-err and ballMag <= p+err)
    +** Processing line: ~        r = x2~
    +- Inside source: true
    +*** True Line Result
    +        r = x2
    +** Processing line: ~      else~
    +- Inside source: true
    +*** True Line Result
    +      else
    +** Processing line: ~        #unexpected~
    +- Inside source: true
    +*** True Line Result
    +        #unexpected
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      return r~
    +- Inside source: true
    +*** True Line Result
    +      return r
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def collide args, ball~
    +- Inside source: true
    +*** True Line Result
    +    def collide args, ball
    +** Processing line: ~      slope = collisionSlope args~
    +- Inside source: true
    +*** True Line Result
    +      slope = collisionSlope args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      # perpVect: normal vector perpendicular to collision~
    +- Inside source: true
    +*** True Line Result
    +      # perpVect: normal vector perpendicular to collision
    +** Processing line: ~      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +- Inside source: true
    +*** True Line Result
    +      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    +** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5~
    +- Inside source: true
    +*** True Line Result
    +      mag  = (perpVect.x**2 + perpVect.y**2)**0.5
    +** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}~
    +- Inside source: true
    +*** True Line Result
    +      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}
    +** Processing line: ~      perpVect = {x: -perpVect.y, y: perpVect.x}~
    +- Inside source: true
    +*** True Line Result
    +      perpVect = {x: -perpVect.y, y: perpVect.x}
    +** Processing line: ~      if perpVect.y > 0 #ensure perpVect points upward~
    +- Inside source: true
    +*** True Line Result
    +      if perpVect.y > 0 #ensure perpVect points upward
    +** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +- Inside source: true
    +*** True Line Result
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      previousPosition = {~
    +- Inside source: true
    +*** True Line Result
    +      previousPosition = {
    +** Processing line: ~        x:ball.x-ball.velocity.x,~
    +- Inside source: true
    +*** True Line Result
    +        x:ball.x-ball.velocity.x,
    +** Processing line: ~        y:ball.y-ball.velocity.y~
    +- Inside source: true
    +*** True Line Result
    +        y:ball.y-ball.velocity.y
    +** Processing line: ~      }~
    +- Inside source: true
    +*** True Line Result
    +      }
    +** Processing line: ~      yInterc = @pointA.y + -slope*@pointA.x~
    +- Inside source: true
    +*** True Line Result
    +      yInterc = @pointA.y + -slope*@pointA.x
    +** Processing line: ~      if slope == INFINITY~
    +- Inside source: true
    +*** True Line Result
    +      if slope == INFINITY
    +** Processing line: ~        if previousPosition.x < @pointA.x~
    +- Inside source: true
    +*** True Line Result
    +        if previousPosition.x < @pointA.x
    +** Processing line: ~          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +- Inside source: true
    +*** True Line Result
    +          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~          yInterc = -INFINITY~
    +- Inside source: true
    +*** True Line Result
    +          yInterc = -INFINITY
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +~
    +- Inside source: true
    +*** True Line Result
    +      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +
    +** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +- Inside source: true
    +*** True Line Result
    +        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5~
    +- Inside source: true
    +*** True Line Result
    +      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5
    +** Processing line: ~      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity
    +** Processing line: ~      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)~
    +- Inside source: true
    +*** True Line Result
    +      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +      fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity
    +** Processing line: ~      fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +      fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #the magnitude of the repelling force~
    +- Inside source: true
    +*** True Line Result
    +      #the magnitude of the repelling force
    +** Processing line: ~      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)~
    +- Inside source: true
    +*** True Line Result
    +      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)
    +** Processing line: ~      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +- Inside source: true
    +*** True Line Result
    +      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    +** Processing line: ~      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby~
    +- Inside source: true
    +*** True Line Result
    +      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      fsumx = fbx+frx #sum of x forces~
    +- Inside source: true
    +*** True Line Result
    +      fsumx = fbx+frx #sum of x forces
    +** Processing line: ~      fsumy = fby+fry #sum of y forces~
    +- Inside source: true
    +*** True Line Result
    +      fsumy = fby+fry #sum of y forces
    +** Processing line: ~      fr = velocityMag#fr is the resulting magnitude~
    +- Inside source: true
    +*** True Line Result
    +      fr = velocityMag#fr is the resulting magnitude
    +** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle~
    +- Inside source: true
    +*** True Line Result
    +      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    +** Processing line: ~      xnew = fr*Math.cos(thetaNew)#resulting x velocity~
    +- Inside source: true
    +*** True Line Result
    +      xnew = fr*Math.cos(thetaNew)#resulting x velocity
    +** Processing line: ~      ynew = fr*Math.sin(thetaNew)#resulting y velocity~
    +- Inside source: true
    +*** True Line Result
    +      ynew = fr*Math.sin(thetaNew)#resulting y velocity
    +** Processing line: ~      if (velocityMag < MAX_VELOCITY)~
    +- Inside source: true
    +*** True Line Result
    +      if (velocityMag < MAX_VELOCITY)
    +** Processing line: ~        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)~
    +- Inside source: true
    +*** True Line Result
    +        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)
    +** Processing line: ~      else~
    +- Inside source: true
    +*** True Line Result
    +      else
    +** Processing line: ~        ball.velocity =  Vector2d.new(xnew, ynew)~
    +- Inside source: true
    +*** True Line Result
    +        ball.velocity =  Vector2d.new(xnew, ynew)
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- 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: ~*** Physics And Collisions - Arbitrary Collision - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Arbitrary Collision - 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/04_physics_and_collisions/09_arbitrary_collision/app/main.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/main.rb
    +** Processing line: ~  INFINITY= 10**10~
    +- Inside source: true
    +*** True Line Result
    +  INFINITY= 10**10
    +** Processing line: ~  MAX_VELOCITY = 8.0~
    +- Inside source: true
    +*** True Line Result
    +  MAX_VELOCITY = 8.0
    +** Processing line: ~  BALL_COUNT = 90~
    +- Inside source: true
    +*** True Line Result
    +  BALL_COUNT = 90
    +** Processing line: ~  BALL_DISTANCE = 20~
    +- Inside source: true
    +*** True Line Result
    +  BALL_DISTANCE = 20
    +** Processing line: ~  require 'app/vector2d.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/vector2d.rb'
    +** Processing line: ~  require 'app/blocks.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/blocks.rb'
    +** Processing line: ~  require 'app/ball.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/ball.rb'
    +** Processing line: ~  require 'app/rectangle.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/rectangle.rb'
    +** Processing line: ~  require 'app/linear_collider.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/linear_collider.rb'
    +** Processing line: ~  require 'app/square_collider.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/square_collider.rb'
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Method to init default values~
    +- Inside source: true
    +*** True Line Result
    +  #Method to init default values
    +** Processing line: ~  def defaults args~
    +- Inside source: true
    +*** True Line Result
    +  def defaults args
    +** Processing line: ~    args.state.board_width ||= args.grid.w / 4~
    +- Inside source: true
    +*** True Line Result
    +    args.state.board_width ||= args.grid.w / 4
    +** Processing line: ~    args.state.board_height ||= args.grid.h~
    +- Inside source: true
    +*** True Line Result
    +    args.state.board_height ||= args.grid.h
    +** Processing line: ~    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]~
    +- Inside source: true
    +*** True Line Result
    +    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]
    +** Processing line: ~    args.state.balls ||= []~
    +- Inside source: true
    +*** True Line Result
    +    args.state.balls ||= []
    +** Processing line: ~    args.state.num_balls ||= 0~
    +- Inside source: true
    +*** True Line Result
    +    args.state.num_balls ||= 0
    +** Processing line: ~    args.state.ball_created_at ||= args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ball_created_at ||= args.state.tick_count
    +** Processing line: ~    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5
    +** Processing line: ~    args.state.ballParents ||=nil~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ballParents ||=nil
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    init_blocks args~
    +- Inside source: true
    +*** True Line Result
    +    init_blocks args
    +** Processing line: ~    init_balls args~
    +- Inside source: true
    +*** True Line Result
    +    init_balls args
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  begin :default_methods~
    +- Inside source: true
    +*** True Line Result
    +  begin :default_methods
    +** Processing line: ~    def init_blocks args~
    +- Inside source: true
    +*** True Line Result
    +    def init_blocks args
    +** Processing line: ~      block_size = args.state.board_width / 8~
    +- Inside source: true
    +*** True Line Result
    +      block_size = args.state.board_width / 8
    +** Processing line: ~      #Space inbetween each block~
    +- Inside source: true
    +*** True Line Result
    +      #Space inbetween each block
    +** Processing line: ~      block_offset = 4~
    +- Inside source: true
    +*** True Line Result
    +      block_offset = 4
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.state.squares ||=[~
    +- Inside source: true
    +*** True Line Result
    +      args.state.squares ||=[
    +** Processing line: ~        Square.new(args, 2, 0, block_size, :right, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        Square.new(args, 2, 0, block_size, :right, block_offset),
    +** Processing line: ~        Square.new(args, 5, 0, block_size, :right, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        Square.new(args, 5, 0, block_size, :right, block_offset),
    +** Processing line: ~        Square.new(args, 6, 7, block_size, :right, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +        Square.new(args, 6, 7, block_size, :right, block_offset)
    +** Processing line: ~      ]~
    +- Inside source: true
    +*** True Line Result
    +      ]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #Possible orientations are :right, :left, :up, :down~
    +- Inside source: true
    +*** True Line Result
    +      #Possible orientations are :right, :left, :up, :down
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.state.tshapes ||= [~
    +- Inside source: true
    +*** True Line Result
    +      args.state.tshapes ||= [
    +** Processing line: ~        TShape.new(args, 0, 6, block_size, :left, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        TShape.new(args, 0, 6, block_size, :left, block_offset),
    +** Processing line: ~        TShape.new(args, 3, 3, block_size, :down, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        TShape.new(args, 3, 3, block_size, :down, block_offset),
    +** Processing line: ~        TShape.new(args, 0, 3, block_size, :right, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        TShape.new(args, 0, 3, block_size, :right, block_offset),
    +** Processing line: ~        TShape.new(args, 0, 11, block_size, :up, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +        TShape.new(args, 0, 11, block_size, :up, block_offset)
    +** Processing line: ~      ]~
    +- Inside source: true
    +*** True Line Result
    +      ]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.state.lines ||= [~
    +- Inside source: true
    +*** True Line Result
    +      args.state.lines ||= [
    +** Processing line: ~        Line.new(args,3, 8, block_size, :down, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        Line.new(args,3, 8, block_size, :down, block_offset),
    +** Processing line: ~        Line.new(args, 7, 3, block_size, :up, block_offset),~
    +- Inside source: true
    +*** True Line Result
    +        Line.new(args, 7, 3, block_size, :up, block_offset),
    +** Processing line: ~        Line.new(args, 3, 7, block_size, :right, block_offset)~
    +- Inside source: true
    +*** True Line Result
    +        Line.new(args, 3, 7, block_size, :right, block_offset)
    +** Processing line: ~      ]~
    +- Inside source: true
    +*** True Line Result
    +      ]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #exit()~
    +- Inside source: true
    +*** True Line Result
    +      #exit()
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def init_balls args~
    +- Inside source: true
    +*** True Line Result
    +    def init_balls args
    +** Processing line: ~      return unless args.state.num_balls < BALL_COUNT~
    +- Inside source: true
    +*** True Line Result
    +      return unless args.state.num_balls < BALL_COUNT
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #only create a new ball every 10 ticks~
    +- Inside source: true
    +*** True Line Result
    +      #only create a new ball every 10 ticks
    +** Processing line: ~      return unless args.state.ball_created_at.elapsed_time > 10~
    +- Inside source: true
    +*** True Line Result
    +      return unless args.state.ball_created_at.elapsed_time > 10
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if (args.state.num_balls == 0)~
    +- Inside source: true
    +*** True Line Result
    +      if (args.state.num_balls == 0)
    +** Processing line: ~        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))~
    +- Inside source: true
    +*** True Line Result
    +        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))
    +** Processing line: ~        args.state.ballParents = [args.state.balls[0]]~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ballParents = [args.state.balls[0]]
    +** Processing line: ~      else~
    +- Inside source: true
    +*** True Line Result
    +      else
    +** Processing line: ~        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )~
    +- Inside source: true
    +*** True Line Result
    +        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )
    +** Processing line: ~        args.state.balls[-2].child = args.state.balls[-1]~
    +- Inside source: true
    +*** True Line Result
    +        args.state.balls[-2].child = args.state.balls[-1]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      args.state.ball_created_at = args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +      args.state.ball_created_at = args.state.tick_count
    +** Processing line: ~      args.state.num_balls += 1~
    +- Inside source: true
    +*** True Line Result
    +      args.state.num_balls += 1
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Render loop~
    +- Inside source: true
    +*** True Line Result
    +  #Render loop
    +** Processing line: ~  def render args~
    +- Inside source: true
    +*** True Line Result
    +  def render args
    +** Processing line: ~    bgClr = {r:10, g:10, b:200}~
    +- Inside source: true
    +*** True Line Result
    +    bgClr = {r:10, g:10, b:200}
    +** Processing line: ~    bgClr = {r:255-30, g:255-30, b:255-30}~
    +- Inside source: true
    +*** True Line Result
    +    bgClr = {r:255-30, g:255-30, b:255-30}
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];
    +** Processing line: ~    args.outputs.borders << args.state.game_area~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.borders << args.state.game_area
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    render_instructions args~
    +- Inside source: true
    +*** True Line Result
    +    render_instructions args
    +** Processing line: ~    render_shapes args~
    +- Inside source: true
    +*** True Line Result
    +    render_shapes args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    render_balls args~
    +- Inside source: true
    +*** True Line Result
    +    render_balls args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    #args.state.rectangle.draw args~
    +- Inside source: true
    +*** True Line Result
    +    #args.state.rectangle.draw args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    +** Processing line: ~    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  begin :render_methods~
    +- Inside source: true
    +*** True Line Result
    +  begin :render_methods
    +** Processing line: ~    def render_instructions args~
    +- Inside source: true
    +*** True Line Result
    +    def render_instructions args
    +** Processing line: ~      #gtk.current_framerate~
    +- Inside source: true
    +*** True Line Result
    +      #gtk.current_framerate
    +** Processing line: ~      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]
    +** Processing line: ~      if (args.state.balls != nil && args.state.balls[0] != nil)~
    +- Inside source: true
    +*** True Line Result
    +      if (args.state.balls != nil && args.state.balls[0] != nil)
    +** Processing line: ~          bx =  args.state.balls[0].velocity.x~
    +- Inside source: true
    +*** True Line Result
    +          bx =  args.state.balls[0].velocity.x
    +** Processing line: ~          by =  args.state.balls[0].velocity.y~
    +- Inside source: true
    +*** True Line Result
    +          by =  args.state.balls[0].velocity.y
    +** Processing line: ~          bmg = (bx**2.0 + by**2.0)**0.5~
    +- Inside source: true
    +*** True Line Result
    +          bmg = (bx**2.0 + by**2.0)**0.5
    +** Processing line: ~          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]~
    +- Inside source: true
    +*** True Line Result
    +          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]
    +** 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: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def render_shapes args~
    +- Inside source: true
    +*** True Line Result
    +    def render_shapes args
    +** Processing line: ~      for s in args.state.squares~
    +- Inside source: true
    +*** True Line Result
    +      for s in args.state.squares
    +** Processing line: ~        s.draw args~
    +- Inside source: true
    +*** True Line Result
    +        s.draw args
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      for l in args.state.lines~
    +- Inside source: true
    +*** True Line Result
    +      for l in args.state.lines
    +** Processing line: ~        l.draw args~
    +- Inside source: true
    +*** True Line Result
    +        l.draw args
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      for t in args.state.tshapes~
    +- Inside source: true
    +*** True Line Result
    +      for t in args.state.tshapes
    +** Processing line: ~        t.draw args~
    +- Inside source: true
    +*** True Line Result
    +        t.draw args
    +** 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: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def render_balls args~
    +- Inside source: true
    +*** True Line Result
    +    def render_balls args
    +** Processing line: ~      #args.state.balls.each do |ball|~
    +- Inside source: true
    +*** True Line Result
    +      #args.state.balls.each do |ball|
    +** Processing line: ~        #ball.draw args~
    +- Inside source: true
    +*** True Line Result
    +        #ball.draw args
    +** Processing line: ~      #end~
    +- Inside source: true
    +*** True Line Result
    +      #end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.outputs.sprites << args.state.balls.map do |ball|~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.sprites << args.state.balls.map do |ball|
    +** Processing line: ~        ball.getDraw args~
    +- Inside source: true
    +*** True Line Result
    +        ball.getDraw args
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Calls all methods necessary for performing calculations~
    +- Inside source: true
    +*** True Line Result
    +  #Calls all methods necessary for performing calculations
    +** Processing line: ~  def calc args~
    +- Inside source: true
    +*** True Line Result
    +  def calc args
    +** Processing line: ~    for b in args.state.ballParents~
    +- Inside source: true
    +*** True Line Result
    +    for b in args.state.ballParents
    +** Processing line: ~      b.update args~
    +- Inside source: true
    +*** True Line Result
    +      b.update args
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    for s in args.state.squares~
    +- Inside source: true
    +*** True Line Result
    +    for s in args.state.squares
    +** Processing line: ~      s.update args~
    +- Inside source: true
    +*** True Line Result
    +      s.update args
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    for l in args.state.lines~
    +- Inside source: true
    +*** True Line Result
    +    for l in args.state.lines
    +** Processing line: ~      l.update args~
    +- Inside source: true
    +*** True Line Result
    +      l.update args
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    for t in args.state.tshapes~
    +- Inside source: true
    +*** True Line Result
    +    for t in args.state.tshapes
    +** Processing line: ~      t.update args~
    +- Inside source: true
    +*** True Line Result
    +      t.update args
    +** 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: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  begin :calc_methods~
    +- Inside source: true
    +*** True Line Result
    +  begin :calc_methods
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    defaults args~
    +- Inside source: true
    +*** True Line Result
    +    defaults args
    +** Processing line: ~    render args~
    +- Inside source: true
    +*** True Line Result
    +    render args
    +** Processing line: ~    calc args~
    +- Inside source: true
    +*** True Line Result
    +    calc args
    +** 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: ~*** Physics And Collisions - Arbitrary Collision - paddle.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Arbitrary Collision - paddle.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/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb
    +** Processing line: ~  class Paddle~
    +- Inside source: true
    +*** True Line Result
    +  class Paddle
    +** Processing line: ~    attr_accessor :enabled~
    +- Inside source: true
    +*** True Line Result
    +    attr_accessor :enabled
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def initialize ()~
    +- Inside source: true
    +*** True Line Result
    +    def initialize ()
    +** Processing line: ~      @x=WIDTH/2~
    +- Inside source: true
    +*** True Line Result
    +      @x=WIDTH/2
    +** Processing line: ~      @y=100~
    +- Inside source: true
    +*** True Line Result
    +      @y=100
    +** Processing line: ~      @width=100~
    +- Inside source: true
    +*** True Line Result
    +      @width=100
    +** Processing line: ~      @height=20~
    +- Inside source: true
    +*** True Line Result
    +      @height=20
    +** Processing line: ~      @speed=10~
    +- Inside source: true
    +*** True Line Result
    +      @speed=10
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +** Processing line: ~      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +** Processing line: ~      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @enabled = true~
    +- Inside source: true
    +*** True Line Result
    +      @enabled = true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def update args~
    +- Inside source: true
    +*** True Line Result
    +    def update args
    +** Processing line: ~      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    +** Processing line: ~      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +** Processing line: ~      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @xyCollision.update  args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision.update  args
    +** Processing line: ~      @xyCollision2.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2.update args
    +** Processing line: ~      @xyCollision3.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3.update args
    +** Processing line: ~      @xyCollision4.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4.update args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.inputs.keyboard.key_held.left  ||= false~
    +- Inside source: true
    +*** True Line Result
    +      args.inputs.keyboard.key_held.left  ||= false
    +** Processing line: ~      args.inputs.keyboard.key_held.right  ||= false~
    +- Inside source: true
    +*** True Line Result
    +      args.inputs.keyboard.key_held.right  ||= false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)~
    +- Inside source: true
    +*** True Line Result
    +      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    +** Processing line: ~        if args.inputs.keyboard.key_held.left && @enabled~
    +- Inside source: true
    +*** True Line Result
    +        if args.inputs.keyboard.key_held.left && @enabled
    +** Processing line: ~          @x-=@speed~
    +- Inside source: true
    +*** True Line Result
    +          @x-=@speed
    +** Processing line: ~        elsif args.inputs.keyboard.key_held.right && @enabled~
    +- Inside source: true
    +*** True Line Result
    +        elsif args.inputs.keyboard.key_held.right && @enabled
    +** Processing line: ~          @x+=@speed~
    +- Inside source: true
    +*** True Line Result
    +          @x+=@speed
    +** 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: ~      xmin =WIDTH/4~
    +- Inside source: true
    +*** True Line Result
    +      xmin =WIDTH/4
    +** Processing line: ~      xmax = 3*(WIDTH/4)~
    +- Inside source: true
    +*** True Line Result
    +      xmax = 3*(WIDTH/4)
    +** Processing line: ~      @x = (@x+@width > xmax) ? xmax-@width : (@x xmax) ? xmax-@width : (@x= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&~
    +- Inside source: true
    +*** True Line Result
    +        point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    +** Processing line: ~        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&~
    +- Inside source: true
    +*** True Line Result
    +        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    +** Processing line: ~        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max~
    +- Inside source: true
    +*** True Line Result
    +        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    +** Processing line: ~          return true~
    +- Inside source: true
    +*** True Line Result
    +          return true
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      isNegInLine   = @extension == :neg &&~
    +- Inside source: true
    +*** True Line Result
    +      isNegInLine   = @extension == :neg &&
    +** Processing line: ~                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&~
    +- Inside source: true
    +*** True Line Result
    +                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +** Processing line: ~                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)~
    +- Inside source: true
    +*** True Line Result
    +                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +** Processing line: ~      isPosInLine   = @extension == :pos &&~
    +- Inside source: true
    +*** True Line Result
    +      isPosInLine   = @extension == :pos &&
    +** Processing line: ~                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&~
    +- Inside source: true
    +*** True Line Result
    +                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    +** Processing line: ~                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)~
    +- Inside source: true
    +*** True Line Result
    +                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    +** Processing line: ~      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&~
    +- Inside source: true
    +*** True Line Result
    +      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    +** Processing line: ~                      point.x <= [@pointA.x,@pointB.x].max &&~
    +- Inside source: true
    +*** True Line Result
    +                      point.x <= [@pointA.x,@pointB.x].max &&
    +** Processing line: ~                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&~
    +- Inside source: true
    +*** True Line Result
    +                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    +** Processing line: ~                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)~
    +- Inside source: true
    +*** True Line Result
    +                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      return isInBoxBounds && (isNegInLine || isPosInLine)~
    +- Inside source: true
    +*** True Line Result
    +      return isInBoxBounds && (isNegInLine || isPosInLine)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def getRepelMagnitude (fbx, fby, vrx, vry, args)~
    +- Inside source: true
    +*** True Line Result
    +    def getRepelMagnitude (fbx, fby, vrx, vry, args)
    +** Processing line: ~      a = fbx ; b = vrx ; c = fby~
    +- Inside source: true
    +*** True Line Result
    +      a = fbx ; b = vrx ; c = fby
    +** Processing line: ~      d = vry ; e = args.state.ball.velocity.mag~
    +- Inside source: true
    +*** True Line Result
    +      d = vry ; e = args.state.ball.velocity.mag
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if b**2 + d**2 == 0~
    +- Inside source: true
    +*** True Line Result
    +      if b**2 + d**2 == 0
    +** Processing line: ~        puts "magnitude error"~
    +- Inside source: true
    +*** True Line Result
    +        puts "magnitude error"
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
    +- Inside source: true
    +*** True Line Result
    +      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    +** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
    +- Inside source: true
    +*** True Line Result
    +      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    +** Processing line: ~      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2~
    +- Inside source: true
    +*** True Line Result
    +      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def update args~
    +- Inside source: true
    +*** True Line Result
    +    def update args
    +** Processing line: ~      #each of the four points on the square ball - NOTE simple to extend to a circle~
    +- Inside source: true
    +*** True Line Result
    +      #each of the four points on the square ball - NOTE simple to extend to a circle
    +** Processing line: ~      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},~
    +- Inside source: true
    +*** True Line Result
    +      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    +** Processing line: ~                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},~
    +- Inside source: true
    +*** True Line Result
    +                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    +** Processing line: ~                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},~
    +- Inside source: true
    +*** True Line Result
    +                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    +** Processing line: ~                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}~
    +- Inside source: true
    +*** True Line Result
    +                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    +** Processing line: ~              ]~
    +- Inside source: true
    +*** True Line Result
    +              ]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #for each point p in points~
    +- Inside source: true
    +*** True Line Result
    +      #for each point p in points
    +** Processing line: ~      for point in points~
    +- Inside source: true
    +*** True Line Result
    +      for point in points
    +** Processing line: ~        #isCollision.md has more information on this section~
    +- Inside source: true
    +*** True Line Result
    +        #isCollision.md has more information on this section
    +** Processing line: ~        #TODO: section can certainly be simplifyed~
    +- Inside source: true
    +*** True Line Result
    +        #TODO: section can certainly be simplifyed
    +** Processing line: ~        if isCollision?(point)~
    +- Inside source: true
    +*** True Line Result
    +        if isCollision?(point)
    +** Processing line: ~          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector~
    +- Inside source: true
    +*** True Line Result
    +          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment~
    +- Inside source: true
    +*** True Line Result
    +          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    +** Processing line: ~          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)~
    +- Inside source: true
    +*** True Line Result
    +          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    +** Processing line: ~          choiceA = (u.mult(1))~
    +- Inside source: true
    +*** True Line Result
    +          choiceA = (u.mult(1))
    +** Processing line: ~          choiceB =  (u.mult(-1))~
    +- Inside source: true
    +*** True Line Result
    +          choiceB =  (u.mult(-1))
    +** Processing line: ~          vectorRepel = nil~
    +- Inside source: true
    +*** True Line Result
    +          vectorRepel = nil
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0~
    +- Inside source: true
    +*** True Line Result
    +          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    +** Processing line: ~            choiceA, choiceB = choiceB, choiceA~
    +- Inside source: true
    +*** True Line Result
    +            choiceA, choiceB = choiceB, choiceA
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB~
    +- Inside source: true
    +*** True Line Result
    +          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)~
    +- Inside source: true
    +*** True Line Result
    +          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    +** Processing line: ~          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test~
    +- Inside source: true
    +*** True Line Result
    +          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    +** Processing line: ~            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))~
    +- Inside source: true
    +*** True Line Result
    +            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)~
    +- Inside source: true
    +*** True Line Result
    +          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    +** Processing line: ~          #vectorRepel now has the repeling force~
    +- Inside source: true
    +*** True Line Result
    +          #vectorRepel now has the repeling force
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          mag = args.state.ball.velocity.mag~
    +- Inside source: true
    +*** True Line Result
    +          mag = args.state.ball.velocity.mag
    +** Processing line: ~          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    +** Processing line: ~          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force~
    +- Inside source: true
    +*** True Line Result
    +          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    +** Processing line: ~          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay~
    +- Inside source: true
    +*** True Line Result
    +          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    +** Processing line: ~          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity~
    +- Inside source: true
    +*** True Line Result
    +          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)~
    +- Inside source: true
    +*** True Line Result
    +          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +- Inside source: true
    +*** True Line Result
    +          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    +** Processing line: ~          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby~
    +- Inside source: true
    +*** True Line Result
    +          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          fsumx = fbx+frx #sum of x forces~
    +- Inside source: true
    +*** True Line Result
    +          fsumx = fbx+frx #sum of x forces
    +** Processing line: ~          fsumy = fby+fry #sum of y forces~
    +- Inside source: true
    +*** True Line Result
    +          fsumy = fby+fry #sum of y forces
    +** Processing line: ~          fr = mag#fr is the resulting magnitude~
    +- Inside source: true
    +*** True Line Result
    +          fr = mag#fr is the resulting magnitude
    +** Processing line: ~          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle~
    +- Inside source: true
    +*** True Line Result
    +          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    +** Processing line: ~          xnew = fr*Math.cos(thetaNew) #resulting x velocity~
    +- Inside source: true
    +*** True Line Result
    +          xnew = fr*Math.cos(thetaNew) #resulting x velocity
    +** Processing line: ~          ynew = fr*Math.sin(thetaNew) #resulting y velocity~
    +- Inside source: true
    +*** True Line Result
    +          ynew = fr*Math.sin(thetaNew) #resulting y velocity
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          args.state.ball.velocity = Vector2d.new(xnew,ynew)~
    +- Inside source: true
    +*** True Line Result
    +          args.state.ball.velocity = Vector2d.new(xnew,ynew)
    +** Processing line: ~          #args.state.ball.xy.add(args.state.ball.velocity)~
    +- Inside source: true
    +*** True Line Result
    +          #args.state.ball.xy.add(args.state.ball.velocity)
    +** Processing line: ~          break #no need to check the other points ?~
    +- Inside source: true
    +*** True Line Result
    +          break #no need to check the other points ?
    +** Processing line: ~        else~
    +- Inside source: true
    +*** True Line Result
    +        else
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~    end #end update~
    +- Inside source: true
    +*** True Line Result
    +    end #end update
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Physics And Collisions - Collision With Object Removal - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Collision With Object Removal - 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/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    +** Processing line: ~  # coding: utf-8~
    +- Inside source: true
    +*** True Line Result
    +  # coding: utf-8
    +** Processing line: ~  INFINITY= 10**10~
    +- Inside source: true
    +*** True Line Result
    +  INFINITY= 10**10
    +** Processing line: ~  WIDTH=1280~
    +- Inside source: true
    +*** True Line Result
    +  WIDTH=1280
    +** Processing line: ~  HEIGHT=720~
    +- Inside source: true
    +*** True Line Result
    +  HEIGHT=720
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  require 'app/vector2d.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/vector2d.rb'
    +** Processing line: ~  require 'app/paddle.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/paddle.rb'
    +** Processing line: ~  require 'app/ball.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/ball.rb'
    +** Processing line: ~  require 'app/linear_collider.rb'~
    +- Inside source: true
    +*** True Line Result
    +  require 'app/linear_collider.rb'
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Method to init default values~
    +- Inside source: true
    +*** True Line Result
    +  #Method to init default values
    +** Processing line: ~  def defaults args~
    +- Inside source: true
    +*** True Line Result
    +  def defaults args
    +** Processing line: ~    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]~
    +- Inside source: true
    +*** True Line Result
    +    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    +** Processing line: ~    args.state.bricks ||= []~
    +- Inside source: true
    +*** True Line Result
    +    args.state.bricks ||= []
    +** Processing line: ~    args.state.num_bricks ||= 0~
    +- Inside source: true
    +*** True Line Result
    +    args.state.num_bricks ||= 0
    +** Processing line: ~    args.state.game_over_at ||= 0~
    +- Inside source: true
    +*** True Line Result
    +    args.state.game_over_at ||= 0
    +** Processing line: ~    args.state.paddle ||= Paddle.new~
    +- Inside source: true
    +*** True Line Result
    +    args.state.paddle ||= Paddle.new
    +** Processing line: ~    args.state.ball   ||= Ball.new~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ball   ||= Ball.new
    +** Processing line: ~    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    +** Processing line: ~    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})~
    +- Inside source: true
    +*** True Line Result
    +    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    +** Processing line: ~    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})~
    +- Inside source: true
    +*** True Line Result
    +    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    +** Processing line: ~    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})~
    +- Inside source: true
    +*** True Line Result
    +    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Render loop~
    +- Inside source: true
    +*** True Line Result
    +  #Render loop
    +** Processing line: ~  def render args~
    +- Inside source: true
    +*** True Line Result
    +  def render args
    +** Processing line: ~    render_instructions args~
    +- Inside source: true
    +*** True Line Result
    +    render_instructions args
    +** Processing line: ~    render_board args~
    +- Inside source: true
    +*** True Line Result
    +    render_board args
    +** Processing line: ~    render_bricks args~
    +- Inside source: true
    +*** True Line Result
    +    render_bricks args
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  begin :render_methods~
    +- Inside source: true
    +*** True Line Result
    +  begin :render_methods
    +** Processing line: ~    #Method to display the instructions of the game~
    +- Inside source: true
    +*** True Line Result
    +    #Method to display the instructions of the game
    +** Processing line: ~    def render_instructions args~
    +- Inside source: true
    +*** True Line Result
    +    def render_instructions args
    +** Processing line: ~      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def render_board args~
    +- Inside source: true
    +*** True Line Result
    +    def render_board args
    +** Processing line: ~      args.outputs.borders << args.state.game_board~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.borders << args.state.game_board
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def render_bricks args~
    +- Inside source: true
    +*** True Line Result
    +    def render_bricks args
    +** Processing line: ~      args.outputs.solids << args.state.bricks.map(&:rect)~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.solids << args.state.bricks.map(&:rect)
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  #Calls all methods necessary for performing calculations~
    +- Inside source: true
    +*** True Line Result
    +  #Calls all methods necessary for performing calculations
    +** Processing line: ~  def calc args~
    +- Inside source: true
    +*** True Line Result
    +  def calc args
    +** Processing line: ~    add_new_bricks args~
    +- Inside source: true
    +*** True Line Result
    +    add_new_bricks args
    +** Processing line: ~    reset_game args~
    +- Inside source: true
    +*** True Line Result
    +    reset_game args
    +** Processing line: ~    calc_collision args~
    +- Inside source: true
    +*** True Line Result
    +    calc_collision args
    +** Processing line: ~    win_game args~
    +- Inside source: true
    +*** True Line Result
    +    win_game args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    args.state.westWall.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.westWall.update args
    +** Processing line: ~    args.state.eastWall.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.eastWall.update args
    +** Processing line: ~    args.state.southWall.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.southWall.update args
    +** Processing line: ~    args.state.northWall.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.northWall.update args
    +** Processing line: ~    args.state.paddle.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.paddle.update args
    +** Processing line: ~    args.state.ball.update args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ball.update args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    #args.state.testWall.update args~
    +- Inside source: true
    +*** True Line Result
    +    #args.state.testWall.update args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    args.state.paddle.render args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.paddle.render args
    +** Processing line: ~    args.state.ball.render args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.ball.render args
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  begin :calc_methods~
    +- Inside source: true
    +*** True Line Result
    +  begin :calc_methods
    +** Processing line: ~    def add_new_bricks args~
    +- Inside source: true
    +*** True Line Result
    +    def add_new_bricks args
    +** Processing line: ~      return if args.state.num_bricks > 40~
    +- Inside source: true
    +*** True Line Result
    +      return if args.state.num_bricks > 40
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #Width of the game board is 640px~
    +- Inside source: true
    +*** True Line Result
    +      #Width of the game board is 640px
    +** Processing line: ~      brick_width = (args.grid.w / 2) / 10~
    +- Inside source: true
    +*** True Line Result
    +      brick_width = (args.grid.w / 2) / 10
    +** Processing line: ~      brick_height = brick_width / 2~
    +- Inside source: true
    +*** True Line Result
    +      brick_height = brick_width / 2
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      (4).map_with_index do |y|~
    +- Inside source: true
    +*** True Line Result
    +      (4).map_with_index do |y|
    +** Processing line: ~        #Make a box that is 10 bricks wide and 4 bricks tall~
    +- Inside source: true
    +*** True Line Result
    +        #Make a box that is 10 bricks wide and 4 bricks tall
    +** Processing line: ~        args.state.bricks += (10).map_with_index do |x|~
    +- Inside source: true
    +*** True Line Result
    +        args.state.bricks += (10).map_with_index do |x|
    +** Processing line: ~          args.state.new_entity(:brick) do |b|~
    +- Inside source: true
    +*** True Line Result
    +          args.state.new_entity(:brick) do |b|
    +** Processing line: ~            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)~
    +- Inside source: true
    +*** True Line Result
    +            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    +** Processing line: ~            b.y = args.grid.h - ((y + 1) * brick_height)~
    +- Inside source: true
    +*** True Line Result
    +            b.y = args.grid.h - ((y + 1) * brick_height)
    +** Processing line: ~            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]~
    +- Inside source: true
    +*** True Line Result
    +            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~            #Add linear colliders to the brick~
    +- Inside source: true
    +*** True Line Result
    +            #Add linear colliders to the brick
    +** Processing line: ~            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)~
    +- Inside source: true
    +*** True Line Result
    +            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    +** Processing line: ~            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)~
    +- Inside source: true
    +*** True Line Result
    +            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    +** Processing line: ~            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)~
    +- Inside source: true
    +*** True Line Result
    +            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    +** Processing line: ~            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)~
    +- Inside source: true
    +*** True Line Result
    +            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})~
    +- Inside source: true
    +*** True Line Result
    +            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    +** Processing line: ~            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +** Processing line: ~            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})~
    +- Inside source: true
    +*** True Line Result
    +            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    +** Processing line: ~            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~            b.broken = false~
    +- Inside source: true
    +*** True Line Result
    +            b.broken = false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~            args.state.num_bricks += 1~
    +- Inside source: true
    +*** True Line Result
    +            args.state.num_bricks += 1
    +** Processing line: ~          end~
    +- Inside source: true
    +*** True Line Result
    +          end
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def reset_game args~
    +- Inside source: true
    +*** True Line Result
    +    def reset_game args
    +** Processing line: ~      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60~
    +- Inside source: true
    +*** True Line Result
    +      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    +** Processing line: ~        #Freeze the ball~
    +- Inside source: true
    +*** True Line Result
    +        #Freeze the ball
    +** Processing line: ~        args.state.ball.velocity.x = 0~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ball.velocity.x = 0
    +** Processing line: ~        args.state.ball.velocity.y = 0~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ball.velocity.y = 0
    +** Processing line: ~        #Freeze the paddle~
    +- Inside source: true
    +*** True Line Result
    +        #Freeze the paddle
    +** Processing line: ~        args.state.paddle.enabled = false~
    +- Inside source: true
    +*** True Line Result
    +        args.state.paddle.enabled = false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        args.state.game_over_at = args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +        args.state.game_over_at = args.state.tick_count
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0~
    +- Inside source: true
    +*** True Line Result
    +      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    +** Processing line: ~        #Display a "Game over" message~
    +- Inside source: true
    +*** True Line Result
    +        #Display a "Game over" message
    +** Processing line: ~        args.outputs.labels << [100, 100, "GAME OVER", 10]~
    +- Inside source: true
    +*** True Line Result
    +        args.outputs.labels << [100, 100, "GAME OVER", 10]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #If 60 frames have passed since the game ended, restart the game~
    +- Inside source: true
    +*** True Line Result
    +      #If 60 frames have passed since the game ended, restart the game
    +** Processing line: ~      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60~
    +- Inside source: true
    +*** True Line Result
    +      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    +** Processing line: ~        # FIXME: only put value types in state~
    +- Inside source: true
    +*** True Line Result
    +        # FIXME: only put value types in state
    +** Processing line: ~        args.state.ball = Ball.new~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ball = Ball.new
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        # FIXME: only put value types in state~
    +- Inside source: true
    +*** True Line Result
    +        # FIXME: only put value types in state
    +** Processing line: ~        args.state.paddle = Paddle.new~
    +- Inside source: true
    +*** True Line Result
    +        args.state.paddle = Paddle.new
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        args.state.bricks = []~
    +- Inside source: true
    +*** True Line Result
    +        args.state.bricks = []
    +** Processing line: ~        args.state.num_bricks = 0~
    +- Inside source: true
    +*** True Line Result
    +        args.state.num_bricks = 0
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def calc_collision args~
    +- Inside source: true
    +*** True Line Result
    +    def calc_collision args
    +** Processing line: ~      #Remove the brick if it is hit with the ball~
    +- Inside source: true
    +*** True Line Result
    +      #Remove the brick if it is hit with the ball
    +** Processing line: ~      ball = args.state.ball~
    +- Inside source: true
    +*** True Line Result
    +      ball = args.state.ball
    +** Processing line: ~      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]~
    +- Inside source: true
    +*** True Line Result
    +      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #Loop through each brick to see if the ball is colliding with it~
    +- Inside source: true
    +*** True Line Result
    +      #Loop through each brick to see if the ball is colliding with it
    +** Processing line: ~      args.state.bricks.each do |b|~
    +- Inside source: true
    +*** True Line Result
    +      args.state.bricks.each do |b|
    +** Processing line: ~        if b.rect.intersect_rect?(ball_rect)~
    +- Inside source: true
    +*** True Line Result
    +        if b.rect.intersect_rect?(ball_rect)
    +** Processing line: ~          #Run the linear collider for the brick if there is a collision~
    +- Inside source: true
    +*** True Line Result
    +          #Run the linear collider for the brick if there is a collision
    +** Processing line: ~          b[:collider_bottom].update args~
    +- Inside source: true
    +*** True Line Result
    +          b[:collider_bottom].update args
    +** Processing line: ~          b[:collider_right].update args~
    +- Inside source: true
    +*** True Line Result
    +          b[:collider_right].update args
    +** Processing line: ~          b[:collider_left].update args~
    +- Inside source: true
    +*** True Line Result
    +          b[:collider_left].update args
    +** Processing line: ~          b[:collider_top].update args~
    +- Inside source: true
    +*** True Line Result
    +          b[:collider_top].update args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~          b.broken = true~
    +- Inside source: true
    +*** True Line Result
    +          b.broken = true
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.state.bricks = args.state.bricks.reject(&:broken)~
    +- Inside source: true
    +*** True Line Result
    +      args.state.bricks = args.state.bricks.reject(&:broken)
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def win_game args~
    +- Inside source: true
    +*** True Line Result
    +    def win_game args
    +** Processing line: ~      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60~
    +- Inside source: true
    +*** True Line Result
    +      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    +** Processing line: ~        #Freeze the ball~
    +- Inside source: true
    +*** True Line Result
    +        #Freeze the ball
    +** Processing line: ~        args.state.ball.velocity.x = 0~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ball.velocity.x = 0
    +** Processing line: ~        args.state.ball.velocity.y = 0~
    +- Inside source: true
    +*** True Line Result
    +        args.state.ball.velocity.y = 0
    +** Processing line: ~        #Freeze the paddle~
    +- Inside source: true
    +*** True Line Result
    +        #Freeze the paddle
    +** Processing line: ~        args.state.paddle.enabled = false~
    +- Inside source: true
    +*** True Line Result
    +        args.state.paddle.enabled = false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~        args.state.game_over_at = args.state.tick_count~
    +- Inside source: true
    +*** True Line Result
    +        args.state.game_over_at = args.state.tick_count
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0~
    +- Inside source: true
    +*** True Line Result
    +      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    +** Processing line: ~        #Display a "Game over" message~
    +- Inside source: true
    +*** True Line Result
    +        #Display a "Game over" message
    +** Processing line: ~        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]~
    +- Inside source: true
    +*** True Line Result
    +        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    +** 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~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    defaults args~
    +- Inside source: true
    +*** True Line Result
    +    defaults args
    +** Processing line: ~    render args~
    +- Inside source: true
    +*** True Line Result
    +    render args
    +** Processing line: ~    calc args~
    +- Inside source: true
    +*** True Line Result
    +    calc args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]~
    +- Inside source: true
    +*** True Line Result
    +    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    #$tc+=1~
    +- Inside source: true
    +*** True Line Result
    +    #$tc+=1
    +** Processing line: ~    #if $tc == 5~
    +- Inside source: true
    +*** True Line Result
    +    #if $tc == 5
    +** Processing line: ~      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]~
    +- Inside source: true
    +*** True Line Result
    +      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    +** Processing line: ~      #$tc = 0~
    +- Inside source: true
    +*** True Line Result
    +      #$tc = 0
    +** Processing line: ~    #end~
    +- Inside source: true
    +*** True Line Result
    +    #end
    +** Processing line: ~    #for t in $train~
    +- Inside source: true
    +*** True Line Result
    +    #for t in $train
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];~
    +- Inside source: true
    +*** True Line Result
    +      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    +** Processing line: ~    #end~
    +- Inside source: true
    +*** True Line Result
    +    #end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~#+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: ~*** Physics And Collisions - Collision With Object Removal - paddle.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Physics And Collisions - Collision With Object Removal - paddle.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/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
    +** Processing line: ~  class Paddle~
    +- Inside source: true
    +*** True Line Result
    +  class Paddle
    +** Processing line: ~    attr_accessor :enabled~
    +- Inside source: true
    +*** True Line Result
    +    attr_accessor :enabled
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def initialize ()~
    +- Inside source: true
    +*** True Line Result
    +    def initialize ()
    +** Processing line: ~      @x=WIDTH/2~
    +- Inside source: true
    +*** True Line Result
    +      @x=WIDTH/2
    +** Processing line: ~      @y=100~
    +- Inside source: true
    +*** True Line Result
    +      @y=100
    +** Processing line: ~      @width=100~
    +- Inside source: true
    +*** True Line Result
    +      @width=100
    +** Processing line: ~      @height=20~
    +- Inside source: true
    +*** True Line Result
    +      @height=20
    +** Processing line: ~      @speed=10~
    +- Inside source: true
    +*** True Line Result
    +      @speed=10
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    +** Processing line: ~      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +** Processing line: ~      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @enabled = true~
    +- Inside source: true
    +*** True Line Result
    +      @enabled = true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    def update args~
    +- Inside source: true
    +*** True Line Result
    +    def update args
    +** Processing line: ~      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    +** Processing line: ~      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    +** Processing line: ~      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      @xyCollision.update  args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision.update  args
    +** Processing line: ~      @xyCollision2.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision2.update args
    +** Processing line: ~      @xyCollision3.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision3.update args
    +** Processing line: ~      @xyCollision4.update args~
    +- Inside source: true
    +*** True Line Result
    +      @xyCollision4.update args
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      args.inputs.keyboard.key_held.left  ||= false~
    +- Inside source: true
    +*** True Line Result
    +      args.inputs.keyboard.key_held.left  ||= false
    +** Processing line: ~      args.inputs.keyboard.key_held.right  ||= false~
    +- Inside source: true
    +*** True Line Result
    +      args.inputs.keyboard.key_held.right  ||= false
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)~
    +- Inside source: true
    +*** True Line Result
    +      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    +** Processing line: ~        if args.inputs.keyboard.key_held.left && @enabled~
    +- Inside source: true
    +*** True Line Result
    +        if args.inputs.keyboard.key_held.left && @enabled
    +** Processing line: ~          @x-=@speed~
    +- Inside source: true
    +*** True Line Result
    +          @x-=@speed
    +** Processing line: ~        elsif args.inputs.keyboard.key_held.right && @enabled~
    +- Inside source: true
    +*** True Line Result
    +        elsif args.inputs.keyboard.key_held.right && @enabled
    +** Processing line: ~          @x+=@speed~
    +- Inside source: true
    +*** True Line Result
    +          @x+=@speed
    +** 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: ~      xmin =WIDTH/4~
    +- Inside source: true
    +*** True Line Result
    +      xmin =WIDTH/4
    +** Processing line: ~      xmax = 3*(WIDTH/4)~
    +- Inside source: true
    +*** True Line Result
    +      xmax = 3*(WIDTH/4)
    +** Processing line: ~      @x = (@x+@width > xmax) ? xmax-@width : (@x xmax) ? xmax-@width : (@x= 0~
    +** Processing line: ~      # Again, the calculations ensure that the piece is placed in the center of the grid square.~
     - Inside source: true
     *** True Line Result
    -      if rotation >= 0
    -** Processing line: ~        theta = 90 - rotation~
    +      # Again, the calculations ensure that the piece is placed in the center of the grid square.
    +** Processing line: ~      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.~
     - Inside source: true
     *** True Line Result
    -        theta = 90 - rotation
    -** Processing line: ~        #The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit~
    +      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    +** Processing line: ~      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board~
     - Inside source: true
     *** True Line Result
    -        #The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit
    -** Processing line: ~        modifier = 5~
    +      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    +** Processing line: ~            label board_left + x.add(1) * square_size + square_size.fdiv(2),~
     - Inside source: true
     *** True Line Result
    -        modifier = 5
    -** Processing line: ~        x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)~
    +            label board_left + x.add(1) * square_size + square_size.fdiv(2),
    +** Processing line: ~            board_top  + y.add(1) * square_size + square_size - 20,~
     - Inside source: true
     *** True Line Result
    -        x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)
    -** Processing line: ~        y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)~
    +            board_top  + y.add(1) * square_size + square_size - 20,
    +** Processing line: ~            space.piece # text of label, either "x" or "o"~
     - Inside source: true
     *** True Line Result
    -        y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)
    -** Processing line: ~        @x1 = @x - x_offset~
    +            space.piece # text of label, either "x" or "o"
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        @x1 = @x - x_offset
    -** Processing line: ~        @y1 = @y + y_offset~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @y1 = @y + y_offset
    -** Processing line: ~        @x2 = @x1 + horizontal_offset~
    +
    +** Processing line: ~      # Uses a label to output whether x or o won, or if a draw occurred.~
     - Inside source: true
     *** True Line Result
    -        @x2 = @x1 + horizontal_offset
    -** Processing line: ~        @y2 = @y1 + (vertical_offset * 3)~
    +      # Uses a label to output whether x or o won, or if a draw occurred.
    +** Processing line: ~      # If the game is ongoing, a label shows whose turn it currently is.~
     - Inside source: true
     *** True Line Result
    -        @y2 = @y1 + (vertical_offset * 3)
    -** Processing line: ~~
    +      # If the game is ongoing, a label shows whose turn it currently is.
    +** Processing line: ~      outputs.labels << if state.x_won~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        @imaginary_line = [ @x1, @y1, @x2, @y2 ]~
    +      outputs.labels << if state.x_won
    +** Processing line: ~                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top~
     - Inside source: true
     *** True Line Result
    -        @imaginary_line = [ @x1, @y1, @x2, @y2 ]
    -** Processing line: ~      else~
    +                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    +** Processing line: ~                        elsif state.o_won~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        theta = 90 + rotation~
    +                        elsif state.o_won
    +** Processing line: ~                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally~
     - Inside source: true
     *** True Line Result
    -        theta = 90 + rotation
    -** Processing line: ~        x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)~
    +                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    +** Processing line: ~                        elsif state.draw~
     - Inside source: true
     *** True Line Result
    -        x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)
    -** Processing line: ~        y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)~
    +                        elsif state.draw
    +** Processing line: ~                          label grid.w_half, grid.top - 80, "a draw"~
     - Inside source: true
     *** True Line Result
    -        y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)
    -** Processing line: ~        @x1 = @x + x_offset~
    +                          label grid.w_half, grid.top - 80, "a draw"
    +** Processing line: ~                        else # if no one won and the game is ongoing~
     - Inside source: true
     *** True Line Result
    -        @x1 = @x + x_offset
    -** Processing line: ~        @y1 = @y + y_offset + 19~
    +                        else # if no one won and the game is ongoing
    +** Processing line: ~                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"~
     - Inside source: true
     *** True Line Result
    -        @y1 = @y + y_offset + 19
    -** Processing line: ~        @x2 = @x1 + horizontal_offset~
    +                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    +** Processing line: ~                        end~
     - Inside source: true
     *** True Line Result
    -        @x2 = @x1 + horizontal_offset
    -** Processing line: ~        @y2 = @y1 + (vertical_offset * 3)~
    +                        end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        @y2 = @y1 + (vertical_offset * 3)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        @imaginary_line = [ @x1, @y1, @x2, @y2 ]~
    +** Processing line: ~    # Calls the methods responsible for handling user input and determining the winner.~
     - Inside source: true
     *** True Line Result
    -        @imaginary_line = [ @x1, @y1, @x2, @y2 ]
    -** Processing line: ~      end~
    +    # Calls the methods responsible for handling user input and determining the winner.
    +** Processing line: ~    # Does nothing unless the mouse is clicked.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    # Does nothing unless the mouse is clicked.
    +** Processing line: ~    def input_board~
     - Inside source: true
     *** True Line Result
    -
    +    def input_board
    +** Processing line: ~      return unless inputs.mouse.click~
    +- Inside source: true
    +*** True Line Result
    +      return unless inputs.mouse.click
    +** Processing line: ~      input_place_piece~
    +- Inside source: true
    +*** True Line Result
    +      input_place_piece
    +** Processing line: ~      input_restart_game~
    +- Inside source: true
    +*** True Line Result
    +      input_restart_game
    +** Processing line: ~      determine_winner~
    +- Inside source: true
    +*** True Line Result
    +      determine_winner
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -30312,54 +38243,74 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def draw args~
    +** Processing line: ~    # Handles user input for placing pieces on the board.~
     - Inside source: true
     *** True Line Result
    -    def draw args
    -** Processing line: ~      args.outputs.sprites << [~
    +    # Handles user input for placing pieces on the board.
    +** Processing line: ~    def input_place_piece~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << [
    -** Processing line: ~        @x,~
    +    def input_place_piece
    +** Processing line: ~      return if state.game_over~
     - Inside source: true
     *** True Line Result
    -        @x,
    -** Processing line: ~        @y,~
    +      return if state.game_over
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @y,
    -** Processing line: ~        @block_size*3,~
    +
    +** Processing line: ~      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already~
     - Inside source: true
     *** True Line Result
    -        @block_size*3,
    -** Processing line: ~        @block_size,~
    +      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    +** Processing line: ~      # have a piece in it.~
     - Inside source: true
     *** True Line Result
    -        @block_size,
    -** Processing line: ~        "sprites/square-green.png",~
    +      # have a piece in it.
    +** Processing line: ~      __, __, space = all_spaces.find do |__, __, space|~
     - Inside source: true
     *** True Line Result
    -        "sprites/square-green.png",
    -** Processing line: ~        @rotation~
    +      __, __, space = all_spaces.find do |__, __, space|
    +** Processing line: ~        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece~
     - Inside source: true
     *** True Line Result
    -        @rotation
    -** Processing line: ~      ]~
    +        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      ]
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.outputs.lines << @imaginary_line~
    +** Processing line: ~      # The piece that goes into the space belongs to the player whose turn it currently is.~
     - Inside source: true
     *** True Line Result
    -      args.outputs.lines << @imaginary_line
    -** Processing line: ~      args.outputs.solids << @debug_shape~
    +      # The piece that goes into the space belongs to the player whose turn it currently is.
    +** Processing line: ~      return unless space~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << @debug_shape
    +      return unless space
    +** Processing line: ~      space.piece = state.current_turn~
    +- Inside source: true
    +*** True Line Result
    +      space.piece = state.current_turn
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~      # This ternary operator statement allows us to change the current player's turn.~
    +- Inside source: true
    +*** True Line Result
    +      # This ternary operator statement allows us to change the current player's turn.
    +** Processing line: ~      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.~
    +- Inside source: true
    +*** True Line Result
    +      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    +** Processing line: ~      state.current_turn = state.current_turn == :x ? :o : :x~
    +- Inside source: true
    +*** True Line Result
    +      state.current_turn = state.current_turn == :x ? :o : :x
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -30368,10 +38319,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def multiply_matricies~
    +** Processing line: ~    # Resets the game.~
     - Inside source: true
     *** True Line Result
    -    def multiply_matricies
    +    # Resets the game.
    +** Processing line: ~    def input_restart_game~
    +- Inside source: true
    +*** True Line Result
    +    def input_restart_game
    +** Processing line: ~      return unless state.game_over~
    +- Inside source: true
    +*** True Line Result
    +      return unless state.game_over
    +** Processing line: ~      gtk.reset~
    +- Inside source: true
    +*** True Line Result
    +      gtk.reset
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -30380,22 +38343,38 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc args~
    +** Processing line: ~    # Checks if x or o won the game.~
     - Inside source: true
     *** True Line Result
    -    def calc args
    -** Processing line: ~      if collision? args~
    +    # Checks if x or o won the game.
    +** Processing line: ~    # If neither player wins and all nine squares are filled, a draw happens.~
     - Inside source: true
     *** True Line Result
    -      if collision? args
    -** Processing line: ~          collide args~
    +    # If neither player wins and all nine squares are filled, a draw happens.
    +** Processing line: ~    # Once a player is chosen as the winner or a draw happens, the game is over.~
     - Inside source: true
     *** True Line Result
    -          collide args
    -** Processing line: ~      end~
    +    # Once a player is chosen as the winner or a draw happens, the game is over.
    +** Processing line: ~    def determine_winner~
     - Inside source: true
     *** True Line Result
    -      end
    +    def determine_winner
    +** Processing line: ~      state.x_won = won? :x # evaluates to either true or false (boolean values)~
    +- Inside source: true
    +*** True Line Result
    +      state.x_won = won? :x # evaluates to either true or false (boolean values)
    +** Processing line: ~      state.o_won = won? :o~
    +- Inside source: true
    +*** True Line Result
    +      state.o_won = won? :o
    +** Processing line: ~      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won~
    +- Inside source: true
    +*** True Line Result
    +      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    +** Processing line: ~      state.game_over = state.x_won || state.o_won || state.draw~
    +- Inside source: true
    +*** True Line Result
    +      state.game_over = state.x_won || state.o_won || state.draw
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -30404,134 +38383,262 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #Determine if the ball and block are touching~
    +** Processing line: ~    # Determines if a player won by checking if there is a horizontal match or vertical match.~
     - Inside source: true
     *** True Line Result
    -    #Determine if the ball and block are touching
    -** Processing line: ~    def collision? args~
    +    # Determines if a player won by checking if there is a horizontal match or vertical match.
    +** Processing line: ~    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.~
     - Inside source: true
     *** True Line Result
    -    def collision? args
    -** Processing line: ~      #The minimum area enclosed by the center of the ball and the 2 corners of the block~
    +    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    +** Processing line: ~    def won? piece~
     - Inside source: true
     *** True Line Result
    -      #The minimum area enclosed by the center of the ball and the 2 corners of the block
    -** Processing line: ~      #If the area ever drops below this value, we know there is a collision~
    +    def won? piece
    +** Processing line: ~      # performs action on all space combinations~
     - Inside source: true
     *** True Line Result
    -      #If the area ever drops below this value, we know there is a collision
    -** Processing line: ~      min_area = ((@block_size * 3) * args.state.ball.radius) / 2~
    +      # performs action on all space combinations
    +** Processing line: ~      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|~
     - Inside source: true
     *** True Line Result
    -      min_area = ((@block_size * 3) * args.state.ball.radius) / 2
    +      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #https://www.mathopenref.com/coordtrianglearea.html~
    +** Processing line: ~        # Checks if the 3 grid spaces with the same y value (or same row) and~
     - Inside source: true
     *** True Line Result
    -      #https://www.mathopenref.com/coordtrianglearea.html
    -** Processing line: ~      ax = @x1~
    +        # Checks if the 3 grid spaces with the same y value (or same row) and
    +** Processing line: ~        # x values that are next to each other have pieces that belong to the same player.~
     - Inside source: true
     *** True Line Result
    -      ax = @x1
    -** Processing line: ~      ay = @y1~
    +        # x values that are next to each other have pieces that belong to the same player.
    +** Processing line: ~        # Remember, the value of piece is equal to the current turn (which is the player).~
     - Inside source: true
     *** True Line Result
    -      ay = @y1
    -** Processing line: ~      bx = @x2~
    +        # Remember, the value of piece is equal to the current turn (which is the player).
    +** Processing line: ~        horizontal_match = state.spaces[xs[0]][y].piece == piece &&~
     - Inside source: true
     *** True Line Result
    -      bx = @x2
    -** Processing line: ~      by = @y2~
    +        horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    +** Processing line: ~                           state.spaces[xs[1]][y].piece == piece &&~
     - Inside source: true
     *** True Line Result
    -      by = @y2
    -** Processing line: ~      cx = args.state.ball.center.x~
    +                           state.spaces[xs[1]][y].piece == piece &&
    +** Processing line: ~                           state.spaces[xs[2]][y].piece == piece~
     - Inside source: true
     *** True Line Result
    -      cx = args.state.ball.center.x
    -** Processing line: ~      cy = args.state.ball.center.y~
    +                           state.spaces[xs[2]][y].piece == piece
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      cy = args.state.ball.center.y
    +
    +** Processing line: ~        # Checks if the 3 grid spaces with the same x value (or same column) and~
    +- Inside source: true
    +*** True Line Result
    +        # Checks if the 3 grid spaces with the same x value (or same column) and
    +** Processing line: ~        # y values that are next to each other have pieces that belong to the same player.~
    +- Inside source: true
    +*** True Line Result
    +        # y values that are next to each other have pieces that belong to the same player.
    +** Processing line: ~        # The && represents an "and" statement: if even one part of the statement is false,~
    +- Inside source: true
    +*** True Line Result
    +        # The && represents an "and" statement: if even one part of the statement is false,
    +** Processing line: ~        # the entire statement evaluates to false.~
    +- Inside source: true
    +*** True Line Result
    +        # the entire statement evaluates to false.
    +** Processing line: ~        vertical_match = state.spaces[y][xs[0]].piece == piece &&~
    +- Inside source: true
    +*** True Line Result
    +        vertical_match = state.spaces[y][xs[0]].piece == piece &&
    +** Processing line: ~                         state.spaces[y][xs[1]].piece == piece &&~
    +- Inside source: true
    +*** True Line Result
    +                         state.spaces[y][xs[1]].piece == piece &&
    +** Processing line: ~                         state.spaces[y][xs[2]].piece == piece~
    +- Inside source: true
    +*** True Line Result
    +                         state.spaces[y][xs[2]].piece == piece
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      current_area = (ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))/2~
    +** Processing line: ~        horizontal_match || vertical_match # if either is true, true is returned~
     - Inside source: true
     *** True Line Result
    -      current_area = (ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))/2
    +        horizontal_match || vertical_match # if either is true, true is returned
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      collision = false~
    +** Processing line: ~      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.~
     - Inside source: true
     *** True Line Result
    -      collision = false
    -** Processing line: ~      if @rotation >= 0~
    +      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    +** Processing line: ~      # Is added to won regardless of whether the statement is true or false.~
     - Inside source: true
     *** True Line Result
    -      if @rotation >= 0
    -** Processing line: ~        if (current_area < min_area &&~
    +      # Is added to won regardless of whether the statement is true or false.
    +** Processing line: ~      won << (state.spaces[-1][-1].piece == piece && # bottom left~
     - Inside source: true
     *** True Line Result
    -        if (current_area < min_area &&
    -** Processing line: ~          current_area > 0 &&~
    +      won << (state.spaces[-1][-1].piece == piece && # bottom left
    +** Processing line: ~              state.spaces[ 0][ 0].piece == piece && # center~
     - Inside source: true
     *** True Line Result
    -          current_area > 0 &&
    -** Processing line: ~          args.state.ball.center.y > @y1 &&~
    +              state.spaces[ 0][ 0].piece == piece && # center
    +** Processing line: ~              state.spaces[ 1][ 1].piece == piece)   # top right~
     - Inside source: true
     *** True Line Result
    -          args.state.ball.center.y > @y1 &&
    -** Processing line: ~          args.state.ball.center.x < @x2)~
    +              state.spaces[ 1][ 1].piece == piece)   # top right
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          args.state.ball.center.x < @x2)
    +
    +** Processing line: ~      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left~
    +- Inside source: true
    +*** True Line Result
    +      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    +** Processing line: ~      # and is added to won.~
    +- Inside source: true
    +*** True Line Result
    +      # and is added to won.
    +** Processing line: ~      won << (state.spaces[ 1][-1].piece == piece && # bottom right~
    +- Inside source: true
    +*** True Line Result
    +      won << (state.spaces[ 1][-1].piece == piece && # bottom right
    +** Processing line: ~              state.spaces[ 0][ 0].piece == piece && # center~
    +- Inside source: true
    +*** True Line Result
    +              state.spaces[ 0][ 0].piece == piece && # center
    +** Processing line: ~              state.spaces[-1][ 1].piece == piece)   # top left~
    +- Inside source: true
    +*** True Line Result
    +              state.spaces[-1][ 1].piece == piece)   # top left
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          collision = true~
    +** Processing line: ~      # Any false statements (meaning false diagonal matches) are rejected from won~
     - Inside source: true
     *** True Line Result
    -          collision = true
    -** Processing line: ~        end~
    +      # Any false statements (meaning false diagonal matches) are rejected from won
    +** Processing line: ~      won.reject_false.any?~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      else~
    +      won.reject_false.any?
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        if (current_area < min_area &&~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if (current_area < min_area &&
    -** Processing line: ~          current_area > 0 &&~
    +
    +** Processing line: ~    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.~
     - Inside source: true
     *** True Line Result
    -          current_area > 0 &&
    -** Processing line: ~          args.state.ball.center.y > @y2 &&~
    +    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    +** Processing line: ~    # The ! before a statement means "not". For example, we are rejecting any space combinations that do~
     - Inside source: true
     *** True Line Result
    -          args.state.ball.center.y > @y2 &&
    -** Processing line: ~          args.state.ball.center.x > @x1)~
    +    # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    +** Processing line: ~    # NOT have pieces in them.~
     - Inside source: true
     *** True Line Result
    -          args.state.ball.center.x > @x1)
    +    # NOT have pieces in them.
    +** Processing line: ~    def filled_spaces~
    +- Inside source: true
    +*** True Line Result
    +    def filled_spaces
    +** Processing line: ~      state.space_combinations~
    +- Inside source: true
    +*** True Line Result
    +      state.space_combinations
    +** Processing line: ~        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them~
    +- Inside source: true
    +*** True Line Result
    +        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    +** Processing line: ~        .map do |x, y|~
    +- Inside source: true
    +*** True Line Result
    +        .map do |x, y|
    +** Processing line: ~          if block_given?~
    +- Inside source: true
    +*** True Line Result
    +          if block_given?
    +** Processing line: ~            yield x, y, state.spaces[x][y]~
    +- Inside source: true
    +*** True Line Result
    +            yield x, y, state.spaces[x][y]
    +** Processing line: ~          else~
    +- Inside source: true
    +*** True Line Result
    +          else
    +** Processing line: ~            [x, y, state.spaces[x][y]] # sets definition of space~
    +- Inside source: true
    +*** True Line Result
    +            [x, y, state.spaces[x][y]] # sets definition of space
    +** 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: ~        collision = true~
    +** Processing line: ~    # Defines all spaces on the board.~
     - Inside source: true
     *** True Line Result
    -        collision = true
    +    # Defines all spaces on the board.
    +** Processing line: ~    def all_spaces~
    +- Inside source: true
    +*** True Line Result
    +    def all_spaces
    +** Processing line: ~      if !block_given?~
    +- Inside source: true
    +*** True Line Result
    +      if !block_given?
    +** Processing line: ~        state.space_combinations.map do |x, y|~
    +- Inside source: true
    +*** True Line Result
    +        state.space_combinations.map do |x, y|
    +** Processing line: ~          [x, y, state.spaces[x][y]] # sets definition of space~
    +- Inside source: true
    +*** True Line Result
    +          [x, y, state.spaces[x][y]] # sets definition of space
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
    +** Processing line: ~      else # if a block is given (block_given? is true)~
    +- Inside source: true
    +*** True Line Result
    +      else # if a block is given (block_given? is true)
    +** Processing line: ~        state.space_combinations.map do |x, y|~
    +- Inside source: true
    +*** True Line Result
    +        state.space_combinations.map do |x, y|
    +** Processing line: ~          yield x, y, state.spaces[x][y] # yield if a block is given~
    +- Inside source: true
    +*** True Line Result
    +          yield x, y, state.spaces[x][y] # yield if a block is given
     ** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    @@ -30540,570 +38647,702 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
           end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return collision~
    +** Processing line: ~    # Sets values for a label, such as the position, value, size, alignment, and color.~
     - Inside source: true
     *** True Line Result
    -      return collision
    +    # Sets values for a label, such as the position, value, size, alignment, and color.
    +** Processing line: ~    def label x, y, value~
    +- Inside source: true
    +*** True Line Result
    +    def label x, y, value
    +** Processing line: ~      [x, y + 10, value, 20, 1, 0, 0, 0]~
    +- Inside source: true
    +*** True Line Result
    +      [x, y + 10, value, 20, 1, 0, 0, 0]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def collide args~
    +** Processing line: ~  $tic_tac_toe = TicTacToe.new~
     - Inside source: true
     *** True Line Result
    -    def collide args
    -** Processing line: ~      #Slope of the block~
    +  $tic_tac_toe = TicTacToe.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      #Slope of the block
    -** Processing line: ~      slope = (@y2 - @y1) / (@x2 - @x1)~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      slope = (@y2 - @y1) / (@x2 - @x1)
    +  def tick args
    +** Processing line: ~    $tic_tac_toe._       = args~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe._       = args
    +** Processing line: ~    $tic_tac_toe.state   = args.state~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.state   = args.state
    +** Processing line: ~    $tic_tac_toe.outputs = args.outputs~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.outputs = args.outputs
    +** Processing line: ~    $tic_tac_toe.inputs  = args.inputs~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.inputs  = args.inputs
    +** Processing line: ~    $tic_tac_toe.grid    = args.grid~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.grid    = args.grid
    +** Processing line: ~    $tic_tac_toe.gtk     = args.gtk~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.gtk     = args.gtk
    +** Processing line: ~    $tic_tac_toe.tick~
    +- Inside source: true
    +*** True Line Result
    +    $tic_tac_toe.tick
    +** Processing line: ~    tick_instructions args, "Sample app shows how to work with mouse clicks."~
    +- Inside source: true
    +*** True Line Result
    +    tick_instructions args, "Sample app shows how to work with mouse clicks."
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Create a unit vector and tilt it (@rotation) number of degrees~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -      #Create a unit vector and tilt it (@rotation) number of degrees
    -** Processing line: ~      x = -Math.cos(@rotation * DEGREES_TO_RADIANS)~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -      x = -Math.cos(@rotation * DEGREES_TO_RADIANS)
    -** Processing line: ~      y = Math.sin(@rotation * DEGREES_TO_RADIANS)~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -      y = Math.sin(@rotation * DEGREES_TO_RADIANS)
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +- Inside source: true
    +*** True Line Result
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +- Inside source: true
    +*** True Line Result
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +- Inside source: true
    +*** True Line Result
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
    +- Inside source: true
    +*** True Line Result
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Find the vector that is perpendicular to the slope~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -      #Find the vector that is perpendicular to the slope
    -** Processing line: ~      perpVect = { x: x, y: y }~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      perpVect = { x: x, y: y }
    -** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect
    -** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball~
    +** 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: ~*** Mouse - Mouse Move - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Mouse - Mouse Move - 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/05_mouse/02_mouse_move/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball
    -** Processing line: ~        x:args.state.ball.center.x-args.state.ball.velocity.x,~
    +  # ./samples/05_mouse/02_mouse_move/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -        x:args.state.ball.center.x-args.state.ball.velocity.x,
    -** Processing line: ~        y:args.state.ball.center.y-args.state.ball.velocity.y~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        y:args.state.ball.center.y-args.state.ball.velocity.y
    -** Processing line: ~      }~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -      }
    +   Reminders:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball~
    +** Processing line: ~   - num1.greater(num2): Returns the greater value.~
     - Inside source: true
     *** True Line Result
    -      velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball
    -** Processing line: ~      theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x)         #the angle of the ball's velocity~
    +   - num1.greater(num2): Returns the greater value.
    +** Processing line: ~     For example, if we have the command~
     - Inside source: true
     *** True Line Result
    -      theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x)         #the angle of the ball's velocity
    -** Processing line: ~      theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)~
    +     For example, if we have the command
    +** Processing line: ~     puts 4.greater(3)~
     - Inside source: true
     *** True Line Result
    -      theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)
    +     puts 4.greater(3)
    +** Processing line: ~     the number 4 would be printed to the console since it has a greater value than 3.~
    +- Inside source: true
    +*** True Line Result
    +     the number 4 would be printed to the console since it has a greater value than 3.
    +** Processing line: ~     Similar to lesser, which returns the lesser value.~
    +- Inside source: true
    +*** True Line Result
    +     Similar to lesser, which returns the lesser value.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity~
    +** Processing line: ~   - find_all: Finds all elements of a collection that meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity
    -** Processing line: ~      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity~
    +   - find_all: Finds all elements of a collection that meet certain requirements.
    +** Processing line: ~     For example, in this sample app, we're using find_all to find all zombies that have intersected~
     - Inside source: true
     *** True Line Result
    -      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity
    +     For example, in this sample app, we're using find_all to find all zombies that have intersected
    +** Processing line: ~     or hit the player's sprite since these zombies have been killed.~
    +- Inside source: true
    +*** True Line Result
    +     or hit the player's sprite since these zombies have been killed.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      frx = velocityMag * Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +** Processing line: ~   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.~
     - Inside source: true
     *** True Line Result
    -      frx = velocityMag * Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx
    -** Processing line: ~      fry = velocityMag * Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby~
    +   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    +** Processing line: ~     Stores the frame the "down" event occurred.~
     - Inside source: true
     *** True Line Result
    -      fry = velocityMag * Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby
    +     Stores the frame the "down" event occurred.
    +** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
    +- Inside source: true
    +*** True Line Result
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.display_value = velocityMag~
    +** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
     - Inside source: true
     *** True Line Result
    -      args.state.display_value = velocityMag
    -** Processing line: ~      fsumx = fbx+frx                                                             #sum of x forces~
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -      fsumx = fbx+frx                                                             #sum of x forces
    -** Processing line: ~      fsumy = fby+fry                                                             #sum of y forces~
    +     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -      fsumy = fby+fry                                                             #sum of y forces
    -** Processing line: ~      fr = velocityMag                                                            #fr is the resulting magnitude~
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      fr = velocityMag                                                            #fr is the resulting magnitude
    -** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)                                         #thetaNew is the resulting angle~
    +
    +** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
     - Inside source: true
     *** True Line Result
    -      thetaNew = Math.atan2(fsumy, fsumx)                                         #thetaNew is the resulting angle
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +** Processing line: ~     When we want to create a new object, we can declare it as a new entity and then define~
    +- Inside source: true
    +*** True Line Result
    +     When we want to create a new object, we can declare it as a new entity and then define
    +** Processing line: ~     its properties. (Remember, you can use state to define ANY property and it will~
    +- Inside source: true
    +*** True Line Result
    +     its properties. (Remember, you can use state to define ANY property and it will
    +** Processing line: ~     be retained across frames.)~
    +- Inside source: true
    +*** True Line Result
    +     be retained across frames.)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      xnew = fr*Math.cos(thetaNew)                                                #resulting x velocity~
    +** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -      xnew = fr*Math.cos(thetaNew)                                                #resulting x velocity
    -** Processing line: ~      ynew = fr*Math.sin(thetaNew)                                                #resulting y velocity~
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -      ynew = fr*Math.sin(thetaNew)                                                #resulting y velocity
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      dampener = 0.3~
    +** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
     - Inside source: true
     *** True Line Result
    -      dampener = 0.3
    -** Processing line: ~      ynew *= dampener * 0.5~
    +   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    +** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
     - Inside source: true
     *** True Line Result
    -      ynew *= dampener * 0.5
    +     Can be used to perform an action on every element of a collection, such as multiplying
    +** Processing line: ~     each element by 2 or declaring every element as a new entity.~
    +- Inside source: true
    +*** True Line Result
    +     each element by 2 or declaring every element as a new entity.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity~
    +** Processing line: ~   - sample: Chooses a random element from the array.~
     - Inside source: true
     *** True Line Result
    -      #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity
    -** Processing line: ~      if ynew > -0.1~
    +   - sample: Chooses a random element from the array.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if ynew > -0.1
    -** Processing line: ~        xnew *= dampener~
    +
    +** Processing line: ~   - reject: Removes elements that meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -        xnew *= dampener
    -** Processing line: ~      end~
    +   - reject: Removes elements that meet certain requirements.
    +** Processing line: ~     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also~
     - Inside source: true
     *** True Line Result
    -      end
    +     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    +** Processing line: ~     rejecting zombies that were killed more than 30 frames ago.~
    +- Inside source: true
    +*** True Line Result
    +     rejecting zombies that were killed more than 30 frames ago.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Add the sine component of gravity back in (X component)~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      #Add the sine component of gravity back in (X component)
    -** Processing line: ~      gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)
    -** Processing line: ~      xnew += gravity_x~
    +
    +** Processing line: ~  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal~
     - Inside source: true
     *** True Line Result
    -      xnew += gravity_x
    +  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    +** Processing line: ~  # is to kill the zombies as fast as possible!~
    +- Inside source: true
    +*** True Line Result
    +  # is to kill the zombies as fast as possible!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.ball.velocity.x = -xnew~
    +** Processing line: ~  class ProtectThePuppiesFromTheZombies~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.velocity.x = -xnew
    -** Processing line: ~      args.state.ball.velocity.y = -ynew~
    +  class ProtectThePuppiesFromTheZombies
    +** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.velocity.y = -ynew
    +    attr_accessor :grid, :inputs, :state, :outputs
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Set the position of the ball to the previous position so it doesn't warp throught the block~
    +** Processing line: ~    # Calls the methods necessary for the game to run properly.~
     - Inside source: true
     *** True Line Result
    -      #Set the position of the ball to the previous position so it doesn't warp throught the block
    -** Processing line: ~      args.state.ball.center.x = previousPosition.x~
    +    # Calls the methods necessary for the game to run properly.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.center.x = previousPosition.x
    -** Processing line: ~      args.state.ball.center.y = previousPosition.y~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.center.y = previousPosition.y
    -** Processing line: ~    end~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      render
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      calc
    +** Processing line: ~      input~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +      input
    +** Processing line: ~    end~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Bouncing On Collision - cannon.rb~
    -- Header detected.
    +** Processing line: ~    # Sets default values for the zombies and for the player.~
    +- Inside source: true
     *** True Line Result
    -
    +    # Sets default values for the zombies and for the player.
    +** Processing line: ~    # Initialization happens only in the first frame.~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Bouncing On Collision - cannon.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    # Initialization happens only in the first frame.
    +** Processing line: ~    def defaults~
    +- Inside source: true
     *** True Line Result
    -
    +    def defaults
    +** Processing line: ~      state.flash_at               ||= 0~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb~
    +      state.flash_at               ||= 0
    +** Processing line: ~      state.zombie_min_spawn_rate  ||= 60~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb
    -** Processing line: ~  class Cannon~
    +      state.zombie_min_spawn_rate  ||= 60
    +** Processing line: ~      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate~
     - Inside source: true
     *** True Line Result
    -  class Cannon
    -** Processing line: ~    def initialize args~
    +      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    +** Processing line: ~      state.zombies                ||= []~
     - Inside source: true
     *** True Line Result
    -    def initialize args
    -** Processing line: ~      @pointA = {x: args.grid.right/2,y: args.grid.top}~
    +      state.zombies                ||= []
    +** Processing line: ~      state.killed_zombies         ||= []~
     - Inside source: true
     *** True Line Result
    -      @pointA = {x: args.grid.right/2,y: args.grid.top}
    -** Processing line: ~      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}~
    +      state.killed_zombies         ||= []
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
    -** Processing line: ~    end~
    +
    +** Processing line: ~      # Declares player as a new entity and sets its properties.~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    def update args~
    +      # Declares player as a new entity and sets its properties.
    +** Processing line: ~      # The player begins the game in the center of the screen, not moving in any direction.~
     - Inside source: true
     *** True Line Result
    -    def update args
    -** Processing line: ~      activeBall = args.state.ball~
    +      # The player begins the game in the center of the screen, not moving in any direction.
    +** Processing line: ~      state.player ||= state.new_entity(:player, { x: 640,~
     - Inside source: true
     *** True Line Result
    -      activeBall = args.state.ball
    -** Processing line: ~      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}~
    +      state.player ||= state.new_entity(:player, { x: 640,
    +** Processing line: ~                                                 y: 360,~
    +- Inside source: true
    +*** True Line Result
    +                                                 y: 360,
    +** Processing line: ~                                                 attack_angle: 0,~
    +- Inside source: true
    +*** True Line Result
    +                                                 attack_angle: 0,
    +** Processing line: ~                                                 dx: 0,~
    +- Inside source: true
    +*** True Line Result
    +                                                 dx: 0,
    +** Processing line: ~                                                 dy: 0 })~
    +- Inside source: true
    +*** True Line Result
    +                                                 dy: 0 })
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if args.inputs.mouse.click~
    -- Inside source: true
    -*** True Line Result
    -      if args.inputs.mouse.click
    -** Processing line: ~        alpha = 0.01~
    +** Processing line: ~    # Outputs a gray background.~
     - Inside source: true
     *** True Line Result
    -        alpha = 0.01
    -** Processing line: ~        activeBall.velocity.y = (@pointB.y - @pointA.y) * alpha~
    +    # Outputs a gray background.
    +** Processing line: ~    # Calls the methods needed to output the player, zombies, etc onto the screen.~
     - Inside source: true
     *** True Line Result
    -        activeBall.velocity.y = (@pointB.y - @pointA.y) * alpha
    -** Processing line: ~        activeBall.velocity.x = (@pointB.x - @pointA.x) * alpha~
    +    # Calls the methods needed to output the player, zombies, etc onto the screen.
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -        activeBall.velocity.x = (@pointB.x - @pointA.x) * alpha
    -** Processing line: ~        activeBall.center = {x: (args.grid.w / 2), y: (args.grid.h)}~
    +    def render
    +** Processing line: ~      outputs.solids << [grid.rect, 100, 100, 100]~
     - Inside source: true
     *** True Line Result
    -        activeBall.center = {x: (args.grid.w / 2), y: (args.grid.h)}
    -** Processing line: ~      end~
    +      outputs.solids << [grid.rect, 100, 100, 100]
    +** Processing line: ~      render_zombies~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      render_zombies
    +** Processing line: ~      render_killed_zombies~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    def render args~
    +      render_killed_zombies
    +** Processing line: ~      render_player~
     - Inside source: true
     *** True Line Result
    -    def render args
    -** Processing line: ~      args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y]~
    +      render_player
    +** Processing line: ~      render_flash~
     - Inside source: true
     *** True Line Result
    -      args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y]
    +      render_flash
     ** 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: ~*** Physics And Collisions - Bouncing On Collision - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Bouncing On Collision - 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/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb~
    -- Inside source: true
    -*** True Line Result
    -  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
    -** Processing line: ~  INFINITY= 10**10~
    +** Processing line: ~    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.~
     - Inside source: true
     *** True Line Result
    -  INFINITY= 10**10
    -** Processing line: ~~
    +    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    +** Processing line: ~    def render_zombies~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  require 'app/vector2d.rb'~
    +    def render_zombies
    +** Processing line: ~      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection~
     - Inside source: true
     *** True Line Result
    -  require 'app/vector2d.rb'
    -** Processing line: ~  require 'app/peg.rb'~
    +      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    +** Processing line: ~        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method~
     - Inside source: true
     *** True Line Result
    -  require 'app/peg.rb'
    -** Processing line: ~  require 'app/block.rb'~
    +        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    +** Processing line: ~        z.sprite~
     - Inside source: true
     *** True Line Result
    -  require 'app/block.rb'
    -** Processing line: ~  require 'app/ball.rb'~
    +        z.sprite
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  require 'app/ball.rb'
    -** Processing line: ~  require 'app/cannon.rb'~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  require 'app/cannon.rb'
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Method to init default values~
    +    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    +** Processing line: ~    def render_killed_zombies~
     - Inside source: true
     *** True Line Result
    -  #Method to init default values
    -** Processing line: ~  def defaults args~
    +    def render_killed_zombies
    +** Processing line: ~      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    args.state.pegs ||= []~
    +      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    +** Processing line: ~        z.sprite = [z.x,~
     - Inside source: true
     *** True Line Result
    -    args.state.pegs ||= []
    -** Processing line: ~    args.state.blocks ||= []~
    +        z.sprite = [z.x,
    +** Processing line: ~                    z.y,~
     - Inside source: true
     *** True Line Result
    -    args.state.blocks ||= []
    -** Processing line: ~    args.state.cannon ||= Cannon.new args~
    +                    z.y,
    +** Processing line: ~                    4 * 3,~
     - Inside source: true
     *** True Line Result
    -    args.state.cannon ||= Cannon.new args
    -** Processing line: ~    args.state.ball ||= Ball.new args~
    +                    4 * 3,
    +** Processing line: ~                    8 * 3,~
     - Inside source: true
     *** True Line Result
    -    args.state.ball ||= Ball.new args
    -** Processing line: ~    args.state.horizontal_offset ||= 0~
    +                    8 * 3,
    +** Processing line: ~                    animation_sprite(z, z.death_at), # calls animation_sprite method~
     - Inside source: true
     *** True Line Result
    -    args.state.horizontal_offset ||= 0
    -** Processing line: ~    init_pegs args~
    +                    animation_sprite(z, z.death_at), # calls animation_sprite method
    +** Processing line: ~                    0, # angle~
     - Inside source: true
     *** True Line Result
    -    init_pegs args
    -** Processing line: ~    init_blocks args~
    +                    0, # angle
    +** Processing line: ~                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die~
     - Inside source: true
     *** True Line Result
    -    init_blocks args
    +                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    +** Processing line: ~                    # change the value of 30 and see what happens when a zombie is killed~
    +- Inside source: true
    +*** True Line Result
    +                    # change the value of 30 and see what happens when a zombie is killed
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.display_value ||= "test"~
    +** Processing line: ~        # Sets values to output the slash over the zombie's sprite when a zombie is killed.~
     - Inside source: true
     *** True Line Result
    -    args.state.display_value ||= "test"
    -** Processing line: ~  end~
    +        # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    +** Processing line: ~        # The slash is tilted 45 degrees from the angle of the player's attack.~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        # The slash is tilted 45 degrees from the angle of the player's attack.
    +** Processing line: ~        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  begin :default_methods~
    +        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    +** Processing line: ~        # the slash over the killed zombie's sprite.~
     - Inside source: true
     *** True Line Result
    -  begin :default_methods
    -** Processing line: ~    def init_pegs args~
    +        # the slash over the killed zombie's sprite.
    +** Processing line: ~        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]~
     - Inside source: true
     *** True Line Result
    -    def init_pegs args
    -** Processing line: ~      num_horizontal_pegs = 14~
    +        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      num_horizontal_pegs = 14
    -** Processing line: ~      num_rows = 5~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      num_rows = 5
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return unless args.state.pegs.count < num_rows * num_horizontal_pegs~
    +** Processing line: ~    # Outputs the player sprite using the images in the sprites folder.~
     - Inside source: true
     *** True Line Result
    -      return unless args.state.pegs.count < num_rows * num_horizontal_pegs
    -** Processing line: ~~
    +    # Outputs the player sprite using the images in the sprites folder.
    +** Processing line: ~    def render_player~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      block_size = 32~
    +    def render_player
    +** Processing line: ~      state.player_sprite = [state.player.x,~
     - Inside source: true
     *** True Line Result
    -      block_size = 32
    -** Processing line: ~      block_spacing = 50~
    +      state.player_sprite = [state.player.x,
    +** Processing line: ~                             state.player.y,~
     - Inside source: true
     *** True Line Result
    -      block_spacing = 50
    -** Processing line: ~      total_width = num_horizontal_pegs * (block_size + block_spacing)~
    +                             state.player.y,
    +** Processing line: ~                            4 * 3,~
     - Inside source: true
     *** True Line Result
    -      total_width = num_horizontal_pegs * (block_size + block_spacing)
    -** Processing line: ~      starting_offset = (args.grid.w - total_width) / 2 + block_size~
    +                            4 * 3,
    +** Processing line: ~                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation~
     - Inside source: true
     *** True Line Result
    -      starting_offset = (args.grid.w - total_width) / 2 + block_size
    +                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    +** Processing line: ~      outputs.sprites << state.player_sprite~
    +- Inside source: true
    +*** True Line Result
    +      outputs.sprites << state.player_sprite
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      for i in (0...num_rows)~
    +** Processing line: ~      # Outputs a small red square that previews the angles that the player can attack in.~
     - Inside source: true
     *** True Line Result
    -      for i in (0...num_rows)
    -** Processing line: ~        for j in (0...num_horizontal_pegs)~
    +      # Outputs a small red square that previews the angles that the player can attack in.
    +** Processing line: ~      # It can be moved in a perfect circle around the player to show possible movements.~
     - Inside source: true
     *** True Line Result
    -        for j in (0...num_horizontal_pegs)
    -** Processing line: ~          row_offset = 0~
    +      # It can be moved in a perfect circle around the player to show possible movements.
    +** Processing line: ~      # Change the 60 in the parenthesis and see what happens to the movement of the red square.~
     - Inside source: true
     *** True Line Result
    -          row_offset = 0
    -** Processing line: ~          if i % 2 == 0~
    +      # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    +** Processing line: ~      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),~
     - Inside source: true
     *** True Line Result
    -          if i % 2 == 0
    -** Processing line: ~            row_offset = 20~
    +      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    +** Processing line: ~                          state.player.y + state.player.attack_angle.vector_y(60),~
     - Inside source: true
     *** True Line Result
    -            row_offset = 20
    -** Processing line: ~          else~
    +                          state.player.y + state.player.attack_angle.vector_y(60),
    +** Processing line: ~                          3, 3, 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -          else
    -** Processing line: ~            row_offset = -20~
    +                          3, 3, 255, 0, 0]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            row_offset = -20
    -** Processing line: ~          end~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          args.state.pegs.append(Peg.new(j * (block_size+block_spacing) + starting_offset + row_offset, (args.grid.h - block_size * 2) - (i * block_size * 2)-90, block_size))~
    +
    +** Processing line: ~    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.~
     - Inside source: true
     *** True Line Result
    -          args.state.pegs.append(Peg.new(j * (block_size+block_spacing) + starting_offset + row_offset, (args.grid.h - block_size * 2) - (i * block_size * 2)-90, block_size))
    -** Processing line: ~        end~
    +    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    +** Processing line: ~    def render_flash~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +    def render_flash
    +** Processing line: ~      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    +** Processing line: ~      # Transparency gradually changes (or eases) during the 10 frames of flash.~
     - Inside source: true
     *** True Line Result
    -
    +      # Transparency gradually changes (or eases) during the 10 frames of flash.
    +** Processing line: ~      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid~
    +- Inside source: true
    +*** True Line Result
    +      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -31112,150 +39351,174 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def init_blocks args~
    +** Processing line: ~    # Calls all methods necessary for performing calculations.~
     - Inside source: true
     *** True Line Result
    -    def init_blocks args
    -** Processing line: ~      return unless args.state.blocks.count < 10~
    +    # Calls all methods necessary for performing calculations.
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -      return unless args.state.blocks.count < 10
    -** Processing line: ~~
    +    def calc
    +** Processing line: ~      calc_spawn_zombie~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #Sprites are rotated in degrees, but the Ruby math functions work on radians~
    +      calc_spawn_zombie
    +** Processing line: ~      calc_move_zombies~
     - Inside source: true
     *** True Line Result
    -      #Sprites are rotated in degrees, but the Ruby math functions work on radians
    -** Processing line: ~      radians_to_degrees = Math::PI / 180~
    +      calc_move_zombies
    +** Processing line: ~      calc_player~
     - Inside source: true
     *** True Line Result
    -      radians_to_degrees = Math::PI / 180
    +      calc_player
    +** Processing line: ~      calc_kill_zombie~
    +- Inside source: true
    +*** True Line Result
    +      calc_kill_zombie
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      block_size = 25~
    +** Processing line: ~    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.~
     - Inside source: true
     *** True Line Result
    -      block_size = 25
    -** Processing line: ~      #Rotation angle (in degrees) of the blocks~
    +    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    +** Processing line: ~    def calc_spawn_zombie~
     - Inside source: true
     *** True Line Result
    -      #Rotation angle (in degrees) of the blocks
    -** Processing line: ~      rotation = 30~
    +    def calc_spawn_zombie
    +** Processing line: ~      if state.zombie_spawn_countdown > 0~
     - Inside source: true
     *** True Line Result
    -      rotation = 30
    -** Processing line: ~      vertical_offset = block_size * Math.sin(rotation * radians_to_degrees)~
    +      if state.zombie_spawn_countdown > 0
    +** Processing line: ~        state.zombie_spawn_countdown -= 1~
     - Inside source: true
     *** True Line Result
    -      vertical_offset = block_size * Math.sin(rotation * radians_to_degrees)
    -** Processing line: ~      horizontal_offset = (3 * block_size) * Math.cos(rotation * radians_to_degrees)~
    +        state.zombie_spawn_countdown -= 1
    +** Processing line: ~        return~
     - Inside source: true
     *** True Line Result
    -      horizontal_offset = (3 * block_size) * Math.cos(rotation * radians_to_degrees)
    -** Processing line: ~      center = args.grid.w / 2~
    +        return
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      center = args.grid.w / 2
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      for i in (0...5)~
    +** Processing line: ~      # New zombies are created, positioned on the screen, and added to the zombies collection.~
     - Inside source: true
     *** True Line Result
    -      for i in (0...5)
    -** Processing line: ~        #Create a ramp of blocks. Not going to be perfect because of the float to integer conversion and anisotropic to isotropic coversion~
    +      # New zombies are created, positioned on the screen, and added to the zombies collection.
    +** Processing line: ~      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity~
     - Inside source: true
     *** True Line Result
    -        #Create a ramp of blocks. Not going to be perfect because of the float to integer conversion and anisotropic to isotropic coversion
    -** Processing line: ~        args.state.blocks.append(Block.new((center + 100 + (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, rotation))~
    +      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    +** Processing line: ~        if rand > 0.5~
     - Inside source: true
     *** True Line Result
    -        args.state.blocks.append(Block.new((center + 100 + (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, rotation))
    -** Processing line: ~        args.state.blocks.append(Block.new((center - 100 - (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, -rotation))~
    +        if rand > 0.5
    +** Processing line: ~          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)~
     - Inside source: true
     *** True Line Result
    -        args.state.blocks.append(Block.new((center - 100 - (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, -rotation))
    -** Processing line: ~      end~
    +          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    +** Processing line: ~          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    +** Processing line: ~          # the possible values exceed the screen's scope so zombies appear to be coming from far away~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +          # the possible values exceed the screen's scope so zombies appear to be coming from far away
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        else
    +** Processing line: ~          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Render loop~
    +          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    +** Processing line: ~          z.y = grid.rect.w.randomize(:ratio) # random y position on screen~
     - Inside source: true
     *** True Line Result
    -  #Render loop
    -** Processing line: ~  def render args~
    +          z.y = grid.rect.w.randomize(:ratio) # random y position on screen
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    args.outputs.borders << args.state.game_area~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.game_area
    -** Processing line: ~    render_pegs args~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    render_pegs args
    -** Processing line: ~    render_blocks args~
    +
    +** Processing line: ~      # Calls random_spawn_countdown method (determines how fast new zombies appear)~
     - Inside source: true
     *** True Line Result
    -    render_blocks args
    -** Processing line: ~    args.state.cannon.render args~
    +      # Calls random_spawn_countdown method (determines how fast new zombies appear)
    +** Processing line: ~      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate~
     - Inside source: true
     *** True Line Result
    -    args.state.cannon.render args
    -** Processing line: ~    args.state.ball.draw args~
    +      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    +** Processing line: ~      state.zombie_min_spawn_rate -= 1~
     - Inside source: true
     *** True Line Result
    -    args.state.ball.draw args
    -** Processing line: ~  end~
    +      state.zombie_min_spawn_rate -= 1
    +** Processing line: ~      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater~
     - Inside source: true
     *** True Line Result
    -  end
    +      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    +** Processing line: ~      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)~
    +- Inside source: true
    +*** True Line Result
    +      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin :render_methods~
    +** Processing line: ~    # Moves all zombies towards the center of the screen.~
     - Inside source: true
     *** True Line Result
    -  begin :render_methods
    -** Processing line: ~    #Draw the pegs in a grid pattern~
    +    # Moves all zombies towards the center of the screen.
    +** Processing line: ~    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.~
     - Inside source: true
     *** True Line Result
    -    #Draw the pegs in a grid pattern
    -** Processing line: ~    def render_pegs args~
    +    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    +** Processing line: ~    def calc_move_zombies~
     - Inside source: true
     *** True Line Result
    -    def render_pegs args
    -** Processing line: ~      args.state.pegs.each do |peg|~
    +    def calc_move_zombies
    +** Processing line: ~      state.zombies.each do |z| # for each zombie in the collection~
     - Inside source: true
     *** True Line Result
    -      args.state.pegs.each do |peg|
    -** Processing line: ~        peg.draw args~
    +      state.zombies.each do |z| # for each zombie in the collection
    +** Processing line: ~        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1~
     - Inside source: true
     *** True Line Result
    -        peg.draw args
    +        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    +** Processing line: ~        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center~
    +- Inside source: true
    +*** True Line Result
    +        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    +** Processing line: ~      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center~
    +- Inside source: true
    +*** True Line Result
    +      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -31264,54 +39527,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 render_blocks args~
    -- Inside source: true
    -*** True Line Result
    -    def render_blocks args
    -** Processing line: ~      args.state.blocks.each do |block|~
    +** Processing line: ~    # Calculates the position and movement of the player on the screen.~
     - Inside source: true
     *** True Line Result
    -      args.state.blocks.each do |block|
    -** Processing line: ~        block.draw args~
    +    # Calculates the position and movement of the player on the screen.
    +** Processing line: ~    def calc_player~
     - Inside source: true
     *** True Line Result
    -        block.draw args
    -** Processing line: ~      end~
    +    def calc_player
    +** Processing line: ~      state.player.x += state.player.dx # changes x based on dx (change in x)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      state.player.x += state.player.dx # changes x based on dx (change in x)
    +** Processing line: ~      state.player.y += state.player.dy # changes y based on dy (change in y)~
     - Inside source: true
     *** True Line Result
    -    end
    +      state.player.y += state.player.dy # changes y based on dy (change in y)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  end~
    +** Processing line: ~      state.player.dx *= 0.9 # scales dx down~
     - Inside source: true
     *** True Line Result
    -  end
    +      state.player.dx *= 0.9 # scales dx down
    +** Processing line: ~      state.player.dy *= 0.9 # scales dy down~
    +- Inside source: true
    +*** True Line Result
    +      state.player.dy *= 0.9 # scales dy down
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  #Calls all methods necessary for performing calculations~
    +** Processing line: ~      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.~
     - Inside source: true
     *** True Line Result
    -  #Calls all methods necessary for performing calculations
    -** Processing line: ~  def calc args~
    +      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    +** Processing line: ~      # This ensures that the player remains within the screen's scope.~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    args.state.pegs.each do |peg|~
    +      # This ensures that the player remains within the screen's scope.
    +** Processing line: ~      state.player.x = state.player.x.lesser(1280).greater(0)~
     - Inside source: true
     *** True Line Result
    -    args.state.pegs.each do |peg|
    -** Processing line: ~      peg.calc args~
    +      state.player.x = state.player.x.lesser(1280).greater(0)
    +** Processing line: ~      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y~
     - Inside source: true
     *** True Line Result
    -      peg.calc args
    +      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -31320,230 +39583,234 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.blocks.each do |block|~
    +** Processing line: ~    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection~
     - Inside source: true
     *** True Line Result
    -    args.state.blocks.each do |block|
    -** Processing line: ~      block.calc args~
    +    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    +** Processing line: ~    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.~
     - Inside source: true
     *** True Line Result
    -      block.calc args
    -** Processing line: ~    end~
    +    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    +** Processing line: ~    def calc_kill_zombie~
     - Inside source: true
     *** True Line Result
    -    end
    +    def calc_kill_zombie
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.ball.update args~
    +** Processing line: ~      # Find all zombies that intersect with the player. They are considered killed.~
     - Inside source: true
     *** True Line Result
    -    args.state.ball.update args
    -** Processing line: ~    args.state.cannon.update args~
    +      # Find all zombies that intersect with the player. They are considered killed.
    +** Processing line: ~      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }~
     - Inside source: true
     *** True Line Result
    -    args.state.cannon.update args
    -** Processing line: ~  end~
    +      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    +** Processing line: ~      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection~
     - Inside source: true
     *** True Line Result
    -  end
    +      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    +** Processing line: ~      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies~
    +- Inside source: true
    +*** True Line Result
    +      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin :calc_methods~
    +** Processing line: ~      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame~
     - Inside source: true
     *** True Line Result
    -  begin :calc_methods
    -** Processing line: ~~
    +      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    +** Processing line: ~        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  end~
    +        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    +** Processing line: ~      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)~
     - Inside source: true
     *** True Line Result
    -  end
    +      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    defaults args~
    +      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    +** Processing line: ~      # Death_at stores the frame a zombie was killed.~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +      # Death_at stores the frame a zombie was killed.
    +** Processing line: ~      killed_this_frame.each do |z|~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +      killed_this_frame.each do |z|
    +** Processing line: ~        z.death_at = state.tick_count~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~  end~
    +        z.death_at = state.tick_count
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Bouncing On Collision - peg.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Bouncing On Collision - peg.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    -*** True Line Result
    -
    +** Processing line: ~      # Zombies are rejected from the killed_zombies collection depending on when they were killed.~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb~
    +      # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    +** Processing line: ~      # They are rejected if more than 30 frames have passed since their death.~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb
    -** Processing line: ~  class Peg~
    +      # They are rejected if more than 30 frames have passed since their death.
    +** Processing line: ~      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }~
     - Inside source: true
     *** True Line Result
    -  class Peg
    -** Processing line: ~    def initialize(x, y, block_size)~
    +      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    def initialize(x, y, block_size)
    -** Processing line: ~      @x = x                    # x cordinate of the LEFT side of the peg~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @x = x                    # x cordinate of the LEFT side of the peg
    -** Processing line: ~      @y = y                    # y cordinate of the RIGHT side of the peg~
    +
    +** Processing line: ~    # Uses input from the user to move the player around the screen.~
     - Inside source: true
     *** True Line Result
    -      @y = y                    # y cordinate of the RIGHT side of the peg
    -** Processing line: ~      @block_size = block_size  # diameter of the peg~
    +    # Uses input from the user to move the player around the screen.
    +** Processing line: ~    def input~
     - Inside source: true
     *** True Line Result
    -      @block_size = block_size  # diameter of the peg
    +    def input
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @radius = @block_size/2.0 # radius of the peg~
    +** Processing line: ~      # If the "a" key or left key is pressed, the x position of the player decreases.~
     - Inside source: true
     *** True Line Result
    -      @radius = @block_size/2.0 # radius of the peg
    -** Processing line: ~      @center = {               # cordinatees of the CENTER of the peg~
    +      # If the "a" key or left key is pressed, the x position of the player decreases.
    +** Processing line: ~      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.~
     - Inside source: true
     *** True Line Result
    -      @center = {               # cordinatees of the CENTER of the peg
    -** Processing line: ~        x: @x+@block_size/2.0,~
    +      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    +** Processing line: ~      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left~
     - Inside source: true
     *** True Line Result
    -        x: @x+@block_size/2.0,
    -** Processing line: ~        y: @y+@block_size/2.0~
    +      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    +** Processing line: ~        state.player.x -= 5~
     - Inside source: true
     *** True Line Result
    -        y: @y+@block_size/2.0
    -** Processing line: ~      }~
    +        state.player.x -= 5
    +** Processing line: ~      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right~
     - Inside source: true
     *** True Line Result
    -      }
    +      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    +** Processing line: ~        state.player.x += 5~
    +- Inside source: true
    +*** True Line Result
    +        state.player.x += 5
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @r = 255 # color of the peg~
    +** Processing line: ~      # If the "w" or up key is pressed, the y position of the player increases.~
     - Inside source: true
     *** True Line Result
    -      @r = 255 # color of the peg
    -** Processing line: ~      @g = 0~
    +      # If the "w" or up key is pressed, the y position of the player increases.
    +** Processing line: ~      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.~
     - Inside source: true
     *** True Line Result
    -      @g = 0
    -** Processing line: ~      @b = 0~
    +      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    +** Processing line: ~      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up~
     - Inside source: true
     *** True Line Result
    -      @b = 0
    -** Processing line: ~~
    +      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    +** Processing line: ~        state.player.y += 5~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      @velocity = {x: 2, y: 0}~
    +        state.player.y += 5
    +** Processing line: ~      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down~
     - Inside source: true
     *** True Line Result
    -      @velocity = {x: 2, y: 0}
    -** Processing line: ~    end~
    +      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    +** Processing line: ~        state.player.y -= 5~
     - Inside source: true
     *** True Line Result
    -    end
    +        state.player.y -= 5
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def draw args~
    +** Processing line: ~      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.~
     - Inside source: true
     *** True Line Result
    -    def draw args
    -** Processing line: ~      args.outputs.sprites << [ # draw the peg according to the @x, @y, @radius, and the RGB~
    +      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    +** Processing line: ~      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << [ # draw the peg according to the @x, @y, @radius, and the RGB
    -** Processing line: ~        @x,~
    +      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    +** Processing line: ~      # Attack angle also contributes to the position of red square.~
     - Inside source: true
     *** True Line Result
    -        @x,
    -** Processing line: ~        @y,~
    +      # Attack angle also contributes to the position of red square.
    +** Processing line: ~      if inputs.mouse.moved~
     - Inside source: true
     *** True Line Result
    -        @y,
    -** Processing line: ~        @radius*2.0,~
    +      if inputs.mouse.moved
    +** Processing line: ~        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]~
     - Inside source: true
     *** True Line Result
    -        @radius*2.0,
    -** Processing line: ~        @radius*2.0,~
    +        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        @radius*2.0,
    -** Processing line: ~        "sprites/circle-white.png",~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        "sprites/circle-white.png",
    -** Processing line: ~        0,~
    +
    +** Processing line: ~      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5~
     - Inside source: true
     *** True Line Result
    -        0,
    -** Processing line: ~        255,~
    +      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5
    +** Processing line: ~        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]~
     - Inside source: true
     *** True Line Result
    -        255,
    -** Processing line: ~        @r,    #r~
    +        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    +** Processing line: ~        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set~
     - Inside source: true
     *** True Line Result
    -        @r,    #r
    -** Processing line: ~        @g,    #g~
    +        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set
    +** Processing line: ~        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position~
     - Inside source: true
     *** True Line Result
    -        @g,    #g
    -** Processing line: ~        @b   #b~
    +        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position
    +** Processing line: ~        state.player.dy = state.player.attack_angle.vector_y(25)~
     - Inside source: true
     *** True Line Result
    -        @b   #b
    -** Processing line: ~      ]~
    +        state.player.dy = state.player.attack_angle.vector_y(25)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      ]
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -31552,42 +39819,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~    # Sets the zombie spawn's countdown to a random number.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc args~
    +    # Sets the zombie spawn's countdown to a random number.
    +** Processing line: ~    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)~
     - Inside source: true
     *** True Line Result
    -    def calc args
    -** Processing line: ~      if collisionWithBounce? args # if the is a collision with the bouncing ball~
    +    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)
    +** Processing line: ~    def random_spawn_countdown minimum~
     - Inside source: true
     *** True Line Result
    -      if collisionWithBounce? args # if the is a collision with the bouncing ball
    -** Processing line: ~        collide args~
    +    def random_spawn_countdown minimum
    +** Processing line: ~      10.randomize(:ratio, :sign).to_i + 60~
     - Inside source: true
     *** True Line Result
    -        collide args
    -** Processing line: ~        @r = 0~
    +      10.randomize(:ratio, :sign).to_i + 60
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        @r = 0
    -** Processing line: ~        @b = 0~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @b = 0
    -** Processing line: ~        @g = 255~
    +
    +** Processing line: ~    # Helps to iterate through the images in the sprites folder by setting the animation index.~
     - Inside source: true
     *** True Line Result
    -        @g = 255
    -** Processing line: ~      else~
    +    # Helps to iterate through the images in the sprites folder by setting the animation index.
    +** Processing line: ~    # 3 frames is how long to show an image, and 6 is how many images to flip through.~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~      end~
    +    # 3 frames is how long to show an image, and 6 is how many images to flip through.
    +** Processing line: ~    def animation_index at~
     - Inside source: true
     *** True Line Result
    -      end
    +    def animation_index at
    +** Processing line: ~      at.idiv(3).mod(6)~
    +- Inside source: true
    +*** True Line Result
    +      at.idiv(3).mod(6)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -31596,606 +39867,602 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~    # Animates the zombies by using the animation index to go through the images in the sprites folder.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # do two circles (the ball and this peg) intersect~
    +    # Animates the zombies by using the animation index to go through the images in the sprites folder.
    +** Processing line: ~    def animation_sprite zombie, at = nil~
     - Inside source: true
     *** True Line Result
    -    # do two circles (the ball and this peg) intersect
    -** Processing line: ~    def collisionWithBounce? args~
    +    def animation_sprite zombie, at = nil
    +** Processing line: ~      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created~
     - Inside source: true
     *** True Line Result
    -    def collisionWithBounce? args
    -** Processing line: ~      squareDistance = (  # the squared distance between the ball's center and this peg's center~
    +      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created
    +** Processing line: ~      index = animation_index at~
     - Inside source: true
     *** True Line Result
    -      squareDistance = (  # the squared distance between the ball's center and this peg's center
    -** Processing line: ~        (args.state.ball.center.x - @center.x) ** 2.0 +~
    +      index = animation_index at
    +** Processing line: ~      "sprites/zombie-#{index}.png" # string interpolation to iterate through images~
     - Inside source: true
     *** True Line Result
    -        (args.state.ball.center.x - @center.x) ** 2.0 +
    -** Processing line: ~        (args.state.ball.center.y - @center.y) ** 2.0~
    +      "sprites/zombie-#{index}.png" # string interpolation to iterate through images
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        (args.state.ball.center.y - @center.y) ** 2.0
    -** Processing line: ~      )~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      )
    -** Processing line: ~      radiusSum = (  # the sum of the radius squared of the this peg and the ball~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      radiusSum = (  # the sum of the radius squared of the this peg and the ball
    -** Processing line: ~        (args.state.ball.radius + @radius) ** 2.0~
    +
    +** Processing line: ~  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new~
     - Inside source: true
     *** True Line Result
    -        (args.state.ball.radius + @radius) ** 2.0
    -** Processing line: ~      )~
    +  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      )
    -** Processing line: ~      # if the squareDistance is less or equal to radiusSum, then there is a radial intersection between the ball and this peg~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      # if the squareDistance is less or equal to radiusSum, then there is a radial intersection between the ball and this peg
    -** Processing line: ~      return (squareDistance <= radiusSum)~
    +  def tick args
    +** Processing line: ~    $protect_the_puppies_from_the_zombies.grid    = args.grid~
     - Inside source: true
     *** True Line Result
    -      return (squareDistance <= radiusSum)
    -** Processing line: ~    end~
    +    $protect_the_puppies_from_the_zombies.grid    = args.grid
    +** Processing line: ~    $protect_the_puppies_from_the_zombies.inputs  = args.inputs~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    $protect_the_puppies_from_the_zombies.inputs  = args.inputs
    +** Processing line: ~    $protect_the_puppies_from_the_zombies.state    = args.state~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # ! The following links explain the getRepelMagnitude function !~
    +    $protect_the_puppies_from_the_zombies.state    = args.state
    +** Processing line: ~    $protect_the_puppies_from_the_zombies.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -    # ! The following links explain the getRepelMagnitude function !
    -** Processing line: ~    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_4.png~
    +    $protect_the_puppies_from_the_zombies.outputs = args.outputs
    +** Processing line: ~    $protect_the_puppies_from_the_zombies.tick~
     - Inside source: true
     *** True Line Result
    -    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_4.png
    -** Processing line: ~    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_5.png~
    +    $protect_the_puppies_from_the_zombies.tick
    +** Processing line: ~    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."~
     - Inside source: true
     *** True Line Result
    -    # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_5.png
    -** Processing line: ~    # https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/LinearCollider.md~
    +    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/LinearCollider.md
    -** Processing line: ~    def getRepelMagnitude (args, fbx, fby, vrx, vry, ballMag)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def getRepelMagnitude (args, fbx, fby, vrx, vry, ballMag)
    -** Processing line: ~      a = fbx ; b = vrx ; c = fby~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -      a = fbx ; b = vrx ; c = fby
    -** Processing line: ~      d = vry ; e = ballMag~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -      d = vry ; e = ballMag
    -** Processing line: ~      if b**2 + d**2 == 0~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -      if b**2 + d**2 == 0
    -** Processing line: ~        #unexpected~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -        #unexpected
    -** Processing line: ~      end~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    -** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      err = 0.00001~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -      err = 0.00001
    -** Processing line: ~      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    -** Processing line: ~      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    -** Processing line: ~      r = 0~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      r = 0
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if (ballMag >= o-err and ballMag <= o+err)~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      if (ballMag >= o-err and ballMag <= o+err)
    -** Processing line: ~        r = x1~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -        r = x1
    -** Processing line: ~      elsif (ballMag >= p-err and ballMag <= p+err)~
    -- Inside source: true
    +
    +** Processing line: ~*** Mouse - Mouse Move Paint App - main.rb~
    +- Header detected.
     *** True Line Result
    -      elsif (ballMag >= p-err and ballMag <= p+err)
    -** Processing line: ~        r = x2~
    -- Inside source: true
    +
     *** True Line Result
    -        r = x2
    -** Processing line: ~      else~
    -- Inside source: true
    +*** Mouse - Mouse Move Paint App - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -      else
    -** Processing line: ~        #unexpected~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb~
     - Inside source: true
     *** True Line Result
    -        #unexpected
    -** Processing line: ~      end~
    +  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -      end
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if (args.state.ball.center.x > @center.x)~
    -- Inside source: true
    -*** True Line Result
    -      if (args.state.ball.center.x > @center.x)
    -** Processing line: ~        return x2*-1~
    -- Inside source: true
    -*** True Line Result
    -        return x2*-1
    -** Processing line: ~      end~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -      end
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return x2~
    +** Processing line: ~   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.~
     - Inside source: true
     *** True Line Result
    -      return x2
    +   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #return r~
    +** Processing line: ~     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...~
     - Inside source: true
     *** True Line Result
    -      #return r
    -** Processing line: ~    end~
    +     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    +** Processing line: ~     puts a.floor()~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +     puts a.floor()
    +** Processing line: ~     which would print out 13.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #this sets the new velocity of the ball once it has collided with this peg~
    +     which would print out 13.
    +** Processing line: ~     (There is also a ceil method, which returns an integer number greater than or equal to the original~
     - Inside source: true
     *** True Line Result
    -    #this sets the new velocity of the ball once it has collided with this peg
    -** Processing line: ~    def collide args~
    +     (There is also a ceil method, which returns an integer number greater than or equal to the original
    +** Processing line: ~     with no decimal. If we had called ceil on the variable a, the result would have been 14.)~
     - Inside source: true
     *** True Line Result
    -    def collide args
    -** Processing line: ~      normalOfRCCollision = [                                                     #this is the normal of the collision in COMPONENT FORM~
    +     with no decimal. If we had called ceil on the variable a, the result would have been 14.)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      normalOfRCCollision = [                                                     #this is the normal of the collision in COMPONENT FORM
    -** Processing line: ~        {x: @center.x, y: @center.y},                                             #see https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.mathscard.co.uk%2Fonline%2Fcircle-coordinate-geometry%2F&psig=AOvVaw2GcD-e2-nJR_IUKpw3hO98&ust=1605731315521000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjBo7e1iu0CFQAAAAAdAAAAABAD~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -        {x: @center.x, y: @center.y},                                             #see https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.mathscard.co.uk%2Fonline%2Fcircle-coordinate-geometry%2F&psig=AOvVaw2GcD-e2-nJR_IUKpw3hO98&ust=1605731315521000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjBo7e1iu0CFQAAAAAdAAAAABAD
    -** Processing line: ~        {x: args.state.ball.center.x, y: args.state.ball.center.y},~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        {x: args.state.ball.center.x, y: args.state.ball.center.y},
    -** Processing line: ~      ]~
    +
    +** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
     - Inside source: true
     *** True Line Result
    -      ]
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +** Processing line: ~     using their keys.~
    +- Inside source: true
    +*** True Line Result
    +     using their keys.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      normalSlope = (                                                             #normalSlope is the slope of normalOfRCCollision~
    +** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
     - Inside source: true
     *** True Line Result
    -      normalSlope = (                                                             #normalSlope is the slope of normalOfRCCollision
    -** Processing line: ~        (normalOfRCCollision[1].y - normalOfRCCollision[0].y) /~
    +     For example, if we have a "numbers" hash that stores numbers in English as the
    +** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
     - Inside source: true
     *** True Line Result
    -        (normalOfRCCollision[1].y - normalOfRCCollision[0].y) /
    -** Processing line: ~        (normalOfRCCollision[1].x - normalOfRCCollision[0].x)~
    +     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
     - Inside source: true
     *** True Line Result
    -        (normalOfRCCollision[1].x - normalOfRCCollision[0].x)
    -** Processing line: ~      )~
    +     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +** Processing line: ~     and on it goes.~
     - Inside source: true
     *** True Line Result
    -      )
    -** Processing line: ~      slope = normalSlope**-1.0 * -1                                              # slope is the slope of the tangent~
    +     and on it goes.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      slope = normalSlope**-1.0 * -1                                              # slope is the slope of the tangent
    -** Processing line: ~      # args.state.display_value = slope~
    +
    +** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
     - Inside source: true
     *** True Line Result
    -      # args.state.display_value = slope
    -** Processing line: ~      pointA = {                                                                  # pointA and pointB are using the var slope to tangent in COMPONENT FORM~
    +     Now if we wanted to find the corresponding value of the "one" key, we could say
    +** Processing line: ~     puts numbers["one"]~
     - Inside source: true
     *** True Line Result
    -      pointA = {                                                                  # pointA and pointB are using the var slope to tangent in COMPONENT FORM
    -** Processing line: ~        x: args.state.ball.center.x-1,~
    +     puts numbers["one"]
    +** Processing line: ~     which would print "uno" to the console.~
     - Inside source: true
     *** True Line Result
    -        x: args.state.ball.center.x-1,
    -** Processing line: ~        y: -(slope-args.state.ball.center.y)~
    +     which would print "uno" to the console.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        y: -(slope-args.state.ball.center.y)
    -** Processing line: ~      }~
    +
    +** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~      pointB = {~
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +** Processing line: ~     In this sample app, new_entity is used to create a new button that clears the grid.~
     - Inside source: true
     *** True Line Result
    -      pointB = {
    -** Processing line: ~        x: args.state.ball.center.x+1,~
    +     In this sample app, new_entity is used to create a new button that clears the grid.
    +** Processing line: ~     (Remember, you can use state to define ANY property and it will be retained across frames.)~
     - Inside source: true
     *** True Line Result
    -        x: args.state.ball.center.x+1,
    -** Processing line: ~        y: slope+args.state.ball.center.y~
    +     (Remember, you can use state to define ANY property and it will be retained across frames.)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        y: slope+args.state.ball.center.y
    -** Processing line: ~      }~
    +
    +** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
     - Inside source: true
     *** True Line Result
    -      }
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      perpVect = {x: pointB.x - pointA.x, y:pointB.y - pointA.y}                  # perpVect is to be VECTOR of the perpendicular tangent~
    -- Inside source: true
    -*** True Line Result
    -      perpVect = {x: pointB.x - pointA.x, y:pointB.y - pointA.y}                  # perpVect is to be VECTOR of the perpendicular tangent
    -** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect~
    +** Processing line: ~   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
     - Inside source: true
     *** True Line Result
    -      mag  = (perpVect.x**2 + perpVect.y**2)**0.5                                 # find the magniude of the perpVect
    -** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector~
    +   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}                       # divide the perpVect by the magniude to make it a unit vector
    -** Processing line: ~      perpVect = {x: -perpVect.y, y: perpVect.x}                                  # swap the x and y and multiply by -1 to make the vector perpendicular~
    +
    +** Processing line: ~   - args.outputs.labels: An array. The values in the array generate a label.~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: -perpVect.y, y: perpVect.x}                                  # swap the x and y and multiply by -1 to make the vector perpendicular
    -** Processing line: ~      args.state.display_value = perpVect~
    +   - args.outputs.labels: An array. The values in the array generate a label.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -      args.state.display_value = perpVect
    -** Processing line: ~      if perpVect.y > 0                                                           #ensure perpVect points upward~
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -      if perpVect.y > 0                                                           #ensure perpVect points upward
    -** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +     For more information about labels, go to mygame/documentation/02-labels.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -** Processing line: ~      end~
    +
    +** Processing line: ~   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.~
     - Inside source: true
     *** True Line Result
    -      end
    +   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      previousPosition = {                                                        # calculate an ESTIMATE of the previousPosition of the ball
    -** Processing line: ~        x:args.state.ball.center.x-args.state.ball.velocity.x,~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        x:args.state.ball.center.x-args.state.ball.velocity.x,
    -** Processing line: ~        y:args.state.ball.center.y-args.state.ball.velocity.y~
    +
    +** Processing line: ~  # This sample app shows an empty grid that the user can paint on.~
     - Inside source: true
     *** True Line Result
    -        y:args.state.ball.center.y-args.state.ball.velocity.y
    -** Processing line: ~      }~
    +  # This sample app shows an empty grid that the user can paint on.
    +** Processing line: ~  # To paint, the user must keep their mouse presssed and drag it around the grid.~
    +- Inside source: true
    +*** True Line Result
    +  # To paint, the user must keep their mouse presssed and drag it around the grid.
    +** Processing line: ~  # The "clear" button allows users to clear the grid so they can start over.~
     - Inside source: true
     *** True Line Result
    -      }
    +  # The "clear" button allows users to clear the grid so they can start over.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      yInterc = pointA.y + -slope*pointA.x~
    +** Processing line: ~  class PaintApp~
     - Inside source: true
     *** True Line Result
    -      yInterc = pointA.y + -slope*pointA.x
    -** Processing line: ~      if slope == INFINITY                                                        # the perpVect presently either points in the correct dirrection or it is 180 degrees off we need to correct this~
    +  class PaintApp
    +** Processing line: ~    attr_accessor :inputs, :state, :outputs, :grid, :args~
     - Inside source: true
     *** True Line Result
    -      if slope == INFINITY                                                        # the perpVect presently either points in the correct dirrection or it is 180 degrees off we need to correct this
    -** Processing line: ~        if previousPosition.x < pointA.x~
    +    attr_accessor :inputs, :state, :outputs, :grid, :args
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if previousPosition.x < pointA.x
    -** Processing line: ~          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +
    +** Processing line: ~    # Runs methods necessary for the game to function properly.~
     - Inside source: true
     *** True Line Result
    -          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -** Processing line: ~          yInterc = -INFINITY~
    +    # Runs methods necessary for the game to function properly.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -          yInterc = -INFINITY
    -** Processing line: ~        end~
    +    def tick
    +** Processing line: ~      print_title~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      elsif previousPosition.y < slope*previousPosition.x + yInterc               # check if ball is bellow or above the collider to determine if perpVect is - or +~
    +      print_title
    +** Processing line: ~      add_grid~
     - Inside source: true
     *** True Line Result
    -      elsif previousPosition.y < slope*previousPosition.x + yInterc               # check if ball is bellow or above the collider to determine if perpVect is - or +
    -** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +      add_grid
    +** Processing line: ~      check_click~
     - Inside source: true
     *** True Line Result
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -** Processing line: ~      end~
    +      check_click
    +** Processing line: ~      draw_buttons~
     - Inside source: true
     *** True Line Result
    -      end
    +      draw_buttons
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      velocityMag =                                                               # the current velocity magnitude of the ball~
    +** Processing line: ~    # Prints the title onto the screen by using a label.~
     - Inside source: true
     *** True Line Result
    -      velocityMag =                                                               # the current velocity magnitude of the ball
    -** Processing line: ~        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5~
    +    # Prints the title onto the screen by using a label.
    +** Processing line: ~    # Also separates the title from the grid with a line as a horizontal separator.~
     - Inside source: true
     *** True Line Result
    -        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
    -** Processing line: ~      theta_ball=~
    +    # Also separates the title from the grid with a line as a horizontal separator.
    +** Processing line: ~    def print_title~
     - Inside source: true
     *** True Line Result
    -      theta_ball=
    -** Processing line: ~        Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x)         #the angle of the ball's velocity~
    +    def print_title
    +** Processing line: ~      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]~
     - Inside source: true
     *** True Line Result
    -        Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x)         #the angle of the ball's velocity
    -** Processing line: ~      theta_repel=~
    +      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    +** Processing line: ~      outputs.lines << horizontal_separator(660, 0, 1280)~
     - Inside source: true
     *** True Line Result
    -      theta_repel=
    -** Processing line: ~        Math.atan2(args.state.ball.center.y,args.state.ball.center.x)             #the angle of the repelling force(perpVect)~
    +      outputs.lines << horizontal_separator(660, 0, 1280)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        Math.atan2(args.state.ball.center.y,args.state.ball.center.x)             #the angle of the repelling force(perpVect)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity~
    -- Inside source: true
    -*** True Line Result
    -      fbx = velocityMag * Math.cos(theta_ball)                                    #the x component of the ball's velocity
    -** Processing line: ~      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity~
    +** Processing line: ~    # Sets the starting position, ending position, and color for the horizontal separator.~
     - Inside source: true
     *** True Line Result
    -      fby = velocityMag * Math.sin(theta_ball)                                    #the y component of the ball's velocity
    -** Processing line: ~      repelMag = getRepelMagnitude(                                               # the magniude of the collision vector~
    +    # Sets the starting position, ending position, and color for the horizontal separator.
    +** Processing line: ~    # The starting and ending positions have the same y values.~
     - Inside source: true
     *** True Line Result
    -      repelMag = getRepelMagnitude(                                               # the magniude of the collision vector
    -** Processing line: ~        args,~
    +    # The starting and ending positions have the same y values.
    +** Processing line: ~    def horizontal_separator y, x, x2~
     - Inside source: true
     *** True Line Result
    -        args,
    -** Processing line: ~        fbx,~
    +    def horizontal_separator y, x, x2
    +** Processing line: ~      [x, y, x2, y, 150, 150, 150]~
     - Inside source: true
     *** True Line Result
    -        fbx,
    -** Processing line: ~        fby,~
    +      [x, y, x2, y, 150, 150, 150]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        fby,
    -** Processing line: ~        perpVect.x,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        perpVect.x,
    -** Processing line: ~        perpVect.y,~
    +
    +** Processing line: ~    # Sets the starting position, ending position, and color for the vertical separator.~
     - Inside source: true
     *** True Line Result
    -        perpVect.y,
    -** Processing line: ~        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5~
    +    # Sets the starting position, ending position, and color for the vertical separator.
    +** Processing line: ~    # The starting and ending positions have the same x values.~
     - Inside source: true
     *** True Line Result
    -        (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
    -** Processing line: ~      )~
    +    # The starting and ending positions have the same x values.
    +** Processing line: ~    def vertical_separator x, y, y2~
     - Inside source: true
     *** True Line Result
    -      )
    -** Processing line: ~      frx = repelMag* Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +    def vertical_separator x, y, y2
    +** Processing line: ~      [x, y, x, y2, 150, 150, 150]~
     - Inside source: true
     *** True Line Result
    -      frx = repelMag* Math.cos(theta_repel)                                       #the x component of the repel's velocity | magnitude is set to twice of fbx
    -** Processing line: ~      fry = repelMag* Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby~
    +      [x, y, x, y2, 150, 150, 150]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      fry = repelMag* Math.sin(theta_repel)                                       #the y component of the repel's velocity | magnitude is set to twice of fby
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      fsumx = fbx+frx                            # sum of x forces~
    +** Processing line: ~    # Outputs a border and a grid containing empty squares onto the screen.~
     - Inside source: true
     *** True Line Result
    -      fsumx = fbx+frx                            # sum of x forces
    -** Processing line: ~      fsumy = fby+fry                            # sum of y forces~
    +    # Outputs a border and a grid containing empty squares onto the screen.
    +** Processing line: ~    def add_grid~
     - Inside source: true
     *** True Line Result
    -      fsumy = fby+fry                            # sum of y forces
    -** Processing line: ~      fr = velocityMag                           # fr is the resulting magnitude~
    +    def add_grid
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      fr = velocityMag                           # fr is the resulting magnitude
    -** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)        # thetaNew is the resulting angle~
    +
    +** Processing line: ~      # Sets the x, y, height, and width of the grid.~
     - Inside source: true
     *** True Line Result
    -      thetaNew = Math.atan2(fsumy, fsumx)        # thetaNew is the resulting angle
    -** Processing line: ~      xnew = fr*Math.cos(thetaNew)               # resulting x velocity~
    +      # Sets the x, y, height, and width of the grid.
    +** Processing line: ~      # There are 31 horizontal lines and 31 vertical lines in the grid.~
     - Inside source: true
     *** True Line Result
    -      xnew = fr*Math.cos(thetaNew)               # resulting x velocity
    -** Processing line: ~      ynew = fr*Math.sin(thetaNew)               # resulting y velocity~
    +      # There are 31 horizontal lines and 31 vertical lines in the grid.
    +** Processing line: ~      # Feel free to count them yourself before continuing!~
     - Inside source: true
     *** True Line Result
    -      ynew = fr*Math.sin(thetaNew)               # resulting y velocity
    -** Processing line: ~      if (args.state.ball.center.x >= @center.x) # this is necessary for the ball colliding on the right side of the peg~
    +      # Feel free to count them yourself before continuing!
    +** Processing line: ~      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center~
     - Inside source: true
     *** True Line Result
    -      if (args.state.ball.center.x >= @center.x) # this is necessary for the ball colliding on the right side of the peg
    -** Processing line: ~        xnew=xnew.abs~
    +      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    +** Processing line: ~      lines_h = 31~
     - Inside source: true
     *** True Line Result
    -        xnew=xnew.abs
    -** Processing line: ~      end~
    +      lines_h = 31
    +** Processing line: ~      lines_v = 31~
     - Inside source: true
     *** True Line Result
    -      end
    +      lines_v = 31
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.ball.velocity.x = xnew                                           # set the x-velocity to the new velocity~
    -- Inside source: true
    -*** True Line Result
    -      args.state.ball.velocity.x = xnew                                           # set the x-velocity to the new velocity
    -** Processing line: ~      if args.state.ball.center.y > @center.y                                     # if the ball is above the middle of the peg we need to temporarily ignore some of the gravity~
    +** Processing line: ~      # Sets values for the grid's border, grid lines, and filled squares.~
     - Inside source: true
     *** True Line Result
    -      if args.state.ball.center.y > @center.y                                     # if the ball is above the middle of the peg we need to temporarily ignore some of the gravity
    -** Processing line: ~        args.state.ball.velocity.y = ynew + GRAVITY * 0.01~
    +      # Sets values for the grid's border, grid lines, and filled squares.
    +** Processing line: ~      # The filled_squares variable is initially set to an empty array.~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.y = ynew + GRAVITY * 0.01
    -** Processing line: ~      else~
    +      # The filled_squares variable is initially set to an empty array.
    +** Processing line: ~      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        args.state.ball.velocity.y = ynew - GRAVITY * 0.01                        # if the ball is bellow the middle of the peg we need to temporarily increase the power of the gravity~
    +      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    +** Processing line: ~      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.y = ynew - GRAVITY * 0.01                        # if the ball is bellow the middle of the peg we need to temporarily increase the power of the gravity
    -** Processing line: ~      end~
    +      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    +** Processing line: ~      state.filled_squares ||= [] # there are no filled squares until the user fills them in~
     - Inside source: true
     *** True Line Result
    -      end
    +      state.filled_squares ||= [] # there are no filled squares until the user fills them in
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.ball.center.x+= args.state.ball.velocity.x                       # update the position of the ball so it never looks like the ball is intersecting the circle~
    +** Processing line: ~      # Outputs the grid lines, border, and filled squares onto the screen.~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.center.x+= args.state.ball.velocity.x                       # update the position of the ball so it never looks like the ball is intersecting the circle
    -** Processing line: ~      args.state.ball.center.y+= args.state.ball.velocity.y~
    +      # Outputs the grid lines, border, and filled squares onto the screen.
    +** Processing line: ~      outputs.lines.concat state.grid_lines~
     - Inside source: true
     *** True Line Result
    -      args.state.ball.center.y+= args.state.ball.velocity.y
    -** Processing line: ~    end~
    +      outputs.lines.concat state.grid_lines
    +** Processing line: ~      outputs.borders << state.grid_border~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      outputs.borders << state.grid_border
    +** Processing line: ~      outputs.solids << state.filled_squares~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      outputs.solids << state.filled_squares
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Bouncing On Collision - vector2d.rb~
    -- Header detected.
    +** Processing line: ~    # Draws the grid by adding in vertical and horizontal separators.~
    +- Inside source: true
     *** True Line Result
    -
    +    # Draws the grid by adding in vertical and horizontal separators.
    +** Processing line: ~    def draw_grid x, y, h, w, lines_h, lines_v~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Bouncing On Collision - vector2d.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    def draw_grid x, y, h, w, lines_h, lines_v
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~      # The grid starts off empty.~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb~
    +      # The grid starts off empty.
    +** Processing line: ~      grid = []~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb
    -** Processing line: ~  class Vector2d~
    +      grid = []
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  class Vector2d
    -** Processing line: ~      attr_accessor :x, :y~
    +
    +** Processing line: ~      # Calculates the placement and adds horizontal lines or separators into the grid.~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :x, :y
    -** Processing line: ~~
    +      # Calculates the placement and adds horizontal lines or separators into the grid.
    +** Processing line: ~      curr_y = y # start at the bottom of the box~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def initialize x=0, y=0~
    +      curr_y = y # start at the bottom of the box
    +** Processing line: ~      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid~
     - Inside source: true
     *** True Line Result
    -      def initialize x=0, y=0
    -** Processing line: ~        @x=x~
    +      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    +** Processing line: ~      lines_h.times do~
     - Inside source: true
     *** True Line Result
    -        @x=x
    -** Processing line: ~        @y=y~
    +      lines_h.times do
    +** Processing line: ~        curr_y += dist_y # increment curr_y by the distance between the horizontal lines~
     - Inside source: true
     *** True Line Result
    -        @y=y
    +        curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    +** Processing line: ~        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid~
    +- Inside source: true
    +*** True Line Result
    +        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -32204,34 +40471,30 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a vector multiplied by scalar x~
    -- Inside source: true
    -*** True Line Result
    -      #returns a vector multiplied by scalar x
    -** Processing line: ~      #x [float] scalar~
    +** Processing line: ~      # Calculates the placement and adds vertical lines or separators into the grid.~
     - Inside source: true
     *** True Line Result
    -      #x [float] scalar
    -** Processing line: ~      def mult x~
    +      # Calculates the placement and adds vertical lines or separators into the grid.
    +** Processing line: ~      curr_x = x # now start at the left of the box~
     - Inside source: true
     *** True Line Result
    -      def mult x
    -** Processing line: ~        r = Vector2d.new(0,0)~
    +      curr_x = x # now start at the left of the box
    +** Processing line: ~      dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid~
     - Inside source: true
     *** True Line Result
    -        r = Vector2d.new(0,0)
    -** Processing line: ~        r.x=@x*x~
    +      dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid
    +** Processing line: ~      lines_v.times do~
     - Inside source: true
     *** True Line Result
    -        r.x=@x*x
    -** Processing line: ~        r.y=@y*x~
    +      lines_v.times do
    +** Processing line: ~        curr_x += dist_x # increment curr_x by the distance between the vertical lines~
     - Inside source: true
     *** True Line Result
    -        r.y=@y*x
    -** Processing line: ~        r~
    +        curr_x += dist_x # increment curr_x by the distance between the vertical lines
    +** Processing line: ~        grid << vertical_separator(curr_x, y + 1, y  + h) # add separator~
     - Inside source: true
     *** True Line Result
    -        r
    +        grid << vertical_separator(curr_x, y + 1, y  + h) # add separator
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -32240,66 +40503,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # vect [Vector2d] vector to copy~
    +** Processing line: ~      # paint_grid uses a hash to assign values to keys.~
     - Inside source: true
     *** True Line Result
    -      # vect [Vector2d] vector to copy
    -** Processing line: ~      def copy vect~
    +      # paint_grid uses a hash to assign values to keys.
    +** Processing line: ~      state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,~
     - Inside source: true
     *** True Line Result
    -      def copy vect
    -** Processing line: ~        Vector2d.new(@x, @y)~
    +      state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    +** Processing line: ~                            "lines_v" => lines_v, "dist_x" => dist_x,~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x, @y)
    -** Processing line: ~      end~
    +                            "lines_v" => lines_v, "dist_x" => dist_x,
    +** Processing line: ~                            "dist_y" => dist_y }~
     - Inside source: true
     *** True Line Result
    -      end
    +                            "dist_y" => dist_y }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a new vector equivalent to this+vect~
    +** Processing line: ~      return grid~
     - Inside source: true
     *** True Line Result
    -      #returns a new vector equivalent to this+vect
    -** Processing line: ~      #vect [Vector2d] vector to add to self~
    +      return grid
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      #vect [Vector2d] vector to add to self
    -** Processing line: ~      def add vect~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      def add vect
    -** Processing line: ~        Vector2d.new(@x+vect.x,@y+vect.y)~
    +
    +** Processing line: ~    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x+vect.x,@y+vect.y)
    -** Processing line: ~      end~
    +    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    +** Processing line: ~    # If the mouse is up, the user cannot drag the mouse.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    # If the mouse is up, the user cannot drag the mouse.
    +** Processing line: ~    def check_click~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #returns a new vector equivalent to this-vect~
    +    def check_click
    +** Processing line: ~      if inputs.mouse.down #is mouse up or down?~
     - Inside source: true
     *** True Line Result
    -      #returns a new vector equivalent to this-vect
    -** Processing line: ~      #vect [Vector2d] vector to subtract to self~
    +      if inputs.mouse.down #is mouse up or down?
    +** Processing line: ~        state.mouse_held = true # mouse is being held down~
     - Inside source: true
     *** True Line Result
    -      #vect [Vector2d] vector to subtract to self
    -** Processing line: ~      def sub vect~
    +        state.mouse_held = true # mouse is being held down
    +** Processing line: ~      elsif inputs.mouse.up # if mouse is up~
     - Inside source: true
     *** True Line Result
    -      def sub vect
    -** Processing line: ~        Vector2d.new(@x-vect.c, @y-vect.y)~
    +      elsif inputs.mouse.up # if mouse is up
    +** Processing line: ~      state.mouse_held = false # mouse is not being held down or dragged~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x-vect.c, @y-vect.y)
    +      state.mouse_held = false # mouse is not being held down or dragged
    +** Processing line: ~        state.mouse_dragging = false~
    +- Inside source: true
    +*** True Line Result
    +        state.mouse_dragging = false
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -32308,18 +40575,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #return the magnitude of the vector~
    +** Processing line: ~      if state.mouse_held &&    # mouse needs to be down~
     - Inside source: true
     *** True Line Result
    -      #return the magnitude of the vector
    -** Processing line: ~      def mag~
    +      if state.mouse_held &&    # mouse needs to be down
    +** Processing line: ~        !inputs.mouse.click &&     # must not be first click~
     - Inside source: true
     *** True Line Result
    -      def mag
    -** Processing line: ~        ((@x**2)+(@y**2))**0.5~
    +        !inputs.mouse.click &&     # must not be first click
    +** Processing line: ~        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"~
     - Inside source: true
     *** True Line Result
    -        ((@x**2)+(@y**2))**0.5
    +        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    +** Processing line: ~        state.mouse_dragging = true~
    +- Inside source: true
    +*** True Line Result
    +        state.mouse_dragging = true
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -32328,38 +40599,34 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a new normalize version of the vector~
    -- Inside source: true
    -*** True Line Result
    -      #returns a new normalize version of the vector
    -** Processing line: ~      def normalize~
    +** Processing line: ~      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.~
     - Inside source: true
     *** True Line Result
    -      def normalize
    -** Processing line: ~        Vector2d.new(@x/mag, @y/mag)~
    +      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    +** Processing line: ~      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x/mag, @y/mag)
    -** Processing line: ~      end~
    +      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    +** Processing line: ~        search_lines(inputs.mouse.click.point, :click)~
     - Inside source: true
     *** True Line Result
    -      end
    +        search_lines(inputs.mouse.click.point, :click)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #TODO delet?~
    +** Processing line: ~      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.~
     - Inside source: true
     *** True Line Result
    -      #TODO delet?
    -** Processing line: ~      def distABS vect~
    +      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    +** Processing line: ~      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))~
     - Inside source: true
     *** True Line Result
    -      def distABS vect
    -** Processing line: ~        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()~
    +      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    +** Processing line: ~        search_lines(inputs.mouse.position, :drag)~
     - Inside source: true
     *** True Line Result
    -        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    +        search_lines(inputs.mouse.position, :drag)
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -32368,694 +40635,702 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~#+end_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: ~*** Physics And Collisions - Arbitrary Collision - ball.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - ball.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/04_physics_and_collisions/09_arbitrary_collision/app/ball.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/ball.rb
    -** Processing line: ~~
    +
    +** Processing line: ~    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  class Ball~
    +    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    +** Processing line: ~    def search_lines (point, input_type)~
     - Inside source: true
     *** True Line Result
    -  class Ball
    -** Processing line: ~      attr_accessor :velocity, :child, :parent, :number, :leastChain~
    +    def search_lines (point, input_type)
    +** Processing line: ~      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :velocity, :child, :parent, :number, :leastChain
    -** Processing line: ~      attr_reader :x, :y, :hypotenuse, :width, :height~
    +      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    +** Processing line: ~      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash~
     - Inside source: true
     *** True Line Result
    -      attr_reader :x, :y, :hypotenuse, :width, :height
    +      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def initialize args, number, leastChain, parent, child~
    +** Processing line: ~      # Remove code following the .floor and see what happens when you try to fill in grid squares~
     - Inside source: true
     *** True Line Result
    -      def initialize args, number, leastChain, parent, child
    -** Processing line: ~          #Start the ball in the top center~
    +      # Remove code following the .floor and see what happens when you try to fill in grid squares
    +** Processing line: ~      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]~
     - Inside source: true
     *** True Line Result
    -          #Start the ball in the top center
    -** Processing line: ~          @number = number~
    +      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    +** Processing line: ~      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]~
     - Inside source: true
     *** True Line Result
    -          @number = number
    -** Processing line: ~          @leastChain = leastChain~
    +      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          @leastChain = leastChain
    -** Processing line: ~          @x = args.grid.w / 2~
    +
    +** Processing line: ~      point.x += state.paint_grid["x"]~
     - Inside source: true
     *** True Line Result
    -          @x = args.grid.w / 2
    -** Processing line: ~          @y = args.grid.h - 20~
    +      point.x += state.paint_grid["x"]
    +** Processing line: ~      point.y += state.paint_grid["y"]~
     - Inside source: true
     *** True Line Result
    -          @y = args.grid.h - 20
    +      point.y += state.paint_grid["y"]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @velocity = Vector2d.new(2, -2)~
    +** Processing line: ~      # Sets definition of a grid box, meaning its x, y, width, and height.~
     - Inside source: true
     *** True Line Result
    -          @velocity = Vector2d.new(2, -2)
    -** Processing line: ~          @width =  10~
    +      # Sets definition of a grid box, meaning its x, y, width, and height.
    +** Processing line: ~      # Floor is called on the point.x and point.y variables.~
     - Inside source: true
     *** True Line Result
    -          @width =  10
    -** Processing line: ~          @height = 10~
    +      # Floor is called on the point.x and point.y variables.
    +** Processing line: ~      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.~
     - Inside source: true
     *** True Line Result
    -          @height = 10
    +      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    +** Processing line: ~      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]~
    +- Inside source: true
    +*** True Line Result
    +      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @left_wall = (args.state.board_width + args.grid.w / 8)~
    +** Processing line: ~      if input_type == :click # if user clicks their mouse~
     - Inside source: true
     *** True Line Result
    -          @left_wall = (args.state.board_width + args.grid.w / 8)
    -** Processing line: ~          @right_wall = @left_wall + args.state.board_width~
    +      if input_type == :click # if user clicks their mouse
    +** Processing line: ~        if state.filled_squares.include? grid_box # if grid box is already filled in~
     - Inside source: true
     *** True Line Result
    -          @right_wall = @left_wall + args.state.board_width
    -** Processing line: ~~
    +        if state.filled_squares.include? grid_box # if grid box is already filled in
    +** Processing line: ~          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @max_velocity = MAX_VELOCITY~
    +          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -          @max_velocity = MAX_VELOCITY
    -** Processing line: ~~
    +        else
    +** Processing line: ~          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @child = child~
    +          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -          @child = child
    -** Processing line: ~          @parent = parent~
    +        end
    +** Processing line: ~      elsif input_type == :drag # if user drags mouse~
     - Inside source: true
     *** True Line Result
    -          @parent = parent
    -** Processing line: ~~
    +      elsif input_type == :drag # if user drags mouse
    +** Processing line: ~        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @past = [{x: @x, y: @y}]~
    +        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    +** Processing line: ~          state.filled_squares << grid_box # the box is filled in and added to filled_squares~
     - Inside source: true
     *** True Line Result
    -          @past = [{x: @x, y: @y}]
    -** Processing line: ~          @next = nil~
    +          state.filled_squares << grid_box # the box is filled in and added to filled_squares
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -          @next = nil
    +        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 reassignLeastChain (lc=nil)~
    +** Processing line: ~    # Creates and outputs a "Clear" button on the screen using a label and a border.~
     - Inside source: true
     *** True Line Result
    -      def reassignLeastChain (lc=nil)
    -** Processing line: ~        if (lc == nil)~
    +    # Creates and outputs a "Clear" button on the screen using a label and a border.
    +** Processing line: ~    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.~
     - Inside source: true
     *** True Line Result
    -        if (lc == nil)
    -** Processing line: ~          lc = @number~
    +    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    +** Processing line: ~    def draw_buttons~
     - Inside source: true
     *** True Line Result
    -          lc = @number
    -** Processing line: ~        end~
    +    def draw_buttons
    +** Processing line: ~      x, y, w, h = 390, 50, 240, 50~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        @leastChain = lc~
    +      x, y, w, h = 390, 50, 240, 50
    +** Processing line: ~      state.clear_button        ||= state.new_entity(:button_with_fade)~
     - Inside source: true
     *** True Line Result
    -        @leastChain = lc
    -** Processing line: ~        if (parent != nil)~
    +      state.clear_button        ||= state.new_entity(:button_with_fade)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if (parent != nil)
    -** Processing line: ~          @parent.reassignLeastChain(lc)~
    +
    +** Processing line: ~      # The x and y positions are set to display the label in the center of the button.~
     - Inside source: true
     *** True Line Result
    -          @parent.reassignLeastChain(lc)
    -** Processing line: ~        end~
    +      # The x and y positions are set to display the label in the center of the button.
    +** Processing line: ~      # Try changing the first two parameters to simply x, y and see what happens to the text placement!~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~~
    +      # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    +** Processing line: ~      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      end~
    +      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    +** Processing line: ~      state.clear_button.border ||= [x, y, w, h]~
     - Inside source: true
     *** True Line Result
    -      end
    +      state.clear_button.border ||= [x, y, w, h]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def makeLeader args~
    +** Processing line: ~      # If the mouse is clicked inside the borders of the clear button,~
     - Inside source: true
     *** True Line Result
    -      def makeLeader args
    -** Processing line: ~        if isLeader~
    +      # If the mouse is clicked inside the borders of the clear button,
    +** Processing line: ~      # the filled_squares collection is emptied and the squares are cleared.~
     - Inside source: true
     *** True Line Result
    -        if isLeader
    -** Processing line: ~          return~
    +      # the filled_squares collection is emptied and the squares are cleared.
    +** Processing line: ~      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)~
     - Inside source: true
     *** True Line Result
    -          return
    -** Processing line: ~        end~
    +      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    +** Processing line: ~        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        @parent.reassignLeastChain~
    +        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    +** Processing line: ~        state.filled_squares.clear~
     - Inside source: true
     *** True Line Result
    -        @parent.reassignLeastChain
    -** Processing line: ~        args.state.ballParents.push(self)~
    +        state.filled_squares.clear
    +** Processing line: ~        inputs.mouse.previous_click = nil~
     - Inside source: true
     *** True Line Result
    -        args.state.ballParents.push(self)
    -** Processing line: ~        @parent = nil~
    +        inputs.mouse.previous_click = nil
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        @parent = nil
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      end~
    +** Processing line: ~      outputs.labels << state.clear_button.label~
     - Inside source: true
     *** True Line Result
    -      end
    +      outputs.labels << state.clear_button.label
    +** Processing line: ~      outputs.borders << state.clear_button.border~
    +- Inside source: true
    +*** True Line Result
    +      outputs.borders << state.clear_button.border
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def isLeader~
    +** Processing line: ~      # When the clear button is clicked, the color of the button changes~
     - Inside source: true
     *** True Line Result
    -      def isLeader
    -** Processing line: ~        return (parent == nil)~
    +      # When the clear button is clicked, the color of the button changes
    +** Processing line: ~      # and the transparency changes, as well. If you change the time from~
     - Inside source: true
     *** True Line Result
    -        return (parent == nil)
    -** Processing line: ~      end~
    +      # and the transparency changes, as well. If you change the time from
    +** Processing line: ~      # 0.25.seconds to 1.25.seconds or more, the change will last longer.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    +** Processing line: ~      if state.clear_button.clicked_at~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def receiveNext (p)~
    +      if state.clear_button.clicked_at
    +** Processing line: ~        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]~
     - Inside source: true
     *** True Line Result
    -      def receiveNext (p)
    -** Processing line: ~        #trace!~
    +        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        #trace!
    -** Processing line: ~        if parent != nil~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        if parent != nil
    -** Processing line: ~          @x = p[:x]~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          @x = p[:x]
    -** Processing line: ~          @y = p[:y]~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          @y = p[:y]
    -** Processing line: ~          @velocity = p[:velocity]~
    +
    +** Processing line: ~  $paint_app = PaintApp.new~
     - Inside source: true
     *** True Line Result
    -          @velocity = p[:velocity]
    -** Processing line: ~          #puts @x.to_s + "|" + @y.to_s + "|"+@velocity.to_s~
    +  $paint_app = PaintApp.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          #puts @x.to_s + "|" + @y.to_s + "|"+@velocity.to_s
    -** Processing line: ~          @past.append(p)~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -          @past.append(p)
    -** Processing line: ~          if (@past.length >= BALL_DISTANCE)~
    +  def tick args
    +** Processing line: ~    $paint_app.inputs = args.inputs~
     - Inside source: true
     *** True Line Result
    -          if (@past.length >= BALL_DISTANCE)
    -** Processing line: ~            if (@child != nil)~
    +    $paint_app.inputs = args.inputs
    +** Processing line: ~    $paint_app.state = args.state~
     - Inside source: true
     *** True Line Result
    -            if (@child != nil)
    -** Processing line: ~              @child.receiveNext(@past[0])~
    +    $paint_app.state = args.state
    +** Processing line: ~    $paint_app.grid = args.grid~
     - Inside source: true
     *** True Line Result
    -              @child.receiveNext(@past[0])
    -** Processing line: ~              @past.shift~
    +    $paint_app.grid = args.grid
    +** Processing line: ~    $paint_app.args = args~
     - Inside source: true
     *** True Line Result
    -              @past.shift
    -** Processing line: ~            end~
    +    $paint_app.args = args
    +** Processing line: ~    $paint_app.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +    $paint_app.outputs = args.outputs
    +** Processing line: ~    $paint_app.tick~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +    $paint_app.tick
    +** Processing line: ~    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Move the ball according to its velocity~
    -- Inside source: true
    -*** True Line Result
    -      #Move the ball according to its velocity
    -** Processing line: ~      def update args~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -      def update args
    -** Processing line: ~~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          if isLeader~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -          if isLeader
    -** Processing line: ~            wallBounds args~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -            wallBounds args
    -** Processing line: ~            @x += @velocity.x~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -            @x += @velocity.x
    -** Processing line: ~            @y += @velocity.y~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -            @y += @velocity.y
    -** Processing line: ~            @past.append({x: @x, y: @y, velocity: @velocity})~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -            @past.append({x: @x, y: @y, velocity: @velocity})
    -** Processing line: ~            #puts @past~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            #puts @past
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            if (@past.length >= BALL_DISTANCE)~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -            if (@past.length >= BALL_DISTANCE)
    -** Processing line: ~              if (@child != nil)~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -              if (@child != nil)
    -** Processing line: ~                @child.receiveNext(@past[0])~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -                @child.receiveNext(@past[0])
    -** Processing line: ~                @past.shift~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                @past.shift
    -** Processing line: ~              end~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              end
    -** Processing line: ~            end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -            end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~          else~
    -- Inside source: true
    +** Processing line: ~*** Mouse - Coordinate Systems - main.rb~
    +- Header detected.
     *** True Line Result
    -          else
    -** Processing line: ~            puts "unexpected"~
    -- Inside source: true
    +
     *** True Line Result
    -            puts "unexpected"
    -** Processing line: ~            raise "unexpected"~
    -- Inside source: true
    +*** Mouse - Coordinate Systems - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -            raise "unexpected"
    -** Processing line: ~          end~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/05_mouse/04_coordinate_systems/app/main.rb~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~      end~
    +  # ./samples/05_mouse/04_coordinate_systems/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -      end
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def wallBounds args~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -      def wallBounds args
    -** Processing line: ~          b= false~
    +   APIs listing that haven't been encountered in previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          b= false
    -** Processing line: ~          if @x < @left_wall~
    +
    +** Processing line: ~   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.~
     - Inside source: true
     *** True Line Result
    -          if @x < @left_wall
    -** Processing line: ~            @velocity.x = @velocity.x.abs() * 1~
    +   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    +** Processing line: ~     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for~
     - Inside source: true
     *** True Line Result
    -            @velocity.x = @velocity.x.abs() * 1
    -** Processing line: ~            b=true~
    +     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    +** Processing line: ~     position to know the mouse's coordinates.~
     - Inside source: true
     *** True Line Result
    -            b=true
    -** Processing line: ~          elsif @x + @width > @right_wall~
    +     position to know the mouse's coordinates.
    +** Processing line: ~     For more information about the mouse, go to mygame/documentation/07-mouse.md.~
     - Inside source: true
     *** True Line Result
    -          elsif @x + @width > @right_wall
    -** Processing line: ~            @velocity.x = @velocity.x.abs() * -1~
    +     For more information about the mouse, go to mygame/documentation/07-mouse.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            @velocity.x = @velocity.x.abs() * -1
    -** Processing line: ~            b=true~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -            b=true
    -** Processing line: ~          end~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          if @y < 0~
    +
    +** Processing line: ~   - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
     - Inside source: true
     *** True Line Result
    -          if @y < 0
    -** Processing line: ~            @velocity.y = @velocity.y.abs() * 1~
    +   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            @velocity.y = @velocity.y.abs() * 1
    -** Processing line: ~            b=true~
    +
    +** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
     - Inside source: true
     *** True Line Result
    -            b=true
    -** Processing line: ~          elsif @y + @height > args.grid.h~
    +   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          elsif @y + @height > args.grid.h
    -** Processing line: ~            @velocity.y = @velocity.y.abs() * -1~
    +
    +** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -            @velocity.y = @velocity.y.abs() * -1
    -** Processing line: ~            b=true~
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -            b=true
    -** Processing line: ~          end~
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          mag = (@velocity.x**2.0 + @velocity.y**2.0)**0.5~
    +
    +** Processing line: ~     In this sample app, string interpolation is used to show the current position of the mouse~
     - Inside source: true
     *** True Line Result
    -          mag = (@velocity.x**2.0 + @velocity.y**2.0)**0.5
    -** Processing line: ~          if (b == true && mag < MAX_VELOCITY)~
    +     In this sample app, string interpolation is used to show the current position of the mouse
    +** Processing line: ~     in a label.~
     - Inside source: true
     *** True Line Result
    -          if (b == true && mag < MAX_VELOCITY)
    -** Processing line: ~            @velocity.x*=1.1;~
    +     in a label.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            @velocity.x*=1.1;
    -** Processing line: ~            @velocity.y*=1.1;~
    +
    +** Processing line: ~   - args.outputs.labels: An array that generates a label.~
     - Inside source: true
     *** True Line Result
    -            @velocity.y*=1.1;
    -** Processing line: ~          end~
    +   - args.outputs.labels: An array that generates a label.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -          end
    +     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +- Inside source: true
    +*** True Line Result
    +     For more information about labels, go to mygame/documentation/02-labels.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      end~
    +** Processing line: ~   - args.outputs.solids: An array that generates a solid.~
     - Inside source: true
     *** True Line Result
    -      end
    +   - args.outputs.solids: An array that generates a solid.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
    +- Inside source: true
    +*** True Line Result
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    +** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +- Inside source: true
    +*** True Line Result
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #render the ball to the screen~
    +** Processing line: ~   - args.outputs.lines: An array that generates a line.~
     - Inside source: true
     *** True Line Result
    -      #render the ball to the screen
    -** Processing line: ~      def draw args~
    +   - args.outputs.lines: An array that generates a line.
    +** Processing line: ~     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]~
     - Inside source: true
     *** True Line Result
    -      def draw args
    +     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    +** Processing line: ~     For more information about lines, go to mygame/documentation/04-lines.md.~
    +- Inside source: true
    +*** True Line Result
    +     For more information about lines, go to mygame/documentation/04-lines.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          #update args~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -          #update args
    -** Processing line: ~          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];
    -** Processing line: ~          #args.outputs.sprits << {~
    +
    +** Processing line: ~  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.sprits << {
    -** Processing line: ~            #x: @x,~
    +  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    +** Processing line: ~  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or~
     - Inside source: true
     *** True Line Result
    -            #x: @x,
    -** Processing line: ~            #y: @y,~
    +  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    +** Processing line: ~  # four quadrants by pressing the button.~
     - Inside source: true
     *** True Line Result
    -            #y: @y,
    -** Processing line: ~            #w: @width,~
    +  # four quadrants by pressing the button.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            #w: @width,
    -** Processing line: ~            #h: @height,~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -            #h: @height,
    -** Processing line: ~            #path: "sprites/ball10.png"~
    +  def tick args
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            #path: "sprites/ball10.png"
    -** Processing line: ~          #}~
    +
    +** Processing line: ~    # The addition and subtraction in the first two parameters of the label and solid~
     - Inside source: true
     *** True Line Result
    -          #}
    -** Processing line: ~          #args.outputs.sprites <<[@x, @y, @width, @height, "sprites/ball10.png"]~
    +    # The addition and subtraction in the first two parameters of the label and solid
    +** Processing line: ~    # ensure that the outputs don't overlap each other. Try removing them and see what happens.~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.sprites <<[@x, @y, @width, @height, "sprites/ball10.png"]
    -** Processing line: ~          args.outputs.sprites << {x: @x, y: @y, w: @width, h: @height, path:"sprites/ball10.png" }~
    +    # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    +** Processing line: ~    pos = args.inputs.mouse.position # stores coordinates of mouse's position~
     - Inside source: true
     *** True Line Result
    -          args.outputs.sprites << {x: @x, y: @y, w: @width, h: @height, path:"sprites/ball10.png" }
    -** Processing line: ~      end~
    +    pos = args.inputs.mouse.position # stores coordinates of mouse's position
    +** Processing line: ~    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    +** Processing line: ~    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def getDraw args~
    +    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      def getDraw args
    -** Processing line: ~        #wallBounds args~
    +
    +** Processing line: ~    button = [0, 0, 370, 50] # sets definition of toggle button~
     - Inside source: true
     *** True Line Result
    -        #wallBounds args
    -** Processing line: ~        #update args~
    +    button = [0, 0, 370, 50] # sets definition of toggle button
    +** Processing line: ~    args.outputs.borders << button # outputs button as border (not filled in)~
     - Inside source: true
     *** True Line Result
    -        #update args
    -** Processing line: ~        #args.outputs.labels << [@x, @y, @number.to_s + "|" + @leastChain.to_s]~
    +    args.outputs.borders << button # outputs button as border (not filled in)
    +** Processing line: ~    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button~
     - Inside source: true
     *** True Line Result
    -        #args.outputs.labels << [@x, @y, @number.to_s + "|" + @leastChain.to_s]
    -** Processing line: ~        return [@x, @y, @width, @height, "sprites/ball10.png"]~
    +    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    +** Processing line: ~    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants~
     - Inside source: true
     *** True Line Result
    -        return [@x, @y, @width, @height, "sprites/ball10.png"]
    -** Processing line: ~      end~
    +    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    +** Processing line: ~    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants~
     - Inside source: true
     *** True Line Result
    -      end
    +    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def getPoints args~
    +** Processing line: ~    if args.inputs.mouse.click # if the user clicks the mouse~
     - Inside source: true
     *** True Line Result
    -      def getPoints args
    -** Processing line: ~        points = [~
    +    if args.inputs.mouse.click # if the user clicks the mouse
    +** Processing line: ~      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)~
     - Inside source: true
     *** True Line Result
    -        points = [
    -** Processing line: ~          {x:@x+@width/2, y: @y},~
    +      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    +** Processing line: ~      if pos.inside_rect? button # if the click occurred inside the button~
     - Inside source: true
     *** True Line Result
    -          {x:@x+@width/2, y: @y},
    -** Processing line: ~          {x:@x+@width, y:@y+@height/2},~
    +      if pos.inside_rect? button # if the click occurred inside the button
    +** Processing line: ~        if args.grid.name == :bottom_left # if the grid shows bottom left as origin~
     - Inside source: true
     *** True Line Result
    -          {x:@x+@width, y:@y+@height/2},
    -** Processing line: ~          {x:@x+@width/2,y:@y+@height},~
    +        if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    +** Processing line: ~          args.grid.origin_center! # origin will be shown in center~
     - Inside source: true
     *** True Line Result
    -          {x:@x+@width/2,y:@y+@height},
    -** Processing line: ~          {x:@x,y:@y+@height/2}~
    +          args.grid.origin_center! # origin will be shown in center
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -          {x:@x,y:@y+@height/2}
    -** Processing line: ~        ]~
    +        else
    +** Processing line: ~          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~        #psize = 5.0~
    +          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        #psize = 5.0
    -** Processing line: ~        #for p in points~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        #for p in points
    -** Processing line: ~          #args.outputs.solids << [p.x-psize/2.0, p.y-psize/2.0, psize, psize, 0, 0, 0];~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [p.x-psize/2.0, p.y-psize/2.0, psize, psize, 0, 0, 0];
    -** Processing line: ~        #end~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        #end
    -** Processing line: ~        return points~
    +
    +** Processing line: ~    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."~
     - Inside source: true
     *** True Line Result
    -        return points
    -** Processing line: ~      end~
    +    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def serialize~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -      def serialize
    -** Processing line: ~        {x: @x, y:@y}~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -        {x: @x, y:@y}
    -** Processing line: ~      end~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def inspect~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -      def inspect
    -** Processing line: ~        serialize.to_s~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -        serialize.to_s
    -** Processing line: ~      end~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -      end
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def to_s~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -      def to_s
    -** Processing line: ~        serialize.to_s~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        serialize.to_s
    -** Processing line: ~      end~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -33068,250 +41343,254 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - blocks.rb~
    +** Processing line: ~*** Save Load - Save Load Game - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - blocks.rb
    +*** Save Load - Save Load Game - 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/04_physics_and_collisions/09_arbitrary_collision/app/blocks.rb~
    +** Processing line: ~  # ./samples/06_save_load/01_save_load_game/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/blocks.rb
    -** Processing line: ~  MAX_COUNT=100~
    +  # ./samples/06_save_load/01_save_load_game/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -  MAX_COUNT=100
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def universalUpdateOne args, shape~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -  def universalUpdateOne args, shape
    -** Processing line: ~    didHit = false~
    +   APIs listing that haven't been encountered in previous sample apps:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    didHit = false
    -** Processing line: ~    hitters = []~
    +
    +** Processing line: ~   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful~
     - Inside source: true
     *** True Line Result
    -    hitters = []
    -** Processing line: ~    #puts shape.to_s~
    +   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    +** Processing line: ~     because with a given symbol name, you can refer to the same object throughout~
     - Inside source: true
     *** True Line Result
    -    #puts shape.to_s
    -** Processing line: ~    toCollide = nil~
    +     because with a given symbol name, you can refer to the same object throughout
    +** Processing line: ~     a Ruby program.~
     - Inside source: true
     *** True Line Result
    -    toCollide = nil
    -** Processing line: ~    for b in args.state.balls~
    +     a Ruby program.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    for b in args.state.balls
    -** Processing line: ~      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)~
    +
    +** Processing line: ~     In this sample app, we're using symbols for our buttons. We have buttons that~
     - Inside source: true
     *** True Line Result
    -      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)
    -** Processing line: ~        didSquare = false~
    +     In this sample app, we're using symbols for our buttons. We have buttons that
    +** Processing line: ~     light fires, save, load, etc. Each of these buttons has a distinct symbol like~
     - Inside source: true
     *** True Line Result
    -        didSquare = false
    -** Processing line: ~        for s in shape.squareColliders~
    +     light fires, save, load, etc. Each of these buttons has a distinct symbol like
    +** Processing line: ~     :light_fire, :save_game, :load_game, etc.~
     - Inside source: true
     *** True Line Result
    -        for s in shape.squareColliders
    -** Processing line: ~          if (s.collision?(args, b))~
    +     :light_fire, :save_game, :load_game, etc.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          if (s.collision?(args, b))
    -** Processing line: ~            didSquare = true~
    +
    +** Processing line: ~   - to_sym: Returns the symbol corresponding to the given string; creates the symbol~
     - Inside source: true
     *** True Line Result
    -            didSquare = true
    -** Processing line: ~            didHit = true~
    +   - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    +** Processing line: ~     if it does not already exist.~
     - Inside source: true
     *** True Line Result
    -            didHit = true
    -** Processing line: ~            #s.collide(args, b)~
    +     if it does not already exist.
    +** Processing line: ~     For example,~
     - Inside source: true
     *** True Line Result
    -            #s.collide(args, b)
    -** Processing line: ~            toCollide = s~
    +     For example,
    +** Processing line: ~     'car'.to_sym~
     - Inside source: true
     *** True Line Result
    -            toCollide = s
    -** Processing line: ~            #hitter = b~
    +     'car'.to_sym
    +** Processing line: ~     would return the symbol :car.~
     - Inside source: true
     *** True Line Result
    -            #hitter = b
    -** Processing line: ~            hitters.append(b)~
    +     would return the symbol :car.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            hitters.append(b)
    -** Processing line: ~          end #end if~
    +
    +** Processing line: ~   - last: Returns the last element of an array.~
     - Inside source: true
     *** True Line Result
    -          end #end if
    -** Processing line: ~        end #end for~
    +   - last: Returns the last element of an array.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end #end for
    -** Processing line: ~        if (didSquare == false)~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -        if (didSquare == false)
    -** Processing line: ~          for c in shape.colliders~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          for c in shape.colliders
    -** Processing line: ~            #puts args.state.ball.velocity~
    +
    +** Processing line: ~   - num1.lesser(num2): finds the lower value of the given options.~
     - Inside source: true
     *** True Line Result
    -            #puts args.state.ball.velocity
    -** Processing line: ~            if c.collision?(args, b.getPoints(args),b)~
    +   - num1.lesser(num2): finds the lower value of the given options.
    +** Processing line: ~     For example, in the statement~
     - Inside source: true
     *** True Line Result
    -            if c.collision?(args, b.getPoints(args),b)
    -** Processing line: ~              #c.collide args, b~
    +     For example, in the statement
    +** Processing line: ~     a = 4.lesser(3)~
     - Inside source: true
     *** True Line Result
    -              #c.collide args, b
    -** Processing line: ~              toCollide = c~
    +     a = 4.lesser(3)
    +** Processing line: ~     3 has a lower value than 4, which means that the value of a would be set to 3,~
     - Inside source: true
     *** True Line Result
    -              toCollide = c
    -** Processing line: ~              didHit = true~
    +     3 has a lower value than 4, which means that the value of a would be set to 3,
    +** Processing line: ~     but if the statement had been~
     - Inside source: true
     *** True Line Result
    -              didHit = true
    -** Processing line: ~              hitters.append(b)~
    +     but if the statement had been
    +** Processing line: ~     a = 4.lesser(5)~
     - Inside source: true
     *** True Line Result
    -              hitters.append(b)
    -** Processing line: ~            end #end if~
    +     a = 4.lesser(5)
    +** Processing line: ~     4 has a lower value than 5, which means that the value of a would be set to 4.~
     - Inside source: true
     *** True Line Result
    -            end #end if
    -** Processing line: ~          end #end for~
    +     4 has a lower value than 5, which means that the value of a would be set to 4.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end #end for
    -** Processing line: ~        end #end if~
    +
    +** Processing line: ~   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.~
     - Inside source: true
     *** True Line Result
    -        end #end if
    -** Processing line: ~      end#end if~
    +   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    +** Processing line: ~     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0~
     - Inside source: true
     *** True Line Result
    -      end#end if
    -** Processing line: ~    end#end for~
    +     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end#end for
    -** Processing line: ~    if (didHit)~
    +
    +** Processing line: ~   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -    if (didHit)
    -** Processing line: ~      shape.count=0~
    +   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -      shape.count=0
    -** Processing line: ~      hitters = hitters.uniq~
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      hitters = hitters.uniq
    -** Processing line: ~      for hitter in hitters~
    +
    +** Processing line: ~   - args.outputs.labels: An array. Values generate a label.~
     - Inside source: true
     *** True Line Result
    -      for hitter in hitters
    -** Processing line: ~        hitter.makeLeader args~
    +   - args.outputs.labels: An array. Values generate a label.
    +** Processing line: ~     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -        hitter.makeLeader args
    -** Processing line: ~        #toCollide.collide(args, hitter)~
    +     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -        #toCollide.collide(args, hitter)
    -** Processing line: ~        if shape.home == "squares"~
    +     For more information, go to mygame/documentation/02-labels.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if shape.home == "squares"
    -** Processing line: ~          args.state.squares.delete(shape)~
    +
    +** Processing line: ~   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
     - Inside source: true
     *** True Line Result
    -          args.state.squares.delete(shape)
    -** Processing line: ~        elsif shape.home == "tshapes"~
    +   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +** Processing line: ~     with at least four values is considered a rect. The inside_rect? function returns true~
     - Inside source: true
     *** True Line Result
    -        elsif shape.home == "tshapes"
    -** Processing line: ~          args.state.tshapes.delete(shape)~
    +     with at least four values is considered a rect. The inside_rect? function returns true
    +** Processing line: ~     or false depending on if the point is inside the rect.~
     - Inside source: true
     *** True Line Result
    -          args.state.tshapes.delete(shape)
    -** Processing line: ~        else shape.home == "lines"~
    +     or false depending on if the point is inside the rect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        else shape.home == "lines"
    -** Processing line: ~          args.state.lines.delete(shape)~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -          args.state.lines.delete(shape)
    -** Processing line: ~        end~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~  # This code allows users to perform different tasks, such as saving and loading the game.~
     - Inside source: true
     *** True Line Result
    -      end
    +  # This code allows users to perform different tasks, such as saving and loading the game.
    +** Processing line: ~  # Users also have options to reset the game and light a fire.~
    +- Inside source: true
    +*** True Line Result
    +  # Users also have options to reset the game and light a fire.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #puts "HIT!" + hitter.number~
    +** Processing line: ~  class TextedBasedGame~
     - Inside source: true
     *** True Line Result
    -      #puts "HIT!" + hitter.number
    -** Processing line: ~    end~
    +  class TextedBasedGame
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +
    +** Processing line: ~    # Contains methods needed for game to run properly.~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    # Contains methods needed for game to run properly.
    +** Processing line: ~    # Increments tick count by 1 each time it runs (60 times in a single second)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def universalUpdate args, shape~
    +    # Increments tick count by 1 each time it runs (60 times in a single second)
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -  def universalUpdate args, shape
    -** Processing line: ~    #puts shape.home~
    +    def tick
    +** Processing line: ~      default~
     - Inside source: true
     *** True Line Result
    -    #puts shape.home
    -** Processing line: ~    if (shape.count <= 1)~
    +      default
    +** Processing line: ~      show_intro~
     - Inside source: true
     *** True Line Result
    -    if (shape.count <= 1)
    -** Processing line: ~      universalUpdateOne args, shape~
    +      show_intro
    +** Processing line: ~      state.engine_tick_count += 1~
     - Inside source: true
     *** True Line Result
    -      universalUpdateOne args, shape
    -** Processing line: ~      return~
    +      state.engine_tick_count += 1
    +** Processing line: ~      tick_fire~
     - Inside source: true
     *** True Line Result
    -      return
    +      tick_fire
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -33320,1770 +41599,1654 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    didHit = false~
    -- Inside source: true
    -*** True Line Result
    -    didHit = false
    -** Processing line: ~    hitter = nil~
    -- Inside source: true
    -*** True Line Result
    -    hitter = nil
    -** Processing line: ~    for b in args.state.ballParents~
    -- Inside source: true
    -*** True Line Result
    -    for b in args.state.ballParents
    -** Processing line: ~      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)~
    +** Processing line: ~    # Sets default values.~
     - Inside source: true
     *** True Line Result
    -      if [b.x, b.y, b.width, b.height].intersect_rect?(shape.bold)
    -** Processing line: ~        didSquare = false~
    +    # Sets default values.
    +** Processing line: ~    # The ||= ensures that a variable's value is only set to the value following the = sign~
     - Inside source: true
     *** True Line Result
    -        didSquare = false
    -** Processing line: ~        for s in shape.squareColliders~
    +    # The ||= ensures that a variable's value is only set to the value following the = sign
    +** Processing line: ~    # if the value has not already been set before. Intialization happens only in the first frame.~
     - Inside source: true
     *** True Line Result
    -        for s in shape.squareColliders
    -** Processing line: ~          if (s.collision?(args, b))~
    +    # if the value has not already been set before. Intialization happens only in the first frame.
    +** Processing line: ~    def default~
     - Inside source: true
     *** True Line Result
    -          if (s.collision?(args, b))
    -** Processing line: ~            didSquare = true~
    +    def default
    +** Processing line: ~      state.engine_tick_count ||= 0~
     - Inside source: true
     *** True Line Result
    -            didSquare = true
    -** Processing line: ~            didHit = true~
    +      state.engine_tick_count ||= 0
    +** Processing line: ~      state.active_module     ||= :room~
     - Inside source: true
     *** True Line Result
    -            didHit = true
    -** Processing line: ~            s.collide(args, b)~
    +      state.active_module     ||= :room
    +** Processing line: ~      state.fire_progress     ||= 0~
     - Inside source: true
     *** True Line Result
    -            s.collide(args, b)
    -** Processing line: ~            hitter = b~
    +      state.fire_progress     ||= 0
    +** Processing line: ~      state.fire_ready_in     ||= 10~
     - Inside source: true
     *** True Line Result
    -            hitter = b
    -** Processing line: ~          end~
    +      state.fire_ready_in     ||= 10
    +** Processing line: ~      state.previous_fire     ||= :dead~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +      state.previous_fire     ||= :dead
    +** Processing line: ~      state.fire              ||= :dead~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        if (didSquare == false)~
    +      state.fire              ||= :dead
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        if (didSquare == false)
    -** Processing line: ~          for c in shape.colliders~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          for c in shape.colliders
    -** Processing line: ~            #puts args.state.ball.velocity~
    +
    +** Processing line: ~    def show_intro~
     - Inside source: true
     *** True Line Result
    -            #puts args.state.ball.velocity
    -** Processing line: ~            if c.collision?(args, b.getPoints(args),b)~
    +    def show_intro
    +** Processing line: ~      return unless state.engine_tick_count == 0 # return unless the game just started~
     - Inside source: true
     *** True Line Result
    -            if c.collision?(args, b.getPoints(args),b)
    -** Processing line: ~              c.collide args, b~
    +      return unless state.engine_tick_count == 0 # return unless the game just started
    +** Processing line: ~      set_story_line "awake." # calls set_story_line method, sets to "awake"~
     - Inside source: true
     *** True Line Result
    -              c.collide args, b
    -** Processing line: ~              didHit = true~
    +      set_story_line "awake." # calls set_story_line method, sets to "awake"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              didHit = true
    -** Processing line: ~              hitter = b~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              hitter = b
    -** Processing line: ~            end~
    +
    +** Processing line: ~    # Sets story line.~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +    # Sets story line.
    +** Processing line: ~    def set_story_line story_line~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +    def set_story_line story_line
    +** Processing line: ~      state.story_line    = story_line # story line set to value of parameter~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      state.story_line    = story_line # story line set to value of parameter
    +** Processing line: ~      state.active_module = :alert # active module set to alert~
     - Inside source: true
     *** True Line Result
    -      end
    +      state.active_module = :alert # active module set to alert
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~    if (didHit)~
    -- Inside source: true
    -*** True Line Result
    -    if (didHit)
    -** Processing line: ~      shape.count=shape.count-1~
    -- Inside source: true
    -*** True Line Result
    -      shape.count=shape.count-1
    -** Processing line: ~      shape.damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])~
    -- Inside source: true
    -*** True Line Result
    -      shape.damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    +** Processing line: ~    # Clears story line.~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    i=0~
    +    # Clears story line.
    +** Processing line: ~    def clear_storyline~
     - Inside source: true
     *** True Line Result
    -    i=0
    -** Processing line: ~    while i < shape.damageCount.length~
    +    def clear_storyline
    +** Processing line: ~      state.active_module = :none # active module set to none~
     - Inside source: true
     *** True Line Result
    -    while i < shape.damageCount.length
    -** Processing line: ~      if shape.damageCount[i][0] <= 0~
    +      state.active_module = :none # active module set to none
    +** Processing line: ~      state.story_line = nil # story line is cleared, set to nil (or empty)~
     - Inside source: true
     *** True Line Result
    -      if shape.damageCount[i][0] <= 0
    -** Processing line: ~        shape.damageCount.delete_at(i)~
    +      state.story_line = nil # story line is cleared, set to nil (or empty)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        shape.damageCount.delete_at(i)
    -** Processing line: ~        i-=1~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        i-=1
    -** Processing line: ~      elsif shape.damageCount[i][1].elapsed_time > BALL_DISTANCE and shape.damageCount[i][0] > 1~
    +
    +** Processing line: ~    # Determines fire progress (how close the fire is to being ready to light).~
     - Inside source: true
     *** True Line Result
    -      elsif shape.damageCount[i][1].elapsed_time > BALL_DISTANCE and shape.damageCount[i][0] > 1
    -** Processing line: ~        shape.count-=1~
    +    # Determines fire progress (how close the fire is to being ready to light).
    +** Processing line: ~    def tick_fire~
     - Inside source: true
     *** True Line Result
    -        shape.count-=1
    -** Processing line: ~        shape.damageCount[i][0]-=1~
    +    def tick_fire
    +** Processing line: ~      return if state.active_module == :alert # return if active module is alert~
     - Inside source: true
     *** True Line Result
    -        shape.damageCount[i][0]-=1
    -** Processing line: ~        shape.damageCount[i][1] = args.state.tick_count~
    +      return if state.active_module == :alert # return if active module is alert
    +** Processing line: ~      state.fire_progress += 1 # increment fire progress~
     - Inside source: true
     *** True Line Result
    -        shape.damageCount[i][1] = args.state.tick_count
    -** Processing line: ~      end~
    +      state.fire_progress += 1 # increment fire progress
    +** Processing line: ~      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      i+=1~
    +      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    +** Processing line: ~      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)~
     - Inside source: true
     *** True Line Result
    -      i+=1
    +      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
     ** 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: ~  class Square~
    -- Inside source: true
    -*** True Line Result
    -  class Square
    -** Processing line: ~     attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +** Processing line: ~    # Sets the value of fire (whether it is dead or roaring), and the story line~
     - Inside source: true
     *** True Line Result
    -     attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    -** Processing line: ~     def initialize(args, x, y, block_size, orientation, block_offset)~
    +    # Sets the value of fire (whether it is dead or roaring), and the story line
    +** Processing line: ~    def light_fire~
     - Inside source: true
     *** True Line Result
    -     def initialize(args, x, y, block_size, orientation, block_offset)
    -** Processing line: ~          @x = x * block_size~
    +    def light_fire
    +** Processing line: ~      return unless fire_ready? # returns unless the fire is ready to be lit~
     - Inside source: true
     *** True Line Result
    -          @x = x * block_size
    -** Processing line: ~          @y = y * block_size~
    +      return unless fire_ready? # returns unless the fire is ready to be lit
    +** Processing line: ~      state.fire = :roaring # fire is lit, set to roaring~
     - Inside source: true
     *** True Line Result
    -          @y = y * block_size
    -** Processing line: ~          @block_size = block_size~
    +      state.fire = :roaring # fire is lit, set to roaring
    +** Processing line: ~      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit~
     - Inside source: true
     *** True Line Result
    -          @block_size = block_size
    -** Processing line: ~          @block_offset = block_offset~
    +      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    +** Processing line: ~      if state.fire != state.previous_fire~
     - Inside source: true
     *** True Line Result
    -          @block_offset = block_offset
    -** Processing line: ~          @orientation = orientation~
    +      if state.fire != state.previous_fire
    +** Processing line: ~        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation~
     - Inside source: true
     *** True Line Result
    -          @orientation = orientation
    -** Processing line: ~          @damageCount = []~
    +        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    +** Processing line: ~        state.previous_fire = state.fire~
     - Inside source: true
     *** True Line Result
    -          @damageCount = []
    -** Processing line: ~          @home = 'squares'~
    +        state.previous_fire = state.fire
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -          @home = 'squares'
    -** Processing line: ~~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          Kernel.srand()~
    +** Processing line: ~    # Checks if the fire is ready to be lit. Returns a boolean value.~
     - Inside source: true
     *** True Line Result
    -          Kernel.srand()
    -** Processing line: ~          @r = rand(255)~
    +    # Checks if the fire is ready to be lit. Returns a boolean value.
    +** Processing line: ~    def fire_ready?~
     - Inside source: true
     *** True Line Result
    -          @r = rand(255)
    -** Processing line: ~          @g = rand(255)~
    +    def fire_ready?
    +** Processing line: ~      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),~
     - Inside source: true
     *** True Line Result
    -          @g = rand(255)
    -** Processing line: ~          @b = rand(255)~
    +      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    +** Processing line: ~      # the fire is ready to be lit.~
     - Inside source: true
     *** True Line Result
    -          @b = rand(255)
    -** Processing line: ~~
    +      # the fire is ready to be lit.
    +** Processing line: ~      state.fire_progress == state.fire_ready_in~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +      state.fire_progress == state.fire_ready_in
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          @count = rand(MAX_COUNT)+1
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    -- Inside source: true
    -*** True Line Result
    -          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    -** Processing line: ~          @x_adjusted = @x + x_offset~
    -- Inside source: true
    -*** True Line Result
    -          @x_adjusted = @x + x_offset
    -** Processing line: ~          @y_adjusted = @y~
    +** Processing line: ~    # Divides the value of the fire_progress variable by 10 to determine how close the user is to~
     - Inside source: true
     *** True Line Result
    -          @y_adjusted = @y
    -** Processing line: ~          @size_adjusted = @block_size * 2 - @block_offset~
    +    # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    +** Processing line: ~    # being able to light a fire.~
     - Inside source: true
     *** True Line Result
    -          @size_adjusted = @block_size * 2 - @block_offset
    -** Processing line: ~~
    +    # being able to light a fire.
    +** Processing line: ~    def light_fire_progress~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          hypotenuse=args.state.ball_hypotenuse~
    +    def light_fire_progress
    +** Processing line: ~      state.fire_progress.fdiv(10) # float division~
     - Inside source: true
     *** True Line Result
    -          hypotenuse=args.state.ball_hypotenuse
    -** Processing line: ~          @bold = [(@x_adjusted-hypotenuse/2)-1, (@y_adjusted-hypotenuse/2)-1, @size_adjusted + hypotenuse + 2, @size_adjusted + hypotenuse + 2]~
    +      state.fire_progress.fdiv(10) # float division
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          @bold = [(@x_adjusted-hypotenuse/2)-1, (@y_adjusted-hypotenuse/2)-1, @size_adjusted + hypotenuse + 2, @size_adjusted + hypotenuse + 2]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @points = [~
    -- Inside source: true
    -*** True Line Result
    -          @points = [
    -** Processing line: ~            {x:@x_adjusted, y:@y_adjusted},~
    -- Inside source: true
    -*** True Line Result
    -            {x:@x_adjusted, y:@y_adjusted},
    -** Processing line: ~            {x:@x_adjusted+@size_adjusted, y:@y_adjusted},~
    -- Inside source: true
    -*** True Line Result
    -            {x:@x_adjusted+@size_adjusted, y:@y_adjusted},
    -** Processing line: ~            {x:@x_adjusted+@size_adjusted, y:@y_adjusted+@size_adjusted},~
    -- Inside source: true
    -*** True Line Result
    -            {x:@x_adjusted+@size_adjusted, y:@y_adjusted+@size_adjusted},
    -** Processing line: ~            {x:@x_adjusted, y:@y_adjusted+@size_adjusted}~
    +** Processing line: ~    # Defines fire as the state.fire variable.~
     - Inside source: true
     *** True Line Result
    -            {x:@x_adjusted, y:@y_adjusted+@size_adjusted}
    -** Processing line: ~          ]~
    +    # Defines fire as the state.fire variable.
    +** Processing line: ~    def fire~
     - Inside source: true
     *** True Line Result
    -          ]
    -** Processing line: ~          @squareColliders = [~
    +    def fire
    +** Processing line: ~      state.fire~
     - Inside source: true
     *** True Line Result
    -          @squareColliders = [
    -** Processing line: ~            SquareCollider.new(@points[0].x,@points[0].y,{x:-1,y:-1}),~
    +      state.fire
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            SquareCollider.new(@points[0].x,@points[0].y,{x:-1,y:-1}),
    -** Processing line: ~            SquareCollider.new(@points[1].x-COLLISIONWIDTH,@points[1].y,{x:1,y:-1}),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            SquareCollider.new(@points[1].x-COLLISIONWIDTH,@points[1].y,{x:1,y:-1}),
    -** Processing line: ~            SquareCollider.new(@points[2].x-COLLISIONWIDTH,@points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +
    +** Processing line: ~    # Sets the title of the room.~
     - Inside source: true
     *** True Line Result
    -            SquareCollider.new(@points[2].x-COLLISIONWIDTH,@points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~            SquareCollider.new(@points[3].x,@points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +    # Sets the title of the room.
    +** Processing line: ~    def room_title~
     - Inside source: true
     *** True Line Result
    -            SquareCollider.new(@points[3].x,@points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~          ]~
    +    def room_title
    +** Processing line: ~      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead~
     - Inside source: true
     *** True Line Result
    -          ]
    -** Processing line: ~          @colliders = [~
    +      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    +** Processing line: ~      return "a room that is lit" # room is lit if the fire is not dead~
     - Inside source: true
     *** True Line Result
    -          @colliders = [
    -** Processing line: ~            LinearCollider.new(@points[0],@points[1], :neg),~
    +      return "a room that is lit" # room is lit if the fire is not dead
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            LinearCollider.new(@points[0],@points[1], :neg),
    -** Processing line: ~            LinearCollider.new(@points[1],@points[2], :neg),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            LinearCollider.new(@points[1],@points[2], :neg),
    -** Processing line: ~            LinearCollider.new(@points[2],@points[3], :pos),~
    +
    +** Processing line: ~    # Sets the active_module to room.~
     - Inside source: true
     *** True Line Result
    -            LinearCollider.new(@points[2],@points[3], :pos),
    -** Processing line: ~            LinearCollider.new(@points[0],@points[3], :pos)~
    +    # Sets the active_module to room.
    +** Processing line: ~    def go_to_room~
     - Inside source: true
     *** True Line Result
    -            LinearCollider.new(@points[0],@points[3], :pos)
    -** Processing line: ~          ]~
    +    def go_to_room
    +** Processing line: ~      state.active_module = :room~
     - Inside source: true
     *** True Line Result
    -          ]
    -** Processing line: ~     end~
    +      state.active_module = :room
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     def draw(args)~
    +** Processing line: ~    # Defines active_module as the state.active_module variable.~
     - Inside source: true
     *** True Line Result
    -     def draw(args)
    -** Processing line: ~      #Offset the coordinates to the edge of the game area~
    +    # Defines active_module as the state.active_module variable.
    +** Processing line: ~    def active_module~
     - Inside source: true
     *** True Line Result
    -      #Offset the coordinates to the edge of the game area
    -** Processing line: ~      x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    +    def active_module
    +** Processing line: ~      state.active_module~
     - Inside source: true
     *** True Line Result
    -      x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    -** Processing line: ~      #args.outputs.solids << [@x + x_offset, @y, @block_size * 2 - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +      state.active_module
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.solids << [@x + x_offset, @y, @block_size * 2 - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    -** Processing line: ~      args.outputs.solids <<{x: (@x + x_offset), y: (@y), w: (@block_size * 2 - @block_offset), h: (@block_size * 2 - @block_offset), r: @r , g: @g , b: @b }~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids <<{x: (@x + x_offset), y: (@y), w: (@block_size * 2 - @block_offset), h: (@block_size * 2 - @block_offset), r: @r , g: @g , b: @b }
    -** Processing line: ~      #args.outputs.solids << @bold.append([255,0,0])~
    +
    +** Processing line: ~    # Defines story_line as the state.story_line variable.~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.solids << @bold.append([255,0,0])
    -** Processing line: ~      args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +    # Defines story_line as the state.story_line variable.
    +** Processing line: ~    def story_line~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    -** Processing line: ~~
    +    def story_line
    +** Processing line: ~      state.story_line~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     end~
    +      state.story_line
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     def update args~
    +** Processing line: ~    # Update every 60 frames (or every second)~
     - Inside source: true
     *** True Line Result
    -     def update args
    -** Processing line: ~       universalUpdate args, self~
    +    # Update every 60 frames (or every second)
    +** Processing line: ~    def should_tick?~
     - Inside source: true
     *** True Line Result
    -       universalUpdate args, self
    -** Processing line: ~     end~
    +    def should_tick?
    +** Processing line: ~      state.tick_count.mod_zero?(60)~
     - Inside source: true
     *** True Line Result
    -     end
    -** Processing line: ~  end~
    +      state.tick_count.mod_zero?(60)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class TShape~
    +** Processing line: ~    # Sets the value of the game state provider.~
     - Inside source: true
     *** True Line Result
    -  class TShape
    -** Processing line: ~      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +    # Sets the value of the game state provider.
    +** Processing line: ~    def initialize game_state_provider~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    -** Processing line: ~      def initialize(args, x, y, block_size, orientation, block_offset)~
    +    def initialize game_state_provider
    +** Processing line: ~      @game_state_provider = game_state_provider~
     - Inside source: true
     *** True Line Result
    -      def initialize(args, x, y, block_size, orientation, block_offset)
    -** Processing line: ~          @x = x * block_size~
    +      @game_state_provider = game_state_provider
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          @x = x * block_size
    -** Processing line: ~          @y = y * block_size~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          @y = y * block_size
    -** Processing line: ~          @block_size = block_size~
    +
    +** Processing line: ~    # Defines the game state.~
     - Inside source: true
     *** True Line Result
    -          @block_size = block_size
    -** Processing line: ~          @block_offset = block_offset~
    +    # Defines the game state.
    +** Processing line: ~    # Any variable prefixed with an @ symbol is an instance variable.~
     - Inside source: true
     *** True Line Result
    -          @block_offset = block_offset
    -** Processing line: ~          @orientation = orientation~
    +    # Any variable prefixed with an @ symbol is an instance variable.
    +** Processing line: ~    def state~
     - Inside source: true
     *** True Line Result
    -          @orientation = orientation
    -** Processing line: ~          @damageCount = []~
    +    def state
    +** Processing line: ~      @game_state_provider.state~
     - Inside source: true
     *** True Line Result
    -          @damageCount = []
    -** Processing line: ~          @home = "tshapes"~
    +      @game_state_provider.state
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          @home = "tshapes"
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          Kernel.srand()~
    -- Inside source: true
    -*** True Line Result
    -          Kernel.srand()
    -** Processing line: ~          @r = rand(255)~
    -- Inside source: true
    -*** True Line Result
    -          @r = rand(255)
    -** Processing line: ~          @g = rand(255)~
    -- Inside source: true
    -*** True Line Result
    -          @g = rand(255)
    -** Processing line: ~          @b = rand(255)~
    +** Processing line: ~    # Saves the state of the game in a text file called game_state.txt.~
     - Inside source: true
     *** True Line Result
    -          @b = rand(255)
    -** Processing line: ~~
    +    # Saves the state of the game in a text file called game_state.txt.
    +** Processing line: ~    def save~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +    def save
    +** Processing line: ~      $gtk.serialize_state('game_state.txt', state)~
     - Inside source: true
     *** True Line Result
    -          @count = rand(MAX_COUNT)+1
    -** Processing line: ~~
    +      $gtk.serialize_state('game_state.txt', state)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @shapePoints = getShapePoints(args)~
    -- Inside source: true
    -*** True Line Result
    -          @shapePoints = getShapePoints(args)
    -** Processing line: ~          minX={x:INFINITY, y:0}~
    -- Inside source: true
    -*** True Line Result
    -          minX={x:INFINITY, y:0}
    -** Processing line: ~          minY={x:0, y:INFINITY}~
    -- Inside source: true
    -*** True Line Result
    -          minY={x:0, y:INFINITY}
    -** Processing line: ~          maxX={x:-INFINITY, y:0}~
    +** Processing line: ~    # Loads the game state from the game_state.txt text file.~
     - Inside source: true
     *** True Line Result
    -          maxX={x:-INFINITY, y:0}
    -** Processing line: ~          maxY={x:0, y:-INFINITY}~
    +    # Loads the game state from the game_state.txt text file.
    +** Processing line: ~    # If the load is unsuccessful, the user is informed since the story line indicates the failure.~
     - Inside source: true
     *** True Line Result
    -          maxY={x:0, y:-INFINITY}
    -** Processing line: ~          for p in @shapePoints~
    +    # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    +** Processing line: ~    def load~
     - Inside source: true
     *** True Line Result
    -          for p in @shapePoints
    -** Processing line: ~            if p.x < minX.x~
    +    def load
    +** Processing line: ~      parsed_state = $gtk.deserialize_state('game_state.txt')~
     - Inside source: true
     *** True Line Result
    -            if p.x < minX.x
    -** Processing line: ~              minX = p~
    +      parsed_state = $gtk.deserialize_state('game_state.txt')
    +** Processing line: ~      if !parsed_state~
     - Inside source: true
     *** True Line Result
    -              minX = p
    -** Processing line: ~            end~
    +      if !parsed_state
    +** Processing line: ~        set_story_line "no game to load. press save first."~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.x > maxX.x~
    +        set_story_line "no game to load. press save first."
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -            if p.x > maxX.x
    -** Processing line: ~              maxX = p~
    +      else
    +** Processing line: ~        $gtk.args.state = parsed_state~
     - Inside source: true
     *** True Line Result
    -              maxX = p
    -** Processing line: ~            end~
    +        $gtk.args.state = parsed_state
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.y < minY.y~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            if p.y < minY.y
    -** Processing line: ~              minY = p~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              minY = p
    -** Processing line: ~            end~
    +
    +** Processing line: ~    # Resets the game.~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.y > maxY.y~
    +    # Resets the game.
    +** Processing line: ~    def reset~
     - Inside source: true
     *** True Line Result
    -            if p.y > maxY.y
    -** Processing line: ~              maxY = p~
    +    def reset
    +** Processing line: ~      $gtk.reset~
     - Inside source: true
     *** True Line Result
    -              maxY = p
    -** Processing line: ~            end~
    +      $gtk.reset
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~  class TextedBasedGamePresenter~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          hypotenuse=args.state.ball_hypotenuse~
    +  class TextedBasedGamePresenter
    +** Processing line: ~    attr_accessor :state, :outputs, :inputs~
     - Inside source: true
     *** True Line Result
    -          hypotenuse=args.state.ball_hypotenuse
    +    attr_accessor :state, :outputs, :inputs
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]~
    -- Inside source: true
    -*** True Line Result
    -          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]
    -** Processing line: ~      end~
    -- Inside source: true
    -*** True Line Result
    -      end
    -** Processing line: ~      def getShapePoints(args)~
    -- Inside source: true
    -*** True Line Result
    -      def getShapePoints(args)
    -** Processing line: ~        points=[]~
    +** Processing line: ~    # Creates empty collection called highlights.~
     - Inside source: true
     *** True Line Result
    -        points=[]
    -** Processing line: ~        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +    # Creates empty collection called highlights.
    +** Processing line: ~    # Calls methods necessary to run the game.~
     - Inside source: true
     *** True Line Result
    -        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    -** Processing line: ~~
    +    # Calls methods necessary to run the game.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        if @orientation == :right~
    +    def tick
    +** Processing line: ~      state.layout.highlights ||= []~
     - Inside source: true
     *** True Line Result
    -        if @orientation == :right
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +      state.layout.highlights ||= []
    +** Processing line: ~      game.tick if game.should_tick?~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]~
    +      game.tick if game.should_tick?
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]
    -** Processing line: ~            points = [~
    +      render
    +** Processing line: ~      process_input~
     - Inside source: true
     *** True Line Result
    -            points = [
    -** Processing line: ~              {x:@x + x_offset, y:@y},~
    +      process_input
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y},~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},~
    +
    +** Processing line: ~    # Outputs a label of the tick count (passage of time) and calls all render methods.~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},
    -** Processing line: ~              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},~
    +    # Outputs a label of the tick count (passage of time) and calls all render methods.
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},
    -** Processing line: ~              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},~
    +    def render
    +** Processing line: ~      outputs.labels << [10, 30, state.tick_count]~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},~
    +      outputs.labels << [10, 30, state.tick_count]
    +** Processing line: ~      render_alert~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},~
    +      render_alert
    +** Processing line: ~      render_room~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},
    -** Processing line: ~              {x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}~
    +      render_room
    +** Processing line: ~      render_highlights~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}
    -** Processing line: ~            ]~
    +      render_highlights
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @squareColliders = [~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            @squareColliders = [
    -** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +
    +** Processing line: ~    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    +** Processing line: ~    def render_alert~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[2].x,points[2].y-COLLISIONWIDTH,{x:1,y:-1}),~
    +    def render_alert
    +** Processing line: ~      return unless game.active_module == :alert~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[2].x,points[2].y-COLLISIONWIDTH,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[3].x-COLLISIONWIDTH,points[3].y,{x:1,y:-1}),~
    +      return unless game.active_module == :alert
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[3].x-COLLISIONWIDTH,points[3].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),~
    +
    +** Processing line: ~      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[5].x,points[5].y,{x:1,y:1}),~
    +      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    +** Processing line: ~      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[5].x,points[5].y,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:1,y:1}),~
    +      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~            ]~
    +
    +** Processing line: ~    def render_room~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @colliders = [~
    +    def render_room
    +** Processing line: ~      return unless game.active_module == :room~
     - Inside source: true
     *** True Line Result
    -            @colliders = [
    -** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +      return unless game.active_module == :room
    +** Processing line: ~      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[1], :neg),
    -** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[1],points[2], :neg),
    -** Processing line: ~              LinearCollider.new(points[2],points[3], :neg),~
    +
    +** Processing line: ~      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[2],points[3], :neg),
    -** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    +** Processing line: ~      # that positions it 60 pixels lower than the previous output.~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[3],points[4], :neg),
    -** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +      # that positions it 60 pixels lower than the previous output.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[4],points[5], :pos),
    -** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +
    +** Processing line: ~      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[5],points[6], :neg),
    -** Processing line: ~              LinearCollider.new(points[6],points[7], :pos),~
    +      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    +** Processing line: ~      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[6],points[7], :pos),
    -** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    +** Processing line: ~      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[7], :pos)
    -** Processing line: ~            ]~
    +      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    +** Processing line: ~      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~        elsif @orientation == :up~
    +      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    +** Processing line: ~      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :up
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    +** Processing line: ~      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]~
    +      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]
    -** Processing line: ~            points = [~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            points = [
    -** Processing line: ~              {x:@x + x_offset, y:@y},~
    +
    +** Processing line: ~    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y},~
    +    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    +** Processing line: ~    def render_highlights~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y},
    -** Processing line: ~              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y+(@block_size - @block_offset)},~
    +    def render_highlights
    +** Processing line: ~      state.layout.highlights.each do |h| # for each highlight in the collection~
     - Inside source: true
     *** True Line Result
    -              {x:(@x + x_offset)+(@block_size * 3 - @block_offset), y:@y+(@block_size - @block_offset)},
    -** Processing line: ~              {x:@x + x_offset + @block_size + @block_size, y:@y+(@block_size - @block_offset)},~
    +      state.layout.highlights.each do |h| # for each highlight in the collection
    +** Processing line: ~          h.lifetime -= 1 # decrease the value of its lifetime~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size + @block_size, y:@y+(@block_size - @block_offset)},
    -** Processing line: ~              {x:@x + x_offset + @block_size + @block_size, y:@y+@block_size*2},~
    +          h.lifetime -= 1 # decrease the value of its lifetime
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size + @block_size, y:@y+@block_size*2},
    -** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+@block_size*2},~
    +        end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size, y:@y+@block_size*2},
    -** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+(@block_size - @block_offset)},~
    +
    +** Processing line: ~        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size, y:@y+(@block_size - @block_offset)},
    -** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size - @block_offset)}~
    +        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    +** Processing line: ~          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y+(@block_size - @block_offset)}
    -** Processing line: ~            ]~
    +          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    +** Processing line: ~          # transparency changes; divide lifetime by max_lifetime, multiply result by 255~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @squareColliders = [~
    +          # transparency changes; divide lifetime by max_lifetime, multiply result by 255
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -            @squareColliders = [
    -** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +        end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +
    +** Processing line: ~        # reject highlights from collection that have no remaining lifetime~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +        # reject highlights from collection that have no remaining lifetime
    +** Processing line: ~        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[3].x,points[3].y,{x:1,y:1}),~
    +        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[3].x,points[3].y,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +
    +** Processing line: ~    # Checks whether or not a button was clicked.~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y,{x:-1,y:1}),~
    +    # Checks whether or not a button was clicked.
    +** Processing line: ~    # Returns a boolean value.~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +    # Returns a boolean value.
    +** Processing line: ~    def process_input~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[7].x,points[7].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~            ]~
    +    def process_input
    +** Processing line: ~      button = button_clicked? # calls button_clicked? method~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @colliders = [~
    +      button = button_clicked? # calls button_clicked? method
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            @colliders = [
    -** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[1], :neg),
    -** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +
    +** Processing line: ~    # Returns a boolean value.~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[1],points[2], :neg),
    -** Processing line: ~              LinearCollider.new(points[2],points[3], :pos),~
    +    # Returns a boolean value.
    +** Processing line: ~    # Finds the button that was clicked from the button list and determines what method to call.~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[2],points[3], :pos),
    -** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +    # Finds the button that was clicked from the button list and determines what method to call.
    +** Processing line: ~    # Adds a highlight to the highlights collection.~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[3],points[4], :neg),
    -** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +    # Adds a highlight to the highlights collection.
    +** Processing line: ~    def button_clicked?~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[4],points[5], :pos),
    -** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +    def button_clicked?
    +** Processing line: ~      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[5],points[6], :neg),
    -** Processing line: ~              LinearCollider.new(points[6],points[7], :pos),~
    +      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    +** Processing line: ~        button = @button_list.find do |k, v| # goes through button_list to find button clicked~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[6],points[7], :pos),
    -** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +        button = @button_list.find do |k, v| # goes through button_list to find button clicked
    +** Processing line: ~          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[7], :pos)
    -** Processing line: ~            ]~
    +          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~        elsif @orientation == :left~
    +        end
    +** Processing line: ~        return unless button # return unless a button was clicked~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :left
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +        return unless button # return unless a button was clicked
    +** Processing line: ~        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    +** Processing line: ~        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~            xh = @x + x_offset~
    +        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    +** Processing line: ~          border = button[1][:primitives].last # sets border definition using value of last key in button list hash~
     - Inside source: true
     *** True Line Result
    -            xh = @x + x_offset
    -** Processing line: ~            #points = [~
    +          border = button[1][:primitives].last # sets border definition using value of last key in button list hash
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            #points = [
    -** Processing line: ~              #{x:@x + x_offset, y:@y},~
    +
    +** Processing line: ~          # declares each highlight as a new entity, sets properties~
     - Inside source: true
     *** True Line Result
    -              #{x:@x + x_offset, y:@y},
    -** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y},~
    +          # declares each highlight as a new entity, sets properties
    +** Processing line: ~          state.layout.highlights << state.new_entity(:highlight) do |h|~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y},
    -** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},~
    +          state.layout.highlights << state.new_entity(:highlight) do |h|
    +** Processing line: ~              h.x = border.x~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size},
    -** Processing line: ~              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},~
    +              h.x = border.x
    +** Processing line: ~              h.y = border.y~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size},
    -** Processing line: ~              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},~
    +              h.y = border.y
    +** Processing line: ~              h.w = border.w~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+ @block_size * 2,y:@y + @block_size+@block_size},
    -** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},~
    +              h.w = border.w
    +** Processing line: ~              h.h = border.h~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+(@block_size - @block_offset),y:@y + @block_size+@block_size},
    -** Processing line: ~              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},~
    +              h.h = border.h
    +** Processing line: ~              h.max_lifetime = 10~
     - Inside source: true
     *** True Line Result
    -              #{x:(@x + x_offset)+(@block_size - @block_offset), y:@y+ @block_size * 3 - @block_offset},
    -** Processing line: ~              #{x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}~
    +              h.max_lifetime = 10
    +** Processing line: ~              h.lifetime = h.max_lifetime~
     - Inside source: true
     *** True Line Result
    -              #{x:@x + x_offset , y:@y+ @block_size * 3 - @block_offset}
    -** Processing line: ~            #]~
    +              h.lifetime = h.max_lifetime
    +** Processing line: ~              h.color = [120, 120, 180] # sets color to shade of purple~
     - Inside source: true
     *** True Line Result
    -            #]
    -** Processing line: ~            points = [~
    +              h.color = [120, 120, 180] # sets color to shade of purple
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -            points = [
    -** Processing line: ~              {x:@x + x_offset + @block_size, y:@y},~
    +            end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size, y:@y},
    -** Processing line: ~              {x:@x + x_offset + @block_size + (@block_size - @block_offset), y:@y},~
    +
    +** Processing line: ~            self.send method_to_call # invoke method identified by symbol~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size + (@block_size - @block_offset), y:@y},
    -** Processing line: ~              {x:@x + x_offset + @block_size + (@block_size - @block_offset),y:@y+@block_size*3- @block_offset},~
    +            self.send method_to_call # invoke method identified by symbol
    +** Processing line: ~          else # otherwise, if self doesn't respond to given method~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size + (@block_size - @block_offset),y:@y+@block_size*3- @block_offset},
    -** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+@block_size*3- @block_offset},~
    +          else # otherwise, if self doesn't respond to given method
    +** Processing line: ~            border = button[1][:primitives].last # sets border definition using value of last key in hash~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size, y:@y+@block_size*3- @block_offset},
    -** Processing line: ~              {x:@x + x_offset+@block_size, y:@y+@block_size*2- @block_offset},~
    +            border = button[1][:primitives].last # sets border definition using value of last key in hash
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+@block_size, y:@y+@block_size*2- @block_offset},
    -** Processing line: ~              {x:@x + x_offset, y:@y+@block_size*2- @block_offset},~
    +
    +** Processing line: ~            # declares each highlight as a new entity, sets properties~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y+@block_size*2- @block_offset},
    -** Processing line: ~              {x:@x + x_offset, y:@y+@block_size},~
    +            # declares each highlight as a new entity, sets properties
    +** Processing line: ~            state.layout.highlights << state.new_entity(:highlight) do |h|~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y+@block_size},
    -** Processing line: ~              {x:@x + x_offset+@block_size, y:@y+@block_size}~
    +            state.layout.highlights << state.new_entity(:highlight) do |h|
    +** Processing line: ~              h.x = border.x~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+@block_size, y:@y+@block_size}
    -** Processing line: ~            ]~
    +              h.x = border.x
    +** Processing line: ~              h.y = border.y~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @squareColliders = [~
    +              h.y = border.y
    +** Processing line: ~              h.w = border.w~
     - Inside source: true
     *** True Line Result
    -            @squareColliders = [
    -** Processing line: ~              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +              h.w = border.w
    +** Processing line: ~              h.h = border.h~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +              h.h = border.h
    +** Processing line: ~              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    +** Processing line: ~              h.lifetime = h.max_lifetime~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +              h.lifetime = h.max_lifetime
    +** Processing line: ~              h.color = [120, 80, 80] # sets color to dark color~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:-1,y:1}),~
    +              h.color = [120, 80, 80] # sets color to dark color
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +            end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[5].x,points[5].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[6].x,points[6].y,{x:-1,y:-1}),~
    +
    +** Processing line: ~            # instructions for users on how to add the missing method_to_call to the code~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[6].x,points[6].y,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[7].x-COLLISIONWIDTH,points[7].y-COLLISIONWIDTH,{x:-1,y:-1}),~
    +            # instructions for users on how to add the missing method_to_call to the code
    +** Processing line: ~            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[7].x-COLLISIONWIDTH,points[7].y-COLLISIONWIDTH,{x:-1,y:-1}),
    -** Processing line: ~            ]~
    +            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    +** Processing line: ~            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @colliders = [~
    +            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    +** Processing line: ~            puts ""~
     - Inside source: true
     *** True Line Result
    -            @colliders = [
    -** Processing line: ~              LinearCollider.new(points[0],points[1], :neg),~
    +            puts ""
    +** Processing line: ~            puts "```"~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[1], :neg),
    -** Processing line: ~              LinearCollider.new(points[1],points[2], :neg),~
    +            puts "```"
    +** Processing line: ~            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[1],points[2], :neg),
    -** Processing line: ~              LinearCollider.new(points[2],points[3], :pos),~
    +            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    +** Processing line: ~            puts ""~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[2],points[3], :pos),
    -** Processing line: ~              LinearCollider.new(points[3],points[4], :neg),~
    +            puts ""
    +** Processing line: ~            puts "  def #{method_to_call}"~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[3],points[4], :neg),
    -** Processing line: ~              LinearCollider.new(points[4],points[5], :pos),~
    +            puts "  def #{method_to_call}"
    +** Processing line: ~            puts "    puts 'Yay that worked!'"~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[4],points[5], :pos),
    -** Processing line: ~              LinearCollider.new(points[5],points[6], :neg),~
    +            puts "    puts 'Yay that worked!'"
    +** Processing line: ~            puts "  end"~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[5],points[6], :neg),
    -** Processing line: ~              LinearCollider.new(points[6],points[7], :neg),~
    +            puts "  end"
    +** Processing line: ~            puts ""~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[6],points[7], :neg),
    -** Processing line: ~              LinearCollider.new(points[0],points[7], :pos)~
    +            puts ""
    +** Processing line: ~            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[7], :pos)
    -** Processing line: ~            ]~
    +            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    +** Processing line: ~            puts "```"~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~        elsif @orientation == :down~
    +            puts "```"
    +** Processing line: ~            puts ""~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :down
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +            puts ""
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +        end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            points = [~
    +** Processing line: ~    # Returns the position of the mouse when it is clicked.~
     - Inside source: true
     *** True Line Result
    -            points = [
    -** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size*2)-@block_offset},~
    +    # Returns the position of the mouse when it is clicked.
    +** Processing line: ~    def click_pos~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y+(@block_size*2)-@block_offset},
    -** Processing line: ~              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size*2)-@block_offset},~
    +    def click_pos
    +** Processing line: ~      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size*2)-@block_offset},
    -** Processing line: ~              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size)},~
    +      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    +** Processing line: ~      return inputs.mouse.click.point # returns location of mouse click (coordinates)~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+ @block_size*3-@block_offset, y:@y+(@block_size)},
    -** Processing line: ~              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y+(@block_size)},~
    +      return inputs.mouse.click.point # returns location of mouse click (coordinates)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y+(@block_size)},
    -** Processing line: ~              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y},#~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+ @block_size*2-@block_offset, y:@y},#
    -** Processing line: ~              {x:@x + x_offset+ @block_size, y:@y},#~
    +
    +** Processing line: ~    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset+ @block_size, y:@y},#
    -** Processing line: ~              {x:@x + x_offset + @block_size, y:@y+(@block_size)},~
    +    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    +** Processing line: ~    def button id, x, y, text~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset + @block_size, y:@y+(@block_size)},
    -** Processing line: ~              {x:@x + x_offset, y:@y+(@block_size)}~
    +    def button id, x, y, text
    +** Processing line: ~      @button_list[id] ||= { # assigns values to hash keys~
     - Inside source: true
     *** True Line Result
    -              {x:@x + x_offset, y:@y+(@block_size)}
    -** Processing line: ~            ]~
    +      @button_list[id] ||= { # assigns values to hash keys
    +** Processing line: ~        id: id,~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @squareColliders = [~
    +        id: id,
    +** Processing line: ~        text: text,~
     - Inside source: true
     *** True Line Result
    -            @squareColliders = [
    -** Processing line: ~              SquareCollider.new(points[0].x,points[0].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +        text: text,
    +** Processing line: ~        primitives: [~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[0].x,points[0].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y-COLLISIONWIDTH,{x:1,y:1}),~
    +        primitives: [
    +** Processing line: ~          [x + 10, y + 30, text, 2, 0].label, # positions label inside border~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y,{x:1,y:-1}),~
    +          [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    +** Processing line: ~          [x, y, 300, 50].border,             # sets definition of border~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:1,y:-1}),~
    +          [x, y, 300, 50].border,             # sets definition of border
    +** Processing line: ~        ]~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:1,y:-1}),~
    +        ]
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[4].x-COLLISIONWIDTH,points[4].y,{x:1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[5].x,points[5].y,{x:-1,y:-1}),~
    +      }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[5].x,points[5].y,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:-1,y:-1}),~
    +
    +** Processing line: ~      @button_list[id][:primitives] # returns label and border for buttons~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[6].x-COLLISIONWIDTH,points[6].y-COLLISIONWIDTH,{x:-1,y:-1}),
    -** Processing line: ~              SquareCollider.new(points[7].x,points[7].y,{x:-1,y:-1}),~
    +      @button_list[id][:primitives] # returns label and border for buttons
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              SquareCollider.new(points[7].x,points[7].y,{x:-1,y:-1}),
    -** Processing line: ~            ]~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~            @colliders = [~
    +
    +** Processing line: ~    # Creates a progress bar (used for lighting the fire) and sets its values.~
     - Inside source: true
     *** True Line Result
    -            @colliders = [
    -** Processing line: ~              LinearCollider.new(points[0],points[1], :pos),~
    +    # Creates a progress bar (used for lighting the fire) and sets its values.
    +** Processing line: ~    def progress_bar id, x, y, text, percentage~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[1], :pos),
    -** Processing line: ~              LinearCollider.new(points[1],points[2], :pos),~
    +    def progress_bar id, x, y, text, percentage
    +** Processing line: ~      @button_list[id] = { # assigns values to hash keys~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[1],points[2], :pos),
    -** Processing line: ~              LinearCollider.new(points[2],points[3], :neg),~
    +      @button_list[id] = { # assigns values to hash keys
    +** Processing line: ~        id: id,~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[2],points[3], :neg),
    -** Processing line: ~              LinearCollider.new(points[3],points[4], :pos),~
    +        id: id,
    +** Processing line: ~        text: text,~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[3],points[4], :pos),
    -** Processing line: ~              LinearCollider.new(points[4],points[5], :neg),~
    +        text: text,
    +** Processing line: ~        primitives: [~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[4],points[5], :neg),
    -** Processing line: ~              LinearCollider.new(points[5],points[6], :pos),~
    +        primitives: [
    +** Processing line: ~          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[5],points[6], :pos),
    -** Processing line: ~              LinearCollider.new(points[6],points[7], :neg),~
    +          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    +** Processing line: ~          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[6],points[7], :neg),
    -** Processing line: ~              LinearCollider.new(points[0],points[7], :neg)~
    +          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    +** Processing line: ~          [x, y, 300, 50].border, # sets definition of border~
     - Inside source: true
     *** True Line Result
    -              LinearCollider.new(points[0],points[7], :neg)
    -** Processing line: ~            ]~
    +          [x, y, 300, 50].border, # sets definition of border
    +** Processing line: ~        ]~
     - Inside source: true
     *** True Line Result
    -            ]
    -** Processing line: ~        end~
    +        ]
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        return points~
    +      }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        return points
    -** Processing line: ~      end~
    +
    +** Processing line: ~      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    +** Processing line: ~      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def draw(args)~
    +      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    +** Processing line: ~      @button_list[id][:primitives][0][2] = 300 * percentage~
     - Inside source: true
     *** True Line Result
    -      def draw(args)
    -** Processing line: ~          #Offset the coordinates to the edge of the game area~
    +      @button_list[id][:primitives][0][2] = 300 * percentage
    +** Processing line: ~      @button_list[id][:primitives]~
     - Inside source: true
     *** True Line Result
    -          #Offset the coordinates to the edge of the game area
    -** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +      @button_list[id][:primitives]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          if @orientation == :right~
    +** Processing line: ~    # Defines the game.~
     - Inside source: true
     *** True Line Result
    -          if @orientation == :right
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +    # Defines the game.
    +** Processing line: ~    def game~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: @y, w: @block_size - @block_offset, h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}~
    +    def game
    +** Processing line: ~      @game~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset), y: @y, w: @block_size - @block_offset, h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]~
    +      @game
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2, @block_size, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2), h: (@block_size), r: @r , g: @g, b: @b }~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2), h: (@block_size), r: @r , g: @g, b: @b }
    -** Processing line: ~          elsif @orientation == :up~
    +
    +** Processing line: ~    # Initalizes the game and creates an empty list of buttons.~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :up
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    # Initalizes the game and creates an empty list of buttons.
    +** Processing line: ~    def initialize~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +    def initialize
    +** Processing line: ~      @game = TextedBasedGame.new self~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset), y: (@y), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]~
    +      @game = TextedBasedGame.new self
    +** Processing line: ~      @button_list ||= {}~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size, @block_size * 2, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size), h: (@block_size * 2), r: @r , g: @g, b: @b}~
    +      @button_list ||= {}
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size), h: (@block_size * 2), r: @r , g: @g, b: @b}
    -** Processing line: ~          elsif @orientation == :left~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :left
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +
    +** Processing line: ~    # Clears the storyline and takes the user to the room.~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}~
    +    # Clears the storyline and takes the user to the room.
    +** Processing line: ~    def alert_dismiss_clicked~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: (@block_size * 3 - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    def alert_dismiss_clicked
    +** Processing line: ~      game.clear_storyline~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 2 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +      game.clear_storyline
    +** Processing line: ~      game.go_to_room~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 2 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~          elsif @orientation == :down~
    +      game.go_to_room
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :down
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset, @y + @block_size, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}~
    +
    +** Processing line: ~    # Lights the fire when the user clicks the "light fire" option.~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset), y: (@y + @block_size), w: (@block_size * 3 - @block_offset), h: (@block_size - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]~
    +    # Lights the fire when the user clicks the "light fire" option.
    +** Processing line: ~    def light_fire_clicked~
     - Inside source: true
     *** True Line Result
    -              #args.outputs.solids << [@x + x_offset + @block_size, @y, @block_size - @block_offset, @block_size * 2 - @block_offset, @r, @g, @b]
    -** Processing line: ~              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: ( @block_size * 2 - @block_offset), r: @r , g: @g, b: @b}~
    +    def light_fire_clicked
    +** Processing line: ~      game.light_fire~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << {x: (@x + x_offset + @block_size), y: (@y), w: (@block_size - @block_offset), h: ( @block_size * 2 - @block_offset), r: @r , g: @g, b: @b}
    -** Processing line: ~          end~
    +      game.light_fire
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          #psize = 5.0~
    -- Inside source: true
    -*** True Line Result
    -          #psize = 5.0
    -** Processing line: ~          #for p in @shapePoints~
    +** Processing line: ~    # Saves the game when the user clicks the "save" option.~
     - Inside source: true
     *** True Line Result
    -          #for p in @shapePoints
    -** Processing line: ~            #args.outputs.solids << [p.x-psize/2, p.y-psize/2, psize, psize, 0, 0, 0]~
    +    # Saves the game when the user clicks the "save" option.
    +** Processing line: ~    def save_game_clicked~
     - Inside source: true
     *** True Line Result
    -            #args.outputs.solids << [p.x-psize/2, p.y-psize/2, psize, psize, 0, 0, 0]
    -** Processing line: ~          #end~
    +    def save_game_clicked
    +** Processing line: ~      game.save~
     - Inside source: true
     *** True Line Result
    -          #end
    -** Processing line: ~          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +      game.save
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      end~
    +** Processing line: ~    # Resets the game when the user clicks the "reset" option.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    # Resets the game when the user clicks the "reset" option.
    +** Processing line: ~    def reset_game_clicked~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def updateOne_old args~
    +    def reset_game_clicked
    +** Processing line: ~      game.reset~
     - Inside source: true
     *** True Line Result
    -      def updateOne_old args
    -** Processing line: ~        didHit = false~
    +      game.reset
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        didHit = false
    -** Processing line: ~        hitter = nil~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        hitter = nil
    -** Processing line: ~        toCollide = nil~
    +
    +** Processing line: ~    # Loads the game when the user clicks the "load" option.~
     - Inside source: true
     *** True Line Result
    -        toCollide = nil
    -** Processing line: ~        for b in args.state.balls~
    +    # Loads the game when the user clicks the "load" option.
    +** Processing line: ~    def load_game_clicked~
     - Inside source: true
     *** True Line Result
    -        for b in args.state.balls
    -** Processing line: ~          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)~
    +    def load_game_clicked
    +** Processing line: ~      game.load~
     - Inside source: true
     *** True Line Result
    -          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    -** Processing line: ~            didSquare = false~
    +      game.load
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            didSquare = false
    -** Processing line: ~            for s in @squareColliders~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -            for s in @squareColliders
    -** Processing line: ~              if (s.collision?(args, b))~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              if (s.collision?(args, b))
    -** Processing line: ~                didSquare = true~
    +
    +** Processing line: ~  $text_based_rpg = TextedBasedGamePresenter.new~
     - Inside source: true
     *** True Line Result
    -                didSquare = true
    -** Processing line: ~                didHit = true~
    +  $text_based_rpg = TextedBasedGamePresenter.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                didHit = true
    -** Processing line: ~                #s.collide(args, b)~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -                #s.collide(args, b)
    -** Processing line: ~                toCollide = s~
    +  def tick args
    +** Processing line: ~    $text_based_rpg.state = args.state~
     - Inside source: true
     *** True Line Result
    -                toCollide = s
    -** Processing line: ~                hitter = b~
    +    $text_based_rpg.state = args.state
    +** Processing line: ~    $text_based_rpg.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -                hitter = b
    -** Processing line: ~                break~
    +    $text_based_rpg.outputs = args.outputs
    +** Processing line: ~    $text_based_rpg.inputs = args.inputs~
     - Inside source: true
     *** True Line Result
    -                break
    -** Processing line: ~              end~
    +    $text_based_rpg.inputs = args.inputs
    +** Processing line: ~    $text_based_rpg.tick~
     - Inside source: true
     *** True Line Result
    -              end
    -** Processing line: ~            end~
    +    $text_based_rpg.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if (didSquare == false)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            if (didSquare == false)
    -** Processing line: ~              for c in @colliders~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -              for c in @colliders
    -** Processing line: ~                #puts args.state.ball.velocity~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -                #puts args.state.ball.velocity
    -** Processing line: ~                if c.collision?(args, b.getPoints(args),b)~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Audio - Audio Mixer - main.rb~
    +- Header detected.
     *** True Line Result
    -                if c.collision?(args, b.getPoints(args),b)
    -** Processing line: ~                  #c.collide args, b~
    -- Inside source: true
    +
     *** True Line Result
    -                  #c.collide args, b
    -** Processing line: ~                  toCollide = c~
    -- Inside source: true
    +*** Advanced Audio - Audio Mixer - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -                  toCollide = c
    -** Processing line: ~                  didHit = true~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/07_advanced_audio/01_audio_mixer/app/main.rb~
     - Inside source: true
     *** True Line Result
    -                  didHit = true
    -** Processing line: ~                  hitter = b~
    +  # ./samples/07_advanced_audio/01_audio_mixer/app/main.rb
    +** Processing line: ~  # these are the properties that you can sent on args.audio~
     - Inside source: true
     *** True Line Result
    -                  hitter = b
    -** Processing line: ~                  break~
    +  # these are the properties that you can sent on args.audio
    +** Processing line: ~  def spawn_new_sound args, name, path~
     - Inside source: true
     *** True Line Result
    -                  break
    -** Processing line: ~                end~
    +  def spawn_new_sound args, name, path
    +** Processing line: ~    # Spawn randomly in an area that won't be covered by UI.~
     - Inside source: true
     *** True Line Result
    -                end
    -** Processing line: ~              end~
    +    # Spawn randomly in an area that won't be covered by UI.
    +** Processing line: ~    screenx = (rand * 600.0) + 200.0~
     - Inside source: true
     *** True Line Result
    -              end
    -** Processing line: ~            end~
    +    screenx = (rand * 600.0) + 200.0
    +** Processing line: ~    screeny = (rand * 400.0) + 100.0~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +    screeny = (rand * 400.0) + 100.0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          if didHit~
    +
    +** Processing line: ~    id = new_sound_id! args~
     - Inside source: true
     *** True Line Result
    -          if didHit
    -** Processing line: ~            break~
    +    id = new_sound_id! args
    +** Processing line: ~    # you can hang anything on the audio hashes you want, so we store the~
     - Inside source: true
     *** True Line Result
    -            break
    -** Processing line: ~          end~
    +    # you can hang anything on the audio hashes you want, so we store the
    +** Processing line: ~    #  actual screen position in here for convenience.~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +    #  actual screen position in here for convenience.
    +** Processing line: ~    args.audio[id] = {~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        if (didHit)~
    +    args.audio[id] = {
    +** Processing line: ~      name: name,~
     - Inside source: true
     *** True Line Result
    -        if (didHit)
    -** Processing line: ~          @count=0~
    +      name: name,
    +** Processing line: ~      input: path,~
     - Inside source: true
     *** True Line Result
    -          @count=0
    -** Processing line: ~          hitter.makeLeader args~
    +      input: path,
    +** Processing line: ~      screenx: screenx,~
     - Inside source: true
     *** True Line Result
    -          hitter.makeLeader args
    -** Processing line: ~          #toCollide.collide(args, hitter)~
    +      screenx: screenx,
    +** Processing line: ~      screeny: screeny,~
     - Inside source: true
     *** True Line Result
    -          #toCollide.collide(args, hitter)
    -** Processing line: ~          args.state.tshapes.delete(self)~
    +      screeny: screeny,
    +** Processing line: ~      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range~
     - Inside source: true
     *** True Line Result
    -          args.state.tshapes.delete(self)
    -** Processing line: ~          #puts "HIT!" + hitter.number~
    +      x: ((screenx / 1279.0) * 2.0) - 1.0,  # scale to -1.0 - 1.0 range
    +** Processing line: ~      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range~
     - Inside source: true
     *** True Line Result
    -          #puts "HIT!" + hitter.number
    -** Processing line: ~        end~
    +      y: ((screeny / 719.0) * 2.0) - 1.0,   # scale to -1.0 - 1.0 range
    +** Processing line: ~      z: 0.0,~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      z: 0.0,
    +** Processing line: ~      gain: 1.0,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      gain: 1.0,
    +** Processing line: ~      pitch: 1.0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def update_old args~
    +      pitch: 1.0,
    +** Processing line: ~      looping: true,~
     - Inside source: true
     *** True Line Result
    -      def update_old args
    -** Processing line: ~        if (@count == 1)~
    +      looping: true,
    +** Processing line: ~      paused: false~
     - Inside source: true
     *** True Line Result
    -        if (@count == 1)
    -** Processing line: ~          updateOne args~
    +      paused: false
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -          updateOne args
    -** Processing line: ~          return~
    +    }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          return
    -** Processing line: ~        end~
    +
    +** Processing line: ~    args.state.selected = id~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        didHit = false~
    +    args.state.selected = id
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        didHit = false
    -** Processing line: ~        hitter = nil~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        hitter = nil
    -** Processing line: ~        for b in args.state.ballParents~
    +
    +** Processing line: ~  # these are values you can change on the ~args.audio~ data structure~
     - Inside source: true
     *** True Line Result
    -        for b in args.state.ballParents
    -** Processing line: ~          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)~
    +  # these are values you can change on the ~args.audio~ data structure
    +** Processing line: ~  def input_panel args~
     - Inside source: true
     *** True Line Result
    -          if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    -** Processing line: ~            didSquare = false~
    +  def input_panel args
    +** Processing line: ~    return unless args.state.panel~
     - Inside source: true
     *** True Line Result
    -            didSquare = false
    -** Processing line: ~            for s in @squareColliders~
    +    return unless args.state.panel
    +** Processing line: ~    return if args.state.dragging~
     - Inside source: true
     *** True Line Result
    -            for s in @squareColliders
    -** Processing line: ~              if (s.collision?(args, b))~
    +    return if args.state.dragging
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              if (s.collision?(args, b))
    -** Processing line: ~                didSquare = true~
    +
    +** Processing line: ~    audio_entry = args.audio[args.state.selected]~
     - Inside source: true
     *** True Line Result
    -                didSquare = true
    -** Processing line: ~                didHit=true~
    +    audio_entry = args.audio[args.state.selected]
    +** Processing line: ~    results = args.state.panel~
     - Inside source: true
     *** True Line Result
    -                didHit=true
    -** Processing line: ~                s.collide(args, b)~
    +    results = args.state.panel
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                s.collide(args, b)
    -** Processing line: ~                hitter = b~
    +
    +** Processing line: ~    if args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.pitch_slider_rect.rect)~
     - Inside source: true
     *** True Line Result
    -                hitter = b
    -** Processing line: ~              end~
    +    if args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.pitch_slider_rect.rect)
    +** Processing line: ~      audio_entry.pitch = 2.0 * ((args.inputs.mouse.x - results.pitch_slider_rect.x).to_f / (results.pitch_slider_rect.w - 1.0))~
     - Inside source: true
     *** True Line Result
    -              end
    -** Processing line: ~            end~
    +      audio_entry.pitch = 2.0 * ((args.inputs.mouse.x - results.pitch_slider_rect.x).to_f / (results.pitch_slider_rect.w - 1.0))
    +** Processing line: ~    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.playtime_slider_rect.rect)~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if (didSquare == false)~
    +    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.playtime_slider_rect.rect)
    +** Processing line: ~      audio_entry.playtime = audio_entry.length_ * ((args.inputs.mouse.x - results.playtime_slider_rect.x).to_f / (results.playtime_slider_rect.w - 1.0))~
     - Inside source: true
     *** True Line Result
    -            if (didSquare == false)
    -** Processing line: ~              for c in @colliders~
    +      audio_entry.playtime = audio_entry.length_ * ((args.inputs.mouse.x - results.playtime_slider_rect.x).to_f / (results.playtime_slider_rect.w - 1.0))
    +** Processing line: ~    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.gain_slider_rect.rect)~
     - Inside source: true
     *** True Line Result
    -              for c in @colliders
    -** Processing line: ~                #puts args.state.ball.velocity~
    +    elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.gain_slider_rect.rect)
    +** Processing line: ~      audio_entry.gain = (args.inputs.mouse.x - results.gain_slider_rect.x).to_f / (results.gain_slider_rect.w - 1.0)~
     - Inside source: true
     *** True Line Result
    -                #puts args.state.ball.velocity
    -** Processing line: ~                if c.collision?(args, b.getPoints(args), b)~
    +      audio_entry.gain = (args.inputs.mouse.x - results.gain_slider_rect.x).to_f / (results.gain_slider_rect.w - 1.0)
    +** Processing line: ~    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.looping_checkbox_rect.rect)~
     - Inside source: true
     *** True Line Result
    -                if c.collision?(args, b.getPoints(args), b)
    -** Processing line: ~                  c.collide args, b~
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.looping_checkbox_rect.rect)
    +** Processing line: ~      audio_entry.looping = !audio_entry.looping~
     - Inside source: true
     *** True Line Result
    -                  c.collide args, b
    -** Processing line: ~                  didHit=true~
    +      audio_entry.looping = !audio_entry.looping
    +** Processing line: ~    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.paused_checkbox_rect.rect)~
     - Inside source: true
     *** True Line Result
    -                  didHit=true
    -** Processing line: ~                  hitter = b~
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.paused_checkbox_rect.rect)
    +** Processing line: ~      audio_entry.paused = !audio_entry.paused~
     - Inside source: true
     *** True Line Result
    -                  hitter = b
    -** Processing line: ~                end~
    +      audio_entry.paused = !audio_entry.paused
    +** Processing line: ~    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.delete_button_rect.rect)~
     - Inside source: true
     *** True Line Result
    -                end
    -** Processing line: ~              end~
    +    elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.delete_button_rect.rect)
    +** Processing line: ~      args.audio.delete args.state.selected~
     - Inside source: true
     *** True Line Result
    -              end
    -** Processing line: ~            end~
    +      args.audio.delete args.state.selected
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        if (didHit)~
    +
    +** Processing line: ~  def render_sources args~
     - Inside source: true
     *** True Line Result
    -        if (didHit)
    -** Processing line: ~          @count=@count-1~
    +  def render_sources args
    +** Processing line: ~    args.outputs.primitives << args.audio.keys.map do |k|~
     - Inside source: true
     *** True Line Result
    -          @count=@count-1
    -** Processing line: ~          @damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])~
    +    args.outputs.primitives << args.audio.keys.map do |k|
    +** Processing line: ~      s = args.audio[k]~
     - Inside source: true
     *** True Line Result
    -          @damageCount.append([(hitter.leastChain+1 - hitter.number)-1, args.state.tick_count])
    +      s = args.audio[k]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          if (@count == 0)~
    -- Inside source: true
    -*** True Line Result
    -          if (@count == 0)
    -** Processing line: ~            args.state.tshapes.delete(self)~
    +** Processing line: ~      isselected = (k == args.state.selected)~
     - Inside source: true
     *** True Line Result
    -            args.state.tshapes.delete(self)
    -** Processing line: ~            return~
    +      isselected = (k == args.state.selected)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            return
    -** Processing line: ~          end~
    +
    +** Processing line: ~      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +      color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        i=0~
    +      [
    +** Processing line: ~        [s.screenx, s.screeny, args.state.boxsize, args.state.boxsize, *color].solid,~
     - Inside source: true
     *** True Line Result
    -        i=0
    +        [s.screenx, s.screeny, args.state.boxsize, args.state.boxsize, *color].solid,
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        while i < @damageCount.length~
    -- Inside source: true
    -*** True Line Result
    -        while i < @damageCount.length
    -** Processing line: ~          if @damageCount[i][0] <= 0~
    -- Inside source: true
    -*** True Line Result
    -          if @damageCount[i][0] <= 0
    -** Processing line: ~            @damageCount.delete_at(i)~
    -- Inside source: true
    -*** True Line Result
    -            @damageCount.delete_at(i)
    -** Processing line: ~            i-=1~
    +** Processing line: ~        {~
     - Inside source: true
     *** True Line Result
    -            i-=1
    -** Processing line: ~          elsif @damageCount[i][1].elapsed_time > BALL_DISTANCE~
    +        {
    +** Processing line: ~          x: s.screenx + args.state.boxsize.half,~
     - Inside source: true
     *** True Line Result
    -          elsif @damageCount[i][1].elapsed_time > BALL_DISTANCE
    -** Processing line: ~            @count-=1~
    +          x: s.screenx + args.state.boxsize.half,
    +** Processing line: ~          y: s.screeny,~
     - Inside source: true
     *** True Line Result
    -            @count-=1
    -** Processing line: ~            @damageCount[i][0]-=1~
    +          y: s.screeny,
    +** Processing line: ~          text: s.name,~
     - Inside source: true
     *** True Line Result
    -            @damageCount[i][0]-=1
    -** Processing line: ~          end~
    +          text: s.name,
    +** Processing line: ~          r: 255,~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          if (@count == 0)~
    +          r: 255,
    +** Processing line: ~          g: 255,~
     - Inside source: true
     *** True Line Result
    -          if (@count == 0)
    -** Processing line: ~            args.state.tshapes.delete(self)~
    +          g: 255,
    +** Processing line: ~          b: 255,~
     - Inside source: true
     *** True Line Result
    -            args.state.tshapes.delete(self)
    -** Processing line: ~            return~
    +          b: 255,
    +** Processing line: ~          alignment_enum: 1~
     - Inside source: true
     *** True Line Result
    -            return
    -** Processing line: ~          end~
    +          alignment_enum: 1
    +** Processing line: ~        }.label!~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          i+=1~
    +        }.label!
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -          i+=1
    -** Processing line: ~        end~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end #end update~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end #end update
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def update args~
    +** Processing line: ~  def playtime_str t~
     - Inside source: true
     *** True Line Result
    -      def update args
    -** Processing line: ~        universalUpdate args, self~
    +  def playtime_str t
    +** Processing line: ~    minutes = (t / 60.0).floor~
     - Inside source: true
     *** True Line Result
    -        universalUpdate args, self
    -** Processing line: ~      end~
    +    minutes = (t / 60.0).floor
    +** Processing line: ~    seconds = t - (minutes * 60.0).to_f~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    seconds = t - (minutes * 60.0).to_f
    +** Processing line: ~    return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]~
     - Inside source: true
     *** True Line Result
    -
    +    return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -35092,798 +43255,794 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class Line~
    +** Processing line: ~  def label_with_drop_shadow x, y, text~
     - Inside source: true
     *** True Line Result
    -  class Line
    -** Processing line: ~      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount~
    +  def label_with_drop_shadow x, y, text
    +** Processing line: ~    [~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :count, :x, :y, :home, :bold, :squareColliders, :colliders, :damageCount
    -** Processing line: ~      def initialize(args, x, y, block_size, orientation, block_offset)~
    +    [
    +** Processing line: ~      { x: x + 1, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,~
     - Inside source: true
     *** True Line Result
    -      def initialize(args, x, y, block_size, orientation, block_offset)
    -** Processing line: ~          @x = x * block_size~
    +      { x: x + 1, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +** Processing line: ~      { x: x + 2, y: y + 0, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,~
     - Inside source: true
     *** True Line Result
    -          @x = x * block_size
    -** Processing line: ~          @y = y * block_size~
    +      { x: x + 2, y: y + 0, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r:   0, g:   0, b:   0 }.label!,
    +** Processing line: ~      { x: x + 0, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 200, g: 200, b: 200 }.label!~
     - Inside source: true
     *** True Line Result
    -          @y = y * block_size
    -** Processing line: ~          @block_size = block_size~
    +      { x: x + 0, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 200, g: 200, b: 200 }.label!
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -          @block_size = block_size
    -** Processing line: ~          @block_offset = block_offset~
    +    ]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          @block_offset = block_offset
    -** Processing line: ~          @orientation = orientation~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          @orientation = orientation
    -** Processing line: ~          @damageCount = []~
    +
    +** Processing line: ~  def check_box opts = {}~
     - Inside source: true
     *** True Line Result
    -          @damageCount = []
    -** Processing line: ~          @home = "lines"~
    +  def check_box opts = {}
    +** Processing line: ~    checkbox_template = opts.args.layout.rect(w: 0.5, h: 0.5, col: 2)~
     - Inside source: true
     *** True Line Result
    -          @home = "lines"
    -** Processing line: ~~
    +    checkbox_template = opts.args.layout.rect(w: 0.5, h: 0.5, col: 2)
    +** Processing line: ~    final_rect = checkbox_template.center_inside_rect_y(opts.args.layout.rect(row: opts.row, col: opts.col))~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          Kernel.srand()~
    +    final_rect = checkbox_template.center_inside_rect_y(opts.args.layout.rect(row: opts.row, col: opts.col))
    +** Processing line: ~    color = { r:   0, g:   0, b:   0 }~
     - Inside source: true
     *** True Line Result
    -          Kernel.srand()
    -** Processing line: ~          @r = rand(255)~
    +    color = { r:   0, g:   0, b:   0 }
    +** Processing line: ~    color = { r: 255, g: 255, b: 255 } if opts.checked~
     - Inside source: true
     *** True Line Result
    -          @r = rand(255)
    -** Processing line: ~          @g = rand(255)~
    +    color = { r: 255, g: 255, b: 255 } if opts.checked
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          @g = rand(255)
    -** Processing line: ~          @b = rand(255)~
    +
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -          @b = rand(255)
    -** Processing line: ~~
    +    {
    +** Processing line: ~      rect: final_rect,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @count = rand(MAX_COUNT)+1~
    +      rect: final_rect,
    +** Processing line: ~      primitives: [~
     - Inside source: true
     *** True Line Result
    -          @count = rand(MAX_COUNT)+1
    -** Processing line: ~~
    +      primitives: [
    +** Processing line: ~        (final_rect.to_solid color)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          @shapePoints = getShapePoints(args)~
    +        (final_rect.to_solid color)
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -          @shapePoints = getShapePoints(args)
    -** Processing line: ~          minX={x:INFINITY, y:0}~
    +      ]
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -          minX={x:INFINITY, y:0}
    -** Processing line: ~          minY={x:0, y:INFINITY}~
    +    }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          minY={x:0, y:INFINITY}
    -** Processing line: ~          maxX={x:-INFINITY, y:0}~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          maxX={x:-INFINITY, y:0}
    -** Processing line: ~          maxY={x:0, y:-INFINITY}~
    +
    +** Processing line: ~  def progress_bar opts = {}~
     - Inside source: true
     *** True Line Result
    -          maxY={x:0, y:-INFINITY}
    -** Processing line: ~          for p in @shapePoints~
    +  def progress_bar opts = {}
    +** Processing line: ~    outer_rect  = opts.args.layout.rect(row: opts.row, col: opts.col, w: 5, h: 1)~
     - Inside source: true
     *** True Line Result
    -          for p in @shapePoints
    -** Processing line: ~            if p.x < minX.x~
    +    outer_rect  = opts.args.layout.rect(row: opts.row, col: opts.col, w: 5, h: 1)
    +** Processing line: ~    color = opts.percentage * 255~
     - Inside source: true
     *** True Line Result
    -            if p.x < minX.x
    -** Processing line: ~              minX = p~
    +    color = opts.percentage * 255
    +** Processing line: ~    baseline_progress_bar = opts.args~
     - Inside source: true
     *** True Line Result
    -              minX = p
    -** Processing line: ~            end~
    +    baseline_progress_bar = opts.args
    +** Processing line: ~                                .layout~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.x > maxX.x~
    +                                .layout
    +** Processing line: ~                                .rect(w: 5, h: 0.5)~
     - Inside source: true
     *** True Line Result
    -            if p.x > maxX.x
    -** Processing line: ~              maxX = p~
    +                                .rect(w: 5, h: 0.5)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              maxX = p
    -** Processing line: ~            end~
    +
    +** Processing line: ~    final_rect = baseline_progress_bar.center_inside_rect(outer_rect)~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.y < minY.y~
    +    final_rect = baseline_progress_bar.center_inside_rect(outer_rect)
    +** Processing line: ~    center = final_rect.rect_center_point~
     - Inside source: true
     *** True Line Result
    -            if p.y < minY.y
    -** Processing line: ~              minY = p~
    +    center = final_rect.rect_center_point
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              minY = p
    -** Processing line: ~            end~
    +
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~            if p.y > maxY.y~
    +    {
    +** Processing line: ~      rect: final_rect,~
     - Inside source: true
     *** True Line Result
    -            if p.y > maxY.y
    -** Processing line: ~              maxY = p~
    +      rect: final_rect,
    +** Processing line: ~      primitives: [~
     - Inside source: true
     *** True Line Result
    -              maxY = p
    -** Processing line: ~            end~
    +      primitives: [
    +** Processing line: ~        final_rect.merge(r: color, g: color, b: color, a: 128).solid!,~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +        final_rect.merge(r: color, g: color, b: color, a: 128).solid!,
    +** Processing line: ~        label_with_drop_shadow(center.x, center.y, opts.text)~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~~
    +        label_with_drop_shadow(center.x, center.y, opts.text)
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +      ]
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          hypotenuse=args.state.ball_hypotenuse~
    +    }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          hypotenuse=args.state.ball_hypotenuse
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]~
    +** Processing line: ~  def panel_primitives args, audio_entry~
     - Inside source: true
     *** True Line Result
    -          @bold = [(minX.x-hypotenuse/2)-1, (minY.y-hypotenuse/2)-1, -((minX.x-hypotenuse/2)-1)+(maxX.x + hypotenuse + 2), -((minY.y-hypotenuse/2)-1)+(maxY.y + hypotenuse + 2)]
    -** Processing line: ~      end~
    +  def panel_primitives args, audio_entry
    +** Processing line: ~    results = { primitives: [] }~
     - Inside source: true
     *** True Line Result
    -      end
    +    results = { primitives: [] }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def getShapePoints(args)~
    -- Inside source: true
    -*** True Line Result
    -      def getShapePoints(args)
    -** Processing line: ~        points=[]~
    -- Inside source: true
    -*** True Line Result
    -        points=[]
    -** Processing line: ~        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)~
    +** Processing line: ~    return results unless audio_entry~
     - Inside source: true
     *** True Line Result
    -        x_offset = (args.state.board_width + args.grid.w / 8) + (@block_offset / 2)
    +    return results unless audio_entry
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        if @orientation == :right~
    +** Processing line: ~    # this uses DRGTK's layout apis to layout the controls~
     - Inside source: true
     *** True Line Result
    -        if @orientation == :right
    -** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    # this uses DRGTK's layout apis to layout the controls
    +** Processing line: ~    # imagine the screen is split into equal cells (24 cells across, 12 cells up and down)~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~          xa =@x + x_offset~
    +    # imagine the screen is split into equal cells (24 cells across, 12 cells up and down)
    +** Processing line: ~    # args.layout.rect returns a hash which we merge values with to create primitives~
     - Inside source: true
     *** True Line Result
    -          xa =@x + x_offset
    -** Processing line: ~          ya =@y~
    +    # args.layout.rect returns a hash which we merge values with to create primitives
    +** Processing line: ~    # using args.layout.rect removes the need for pixel pushing~
     - Inside source: true
     *** True Line Result
    -          ya =@y
    -** Processing line: ~          wa =@block_size * 3 - @block_offset~
    +    # using args.layout.rect removes the need for pixel pushing
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          wa =@block_size * 3 - @block_offset
    -** Processing line: ~          ha =(@block_size - @block_offset)~
    +
    +** Processing line: ~    # args.outputs.debug << args.layout.debug_primitives(r: 255, g: 255, b: 255)~
     - Inside source: true
     *** True Line Result
    -          ha =(@block_size - @block_offset)
    -** Processing line: ~        elsif @orientation == :up~
    +    # args.outputs.debug << args.layout.debug_primitives(r: 255, g: 255, b: 255)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :up
    -** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +
    +** Processing line: ~    white_color = { r: 255, g: 255, b: 255 }~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~          xa =@x + x_offset~
    +    white_color = { r: 255, g: 255, b: 255 }
    +** Processing line: ~    label_style = white_color.merge(vertical_alignment_enum: 1)~
     - Inside source: true
     *** True Line Result
    -          xa =@x + x_offset
    -** Processing line: ~          ya =@y~
    +    label_style = white_color.merge(vertical_alignment_enum: 1)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          ya =@y
    -** Processing line: ~          wa =@block_size - @block_offset~
    +
    +** Processing line: ~    # panel background~
     - Inside source: true
     *** True Line Result
    -          wa =@block_size - @block_offset
    -** Processing line: ~          ha =@block_size * 3 - @block_offset~
    +    # panel background
    +** Processing line: ~    results.primitives << args.layout.rect(row: 0, col: 0, w: 7, h: 6, include_col_gutter: true, include_row_gutter: true)~
     - Inside source: true
     *** True Line Result
    -          ha =@block_size * 3 - @block_offset
    -** Processing line: ~~
    +    results.primitives << args.layout.rect(row: 0, col: 0, w: 7, h: 6, include_col_gutter: true, include_row_gutter: true)
    +** Processing line: ~                                     .border!(r: 255, g: 255, b: 255)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        elsif @orientation == :left~
    +                                     .border!(r: 255, g: 255, b: 255)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :left
    -** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +
    +** Processing line: ~    # title~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~          xa =@x + x_offset~
    +    # title
    +** Processing line: ~    results.primitives << args.layout.point(row: 0, col: 3.5, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -          xa =@x + x_offset
    -** Processing line: ~          ya =@y~
    +    results.primitives << args.layout.point(row: 0, col: 3.5, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -          ya =@y
    -** Processing line: ~          wa =@block_size * 3 - @block_offset~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text:           "Source #{args.state.selected} (#{args.audio[args.state.selected].name})",~
     - Inside source: true
     *** True Line Result
    -          wa =@block_size * 3 - @block_offset
    -** Processing line: ~          ha =@block_size - @block_offset~
    +                                     .merge(text:           "Source #{args.state.selected} (#{args.audio[args.state.selected].name})",
    +** Processing line: ~                                            size_enum:      3,~
     - Inside source: true
     *** True Line Result
    -          ha =@block_size - @block_offset
    -** Processing line: ~        elsif @orientation == :down~
    +                                            size_enum:      3,
    +** Processing line: ~                                            alignment_enum: 1)~
     - Inside source: true
     *** True Line Result
    -        elsif @orientation == :down
    -** Processing line: ~          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +                                            alignment_enum: 1)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          #args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~          xa =@x + x_offset~
    +
    +** Processing line: ~    # seperator line~
     - Inside source: true
     *** True Line Result
    -          xa =@x + x_offset
    -** Processing line: ~          ya =@y~
    +    # seperator line
    +** Processing line: ~    results.primitives << args.layout.rect(row: 1, col: 0, w: 7, h: 0)~
     - Inside source: true
     *** True Line Result
    -          ya =@y
    -** Processing line: ~          wa =@block_size - @block_offset~
    +    results.primitives << args.layout.rect(row: 1, col: 0, w: 7, h: 0)
    +** Processing line: ~                                     .line!(white_color)~
     - Inside source: true
     *** True Line Result
    -          wa =@block_size - @block_offset
    -** Processing line: ~          ha =@block_size * 3 - @block_offset~
    +                                     .line!(white_color)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          ha =@block_size * 3 - @block_offset
    -** Processing line: ~        end~
    +
    +** Processing line: ~    # screen location~
     - Inside source: true
    -*** True Line Result
    -        end
    -** Processing line: ~        points = [~
    +*** True Line Result
    +    # screen location
    +** Processing line: ~    results.primitives << args.layout.point(row: 1.0, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -        points = [
    -** Processing line: ~          {x: xa, y:ya},~
    +    results.primitives << args.layout.point(row: 1.0, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -          {x: xa, y:ya},
    -** Processing line: ~          {x: xa + wa,y:ya},~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "screen:")~
     - Inside source: true
     *** True Line Result
    -          {x: xa + wa,y:ya},
    -** Processing line: ~          {x: xa + wa,y:ya+ha},~
    +                                     .merge(text: "screen:")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          {x: xa + wa,y:ya+ha},
    -** Processing line: ~          {x: xa, y:ya+ha},~
    +
    +** Processing line: ~    results.primitives << args.layout.point(row: 1.0, col: 2, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -          {x: xa, y:ya+ha},
    -** Processing line: ~        ]~
    +    results.primitives << args.layout.point(row: 1.0, col: 2, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~        @squareColliders = [~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "(#{audio_entry.screenx.to_i}, #{audio_entry.screeny.to_i})")~
     - Inside source: true
     *** True Line Result
    -        @squareColliders = [
    -** Processing line: ~          SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),~
    +                                     .merge(text: "(#{audio_entry.screenx.to_i}, #{audio_entry.screeny.to_i})")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          SquareCollider.new(points[0].x,points[0].y,{x:-1,y:-1}),
    -** Processing line: ~          SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),~
    +
    +** Processing line: ~    # position~
     - Inside source: true
     *** True Line Result
    -          SquareCollider.new(points[1].x-COLLISIONWIDTH,points[1].y,{x:1,y:-1}),
    -** Processing line: ~          SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),~
    +    # position
    +** Processing line: ~    results.primitives << args.layout.point(row: 1.5, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -          SquareCollider.new(points[2].x-COLLISIONWIDTH,points[2].y-COLLISIONWIDTH,{x:1,y:1}),
    -** Processing line: ~          SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),~
    +    results.primitives << args.layout.point(row: 1.5, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -          SquareCollider.new(points[3].x,points[3].y-COLLISIONWIDTH,{x:-1,y:1}),
    -** Processing line: ~        ]~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "position:")~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~        @colliders = [~
    +                                     .merge(text: "position:")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @colliders = [
    -** Processing line: ~          LinearCollider.new(points[0],points[1], :neg),~
    +
    +** Processing line: ~    results.primitives << args.layout.point(row: 1.5, col: 2, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -          LinearCollider.new(points[0],points[1], :neg),
    -** Processing line: ~          LinearCollider.new(points[1],points[2], :neg),~
    +    results.primitives << args.layout.point(row: 1.5, col: 2, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -          LinearCollider.new(points[1],points[2], :neg),
    -** Processing line: ~          LinearCollider.new(points[2],points[3], :pos),~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "(#{audio_entry[:x].round(5).to_s[0..6]}, #{audio_entry[:y].round(5).to_s[0..6]})")~
     - Inside source: true
     *** True Line Result
    -          LinearCollider.new(points[2],points[3], :pos),
    -** Processing line: ~          LinearCollider.new(points[0],points[3], :pos),~
    +                                     .merge(text: "(#{audio_entry[:x].round(5).to_s[0..6]}, #{audio_entry[:y].round(5).to_s[0..6]})")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          LinearCollider.new(points[0],points[3], :pos),
    -** Processing line: ~        ]~
    +
    +** Processing line: ~    results.primitives << args.layout.point(row: 2.0, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~        return points~
    +    results.primitives << args.layout.point(row: 2.0, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -        return points
    -** Processing line: ~      end~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "pitch:")~
     - Inside source: true
     *** True Line Result
    -      end
    +                                     .merge(text: "pitch:")
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def update args~
    +** Processing line: ~    results.pitch_slider_rect = progress_bar(row: 2.0, col: 2,~
     - Inside source: true
     *** True Line Result
    -      def update args
    -** Processing line: ~        universalUpdate args, self~
    +    results.pitch_slider_rect = progress_bar(row: 2.0, col: 2,
    +** Processing line: ~                                             percentage: audio_entry.pitch / 2.0,~
     - Inside source: true
     *** True Line Result
    -        universalUpdate args, self
    -** Processing line: ~      end~
    +                                             percentage: audio_entry.pitch / 2.0,
    +** Processing line: ~                                             text: "#{audio_entry.pitch.to_sf}",~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                                             text: "#{audio_entry.pitch.to_sf}",
    +** Processing line: ~                                             args: args)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      def draw(args)~
    +                                             args: args)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      def draw(args)
    -** Processing line: ~          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2~
    +
    +** Processing line: ~    results.primitives << results.pitch_slider_rect.primitives~
     - Inside source: true
     *** True Line Result
    -          x_offset = (args.state.board_width + args.grid.w / 8) + @block_offset / 2
    +    results.primitives << results.pitch_slider_rect.primitives
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          if @orientation == :right~
    +** Processing line: ~    results.primitives << args.layout.point(row: 2.5, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -          if @orientation == :right
    -** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    results.primitives << args.layout.point(row: 2.5, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~          elsif @orientation == :up~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "playtime:")~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :up
    -** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +                                     .merge(text: "playtime:")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~          elsif @orientation == :left~
    +
    +** Processing line: ~    results.playtime_slider_rect = progress_bar(args: args,~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :left
    -** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]~
    +    results.playtime_slider_rect = progress_bar(args: args,
    +** Processing line: ~                                                row:  2.5,~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << [@x + x_offset, @y, @block_size * 3 - @block_offset, @block_size - @block_offset, @r, @g, @b]
    -** Processing line: ~          elsif @orientation == :down~
    +                                                row:  2.5,
    +** Processing line: ~                                                col:  2,~
     - Inside source: true
     *** True Line Result
    -          elsif @orientation == :down
    -** Processing line: ~              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]~
    +                                                col:  2,
    +** Processing line: ~                                                percentage: audio_entry.playtime / audio_entry.length_,~
     - Inside source: true
     *** True Line Result
    -              args.outputs.solids << [@x + x_offset, @y, @block_size - @block_offset, @block_size * 3 - @block_offset, @r, @g, @b]
    -** Processing line: ~          end~
    +                                                percentage: audio_entry.playtime / audio_entry.length_,
    +** Processing line: ~                                                text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")~
     - Inside source: true
     *** True Line Result
    -          end
    +                                                text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]~
    +** Processing line: ~    results.primitives << results.playtime_slider_rect.primitives~
     - Inside source: true
     *** True Line Result
    -          args.outputs.labels << [@x + x_offset + (@block_size * 2 - @block_offset)/2, (@y) + (@block_size * 2 - @block_offset)/2, @count.to_s]
    +    results.primitives << results.playtime_slider_rect.primitives
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      end~
    +** Processing line: ~    results.primitives << args.layout.point(row: 3.0, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~  end~
    +    results.primitives << args.layout.point(row: 3.0, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "gain:")~
     - 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
    +                                     .merge(text: "gain:")
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - linear_collider.rb~
    -- Header detected.
    +** Processing line: ~    results.gain_slider_rect = progress_bar(args: args,~
    +- Inside source: true
     *** True Line Result
    -
    +    results.gain_slider_rect = progress_bar(args: args,
    +** Processing line: ~                                            row:  3.0,~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - linear_collider.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +                                            row:  3.0,
    +** Processing line: ~                                            col:  2,~
    +- Inside source: true
     *** True Line Result
    -
    +                                            col:  2,
    +** Processing line: ~                                            percentage: audio_entry.gain,~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb~
    +                                            percentage: audio_entry.gain,
    +** Processing line: ~                                            text: "#{audio_entry.gain.to_sf}")~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/linear_collider.rb
    +                                            text: "#{audio_entry.gain.to_sf}")
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  COLLISIONWIDTH=8~
    +** Processing line: ~    results.primitives << results.gain_slider_rect.primitives~
     - Inside source: true
     *** True Line Result
    -  COLLISIONWIDTH=8
    +    results.primitives << results.gain_slider_rect.primitives
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class LinearCollider~
    -- Inside source: true
    -*** True Line Result
    -  class LinearCollider
    -** Processing line: ~    attr_reader :pointA, :pointB~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    attr_reader :pointA, :pointB
    -** Processing line: ~    def initialize (pointA, pointB, mode,collisionWidth=COLLISIONWIDTH)~
    +
    +** Processing line: ~    results.primitives << args.layout.point(row: 3.5, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -    def initialize (pointA, pointB, mode,collisionWidth=COLLISIONWIDTH)
    -** Processing line: ~      @pointA = pointA~
    +    results.primitives << args.layout.point(row: 3.5, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -      @pointA = pointA
    -** Processing line: ~      @pointB = pointB~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "looping:")~
     - Inside source: true
     *** True Line Result
    -      @pointB = pointB
    -** Processing line: ~      @mode = mode~
    +                                     .merge(text: "looping:")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @mode = mode
    -** Processing line: ~      @collisionWidth = collisionWidth~
    +
    +** Processing line: ~    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)~
     - Inside source: true
     *** True Line Result
    -      @collisionWidth = collisionWidth
    +    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if (@pointA.x > @pointB.x)~
    -- Inside source: true
    -*** True Line Result
    -      if (@pointA.x > @pointB.x)
    -** Processing line: ~        @pointA, @pointB = @pointB, @pointA~
    +** Processing line: ~    results.looping_checkbox_rect = check_box(args: args, row: 3.5, col: 2, checked: audio_entry.looping)~
     - Inside source: true
     *** True Line Result
    -        @pointA, @pointB = @pointB, @pointA
    -** Processing line: ~      end~
    +    results.looping_checkbox_rect = check_box(args: args, row: 3.5, col: 2, checked: audio_entry.looping)
    +** Processing line: ~    results.primitives << results.looping_checkbox_rect.primitives~
     - Inside source: true
     *** True Line Result
    -      end
    +    results.primitives << results.looping_checkbox_rect.primitives
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @linearCollider_collision_once = false~
    -- Inside source: true
    -*** True Line Result
    -      @linearCollider_collision_once = false
    -** Processing line: ~    end~
    +** Processing line: ~    results.primitives << args.layout.point(row: 4.0, col: 0, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    results.primitives << args.layout.point(row: 4.0, col: 0, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def collisionSlope args~
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "paused:")~
     - Inside source: true
     *** True Line Result
    -    def collisionSlope args
    -** Processing line: ~      if (@pointB.x-@pointA.x == 0)~
    +                                     .merge(text: "paused:")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if (@pointB.x-@pointA.x == 0)
    -** Processing line: ~        return INFINITY~
    +
    +** Processing line: ~    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)~
     - Inside source: true
     *** True Line Result
    -        return INFINITY
    -** Processing line: ~      end~
    +    checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)~
    +
    +** Processing line: ~    results.paused_checkbox_rect = check_box(args: args, row: 4.0, col: 2, checked: !audio_entry.paused)~
     - Inside source: true
     *** True Line Result
    -      return (@pointB.y - @pointA.y) / (@pointB.x - @pointA.x)
    -** Processing line: ~    end~
    +    results.paused_checkbox_rect = check_box(args: args, row: 4.0, col: 2, checked: !audio_entry.paused)
    +** Processing line: ~    results.primitives << results.paused_checkbox_rect.primitives~
     - Inside source: true
     *** True Line Result
    -    end
    +    results.primitives << results.paused_checkbox_rect.primitives
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~    results.delete_button_rect = { rect: args.layout.rect(row: 5, col: 0, w: 7, h: 1) }~
    +- Inside source: true
    +*** True Line Result
    +    results.delete_button_rect = { rect: args.layout.rect(row: 5, col: 0, w: 7, h: 1) }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def collision? (args, points, ball=nil)~
    +** Processing line: ~    results.primitives << results.delete_button_rect.to_solid(r: 180)~
     - Inside source: true
     *** True Line Result
    -    def collision? (args, points, ball=nil)
    +    results.primitives << results.delete_button_rect.to_solid(r: 180)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      slope = collisionSlope args~
    +** Processing line: ~    results.primitives << args.layout.point(row: 5, col: 3.5, row_anchor: 0.5)~
     - Inside source: true
     *** True Line Result
    -      slope = collisionSlope args
    -** Processing line: ~      result = false~
    +    results.primitives << args.layout.point(row: 5, col: 3.5, row_anchor: 0.5)
    +** Processing line: ~                                     .merge(label_style)~
     - Inside source: true
     *** True Line Result
    -      result = false
    +                                     .merge(label_style)
    +** Processing line: ~                                     .merge(text: "DELETE", alignment_enum: 1)~
    +- Inside source: true
    +*** True Line Result
    +                                     .merge(text: "DELETE", alignment_enum: 1)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line~
    +** Processing line: ~    return results~
     - Inside source: true
     *** True Line Result
    -      # calculate a vector with a magnitude of (1/2)collisionWidth and a direction perpendicular to the collision line
    -** Processing line: ~      vect=nil;mag=nil;vect=nil;~
    +    return results
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      vect=nil;mag=nil;vect=nil;
    -** Processing line: ~      if @mode == :both~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if @mode == :both
    -** Processing line: ~        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +
    +** Processing line: ~  def render_panel args~
     - Inside source: true
     *** True Line Result
    -        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -** Processing line: ~        mag  = (vect.x**2 + vect.y**2)**0.5~
    +  def render_panel args
    +** Processing line: ~    args.state.panel = nil~
     - Inside source: true
     *** True Line Result
    -        mag  = (vect.x**2 + vect.y**2)**0.5
    -** Processing line: ~        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}~
    +    args.state.panel = nil
    +** Processing line: ~    audio_entry = args.audio[args.state.selected]~
     - Inside source: true
     *** True Line Result
    -        vect = {y: -1*(vect.x/(mag))*@collisionWidth*0.5, x: (vect.y/(mag))*@collisionWidth*0.5}
    -** Processing line: ~      else~
    +    audio_entry = args.audio[args.state.selected]
    +** Processing line: ~    return unless audio_entry~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +    return unless audio_entry
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        vect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -** Processing line: ~        mag  = (vect.x**2 + vect.y**2)**0.5~
    +
    +** Processing line: ~    mouse_down = (args.state.mouse_held >= 0)~
     - Inside source: true
     *** True Line Result
    -        mag  = (vect.x**2 + vect.y**2)**0.5
    -** Processing line: ~        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}~
    +    mouse_down = (args.state.mouse_held >= 0)
    +** Processing line: ~    args.state.panel = panel_primitives args, audio_entry~
     - Inside source: true
     *** True Line Result
    -        vect = {y: -1*(vect.x/(mag))*@collisionWidth, x: (vect.y/(mag))*@collisionWidth}
    -** Processing line: ~      end~
    +    args.state.panel = panel_primitives args, audio_entry
    +** Processing line: ~    args.outputs.primitives << args.state.panel.primitives~
     - Inside source: true
     *** True Line Result
    -      end
    +    args.outputs.primitives << args.state.panel.primitives
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;~
    +** Processing line: ~  def new_sound_id! args~
     - Inside source: true
     *** True Line Result
    -      rpointA=nil;rpointB=nil;rpointC=nil;rpointD=nil;
    -** Processing line: ~      if @mode == :pos~
    +  def new_sound_id! args
    +** Processing line: ~    args.state.sound_id ||= 0~
     - Inside source: true
     *** True Line Result
    -      if @mode == :pos
    -** Processing line: ~        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}~
    +    args.state.sound_id ||= 0
    +** Processing line: ~    args.state.sound_id  += 1~
     - Inside source: true
     *** True Line Result
    -        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    -** Processing line: ~        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}~
    +    args.state.sound_id  += 1
    +** Processing line: ~    args.state.sound_id~
     - Inside source: true
     *** True Line Result
    -        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    -** Processing line: ~        rpointC = {x:@pointB.x, y:@pointB.y}~
    +    args.state.sound_id
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        rpointC = {x:@pointB.x, y:@pointB.y}
    -** Processing line: ~        rpointD = {x:@pointA.x, y:@pointA.y}~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        rpointD = {x:@pointA.x, y:@pointA.y}
    -** Processing line: ~      elsif @mode == :neg~
    +
    +** Processing line: ~  def render_launcher args~
     - Inside source: true
     *** True Line Result
    -      elsif @mode == :neg
    -** Processing line: ~        rpointA = {x:@pointA.x, y:@pointA.y}~
    +  def render_launcher args
    +** Processing line: ~    args.outputs.primitives << args.state.spawn_sound_buttons.map(&:primitives)~
     - Inside source: true
     *** True Line Result
    -        rpointA = {x:@pointA.x, y:@pointA.y}
    -** Processing line: ~        rpointB = {x:@pointB.x, y:@pointB.y}~
    +    args.outputs.primitives << args.state.spawn_sound_buttons.map(&:primitives)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        rpointB = {x:@pointB.x, y:@pointB.y}
    -** Processing line: ~        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    -** Processing line: ~        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}~
    +
    +** Processing line: ~  def render_ui args~
     - Inside source: true
     *** True Line Result
    -        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    -** Processing line: ~      elsif @mode == :both~
    +  def render_ui args
    +** Processing line: ~    render_launcher args~
     - Inside source: true
     *** True Line Result
    -      elsif @mode == :both
    -** Processing line: ~        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}~
    +    render_launcher args
    +** Processing line: ~    render_panel args~
     - Inside source: true
     *** True Line Result
    -        rpointA = {x:@pointA.x + vect.x, y:@pointA.y + vect.y}
    -** Processing line: ~        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}~
    +    render_panel args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        rpointB = {x:@pointB.x + vect.x, y:@pointB.y + vect.y}
    -** Processing line: ~        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        rpointC = {x:@pointB.x - vect.x, y:@pointB.y - vect.y}
    -** Processing line: ~        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -        rpointD = {x:@pointA.x - vect.x, y:@pointA.y - vect.y}
    -** Processing line: ~      end~
    +  def tick args
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      #four point rectangle~
    +    defaults args
    +** Processing line: ~    render args~
     - Inside source: true
     *** True Line Result
    -      #four point rectangle
    -** Processing line: ~~
    +    render args
    +** Processing line: ~    input args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +    input args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if ball != nil~
    +** Processing line: ~  def input args~
     - Inside source: true
     *** True Line Result
    -      if ball != nil
    -** Processing line: ~        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]~
    +  def input args
    +** Processing line: ~    if !args.audio[args.state.selected]~
     - Inside source: true
     *** True Line Result
    -        xs = [rpointA.x,rpointB.x,rpointC.x,rpointD.x]
    -** Processing line: ~        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]~
    +    if !args.audio[args.state.selected]
    +** Processing line: ~      args.state.selected = nil~
     - Inside source: true
     *** True Line Result
    -        ys = [rpointA.y,rpointB.y,rpointC.y,rpointD.y]
    -** Processing line: ~        correct = 1~
    +      args.state.selected = nil
    +** Processing line: ~      args.state.dragging = nil~
     - Inside source: true
     *** True Line Result
    -        correct = 1
    -** Processing line: ~        rect1 = [ball.x, ball.y, ball.width, ball.height]~
    +      args.state.dragging = nil
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        rect1 = [ball.x, ball.y, ball.width, ball.height]
    -** Processing line: ~        #$r1 = rect1~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        #$r1 = rect1
    -** Processing line: ~        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]~
    +
    +** Processing line: ~    # spawn button and node interaction~
     - Inside source: true
     *** True Line Result
    -        rect2 = [xs.min-correct,ys.min-correct,(xs.max-xs.min)+correct*2,(ys.max-ys.min)+correct*2]
    -** Processing line: ~        #$r2 = rect2~
    +    # spawn button and node interaction
    +** Processing line: ~    if args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -        #$r2 = rect2
    -** Processing line: ~        if rect1.intersect_rect?(rect2) == false~
    +    if args.inputs.mouse.click
    +** Processing line: ~      spawn_sound_button = args.state.spawn_sound_buttons.find { |b| args.inputs.mouse.inside_rect? b.rect }~
     - Inside source: true
     *** True Line Result
    -        if rect1.intersect_rect?(rect2) == false
    -** Processing line: ~          return false~
    +      spawn_sound_button = args.state.spawn_sound_buttons.find { |b| args.inputs.mouse.inside_rect? b.rect }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          return false
    -** Processing line: ~        end~
    +
    +** Processing line: ~      audio_click_key, audio_click_value = args.audio.find do |k, v|~
     - Inside source: true
     *** True Line Result
    -        end
    +      audio_click_key, audio_click_value = args.audio.find do |k, v|
    +** Processing line: ~        args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]~
    +- Inside source: true
    +*** True Line Result
    +        args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -35892,418 +44051,494 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~      if spawn_sound_button~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #area of a triangle~
    +      if spawn_sound_button
    +** Processing line: ~        args.state.selected = nil~
     - Inside source: true
     *** True Line Result
    -      #area of a triangle
    -** Processing line: ~      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }~
    +        args.state.selected = nil
    +** Processing line: ~        spawn_new_sound args, spawn_sound_button.name, spawn_sound_button.path~
     - Inside source: true
     *** True Line Result
    -      triArea = -> (a,b,c) { ((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))/2.0).abs }
    -** Processing line: ~~
    +        spawn_new_sound args, spawn_sound_button.name, spawn_sound_button.path
    +** Processing line: ~      elsif audio_click_key~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #if at least on point is in the rectangle then collision? is true - otherwise false~
    +      elsif audio_click_key
    +** Processing line: ~        args.state.selected = audio_click_key~
     - Inside source: true
     *** True Line Result
    -      #if at least on point is in the rectangle then collision? is true - otherwise false
    -** Processing line: ~      for point in points~
    +        args.state.selected = audio_click_key
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      for point in points
    -** Processing line: ~        #Check whether a given point lies inside a rectangle or not:~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        #Check whether a given point lies inside a rectangle or not:
    -** Processing line: ~        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        #if the sum of the area of traingls, PAB, PBC, PCD, PAD equal the area of the rec, then an intersection has occured
    -** Processing line: ~        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)~
    +
    +** Processing line: ~    if args.state.mouse_state == :held && args.state.selected~
     - Inside source: true
     *** True Line Result
    -        areaRec =  triArea.call(rpointA, rpointB, rpointC)+triArea.call(rpointA, rpointC, rpointD)
    -** Processing line: ~        areaSum = [~
    +    if args.state.mouse_state == :held && args.state.selected
    +** Processing line: ~      v = args.audio[args.state.selected]~
     - Inside source: true
     *** True Line Result
    -        areaSum = [
    -** Processing line: ~          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),~
    +      v = args.audio[args.state.selected]
    +** Processing line: ~      if args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]~
     - Inside source: true
     *** True Line Result
    -          triArea.call(point, rpointA, rpointB),triArea.call(point, rpointB, rpointC),
    -** Processing line: ~          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)~
    +      if args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]
    +** Processing line: ~        args.state.dragging = args.state.selected~
     - Inside source: true
     *** True Line Result
    -          triArea.call(point, rpointC, rpointD),triArea.call(point, rpointA, rpointD)
    -** Processing line: ~        ].inject(0){|sum,x| sum + x }~
    +        args.state.dragging = args.state.selected
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        ].inject(0){|sum,x| sum + x }
    -** Processing line: ~        e = 0.0001 #allow for minor error~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        e = 0.0001 #allow for minor error
    -** Processing line: ~        if areaRec>= areaSum-e and areaRec<= areaSum+e~
    +
    +** Processing line: ~      if args.state.dragging~
     - Inside source: true
     *** True Line Result
    -        if areaRec>= areaSum-e and areaRec<= areaSum+e
    -** Processing line: ~          result = true~
    +      if args.state.dragging
    +** Processing line: ~        s = args.audio[args.state.selected]~
     - Inside source: true
     *** True Line Result
    -          result = true
    -** Processing line: ~          #return true~
    +        s = args.audio[args.state.selected]
    +** Processing line: ~        # you can hang anything on the audio hashes you want, so we store the~
     - Inside source: true
     *** True Line Result
    -          #return true
    -** Processing line: ~          break~
    +        # you can hang anything on the audio hashes you want, so we store the
    +** Processing line: ~        #  actual screen position so it doesn't scale weirdly vs your mouse.~
     - Inside source: true
     *** True Line Result
    -          break
    -** Processing line: ~        end~
    +        #  actual screen position so it doesn't scale weirdly vs your mouse.
    +** Processing line: ~        s.screenx = args.inputs.mouse.x - (args.state.boxsize / 2)~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +        s.screenx = args.inputs.mouse.x - (args.state.boxsize / 2)
    +** Processing line: ~        s.screeny = args.inputs.mouse.y - (args.state.boxsize / 2)~
     - Inside source: true
     *** True Line Result
    -      end
    +        s.screeny = args.inputs.mouse.y - (args.state.boxsize / 2)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]~
    +** Processing line: ~        s.screeny = 50 if s.screeny < 50~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y,     000, 000, 000]
    -** Processing line: ~      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]~
    +        s.screeny = 50 if s.screeny < 50
    +** Processing line: ~        s.screeny = (719 - args.state.boxsize) if s.screeny > (719 - args.state.boxsize)~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.lines << [rpointA.x, rpointA.y, rpointB.x, rpointB.y,     255, 000, 000]
    -** Processing line: ~      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]~
    +        s.screeny = (719 - args.state.boxsize) if s.screeny > (719 - args.state.boxsize)
    +** Processing line: ~        s.screenx = 0 if s.screenx < 0~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.lines << [rpointC.x, rpointC.y, rpointD.x, rpointD.y,     000, 000, 255]
    -** Processing line: ~~
    +        s.screenx = 0 if s.screenx < 0
    +** Processing line: ~        s.screenx = (1279 - args.state.boxsize) if s.screenx > (1279 - args.state.boxsize)~
     - Inside source: true
     *** True Line Result
    -
    +        s.screenx = (1279 - args.state.boxsize) if s.screenx > (1279 - args.state.boxsize)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)~
    +** Processing line: ~        s.x = ((s.screenx / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range~
     - Inside source: true
     *** True Line Result
    -      #puts (rpointA.x.to_s + " " +  rpointA.y.to_s + " " + rpointB.x.to_s + " "+ rpointB.y.to_s)
    -** Processing line: ~      return result~
    +        s.x = ((s.screenx / 1279.0) * 2.0) - 1.0  # scale to -1.0 - 1.0 range
    +** Processing line: ~        s.y = ((s.screeny / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range~
     - Inside source: true
     *** True Line Result
    -      return result
    -** Processing line: ~    end #end collision?~
    +        s.y = ((s.screeny / 719.0) * 2.0) - 1.0   # scale to -1.0 - 1.0 range
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end #end collision?
    +      end
    +** Processing line: ~    elsif args.state.mouse_state == :released~
    +- Inside source: true
    +*** True Line Result
    +    elsif args.state.mouse_state == :released
    +** Processing line: ~      args.state.dragging = nil~
    +- Inside source: true
    +*** True Line Result
    +      args.state.dragging = nil
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)~
    +** Processing line: ~    input_panel args~
     - Inside source: true
     *** True Line Result
    -    def getRepelMagnitude (fbx, fby, vrx, vry, ballMag)
    -** Processing line: ~      a = fbx ; b = vrx ; c = fby~
    +    input_panel args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      a = fbx ; b = vrx ; c = fby
    -** Processing line: ~      d = vry ; e = ballMag~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      d = vry ; e = ballMag
    -** Processing line: ~      if b**2 + d**2 == 0~
    +
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -      if b**2 + d**2 == 0
    -** Processing line: ~        #unexpected~
    +  def defaults args
    +** Processing line: ~    args.state.mouse_state      ||= :released~
     - Inside source: true
     *** True Line Result
    -        #unexpected
    -** Processing line: ~      end~
    +    args.state.mouse_state      ||= :released
    +** Processing line: ~    args.state.dragging_source  ||= false~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
    +    args.state.dragging_source  ||= false
    +** Processing line: ~    args.state.selected         ||= 0~
     - Inside source: true
     *** True Line Result
    -      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    -** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
    +    args.state.selected         ||= 0
    +** Processing line: ~    args.state.next_sound_index ||= 0~
     - Inside source: true
     *** True Line Result
    -      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    -** Processing line: ~      err = 0.00001~
    +    args.state.next_sound_index ||= 0
    +** Processing line: ~    args.state.boxsize          ||= 30~
     - Inside source: true
     *** True Line Result
    -      err = 0.00001
    -** Processing line: ~      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5~
    +    args.state.boxsize          ||= 30
    +** Processing line: ~    args.state.sound_files      ||= [~
     - Inside source: true
     *** True Line Result
    -      o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
    -** Processing line: ~      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5~
    +    args.state.sound_files      ||= [
    +** Processing line: ~      { name: :tada,   path: "sounds/tada.wav"   },~
     - Inside source: true
     *** True Line Result
    -      p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
    -** Processing line: ~      r = 0~
    +      { name: :tada,   path: "sounds/tada.wav"   },
    +** Processing line: ~      { name: :splash, path: "sounds/splash.wav" },~
     - Inside source: true
     *** True Line Result
    -      r = 0
    -** Processing line: ~      if (ballMag >= o-err and ballMag <= o+err)~
    +      { name: :splash, path: "sounds/splash.wav" },
    +** Processing line: ~      { name: :drum,   path: "sounds/drum.wav"   },~
     - Inside source: true
     *** True Line Result
    -      if (ballMag >= o-err and ballMag <= o+err)
    -** Processing line: ~        r = x1~
    +      { name: :drum,   path: "sounds/drum.wav"   },
    +** Processing line: ~      { name: :spring, path: "sounds/spring.wav" },~
     - Inside source: true
     *** True Line Result
    -        r = x1
    -** Processing line: ~      elsif (ballMag >= p-err and ballMag <= p+err)~
    +      { name: :spring, path: "sounds/spring.wav" },
    +** Processing line: ~      { name: :music,  path: "sounds/music.ogg"  }~
     - Inside source: true
     *** True Line Result
    -      elsif (ballMag >= p-err and ballMag <= p+err)
    -** Processing line: ~        r = x2~
    +      { name: :music,  path: "sounds/music.ogg"  }
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -        r = x2
    -** Processing line: ~      else~
    +    ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        #unexpected~
    +
    +** Processing line: ~    # generate buttons based off the sound collection above~
     - Inside source: true
     *** True Line Result
    -        #unexpected
    -** Processing line: ~      end~
    +    # generate buttons based off the sound collection above
    +** Processing line: ~    args.state.spawn_sound_buttons ||= begin~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      return r~
    +    args.state.spawn_sound_buttons ||= begin
    +** Processing line: ~      # create a group of buttons~
     - Inside source: true
     *** True Line Result
    -      return r
    -** Processing line: ~    end~
    +      # create a group of buttons
    +** Processing line: ~      # column centered (using col_offset to calculate the column offset)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      # column centered (using col_offset to calculate the column offset)
    +** Processing line: ~      # where each item is 2 columns apart~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def collide args, ball~
    +      # where each item is 2 columns apart
    +** Processing line: ~      rects = args.layout.rect_group row:   11,~
     - Inside source: true
     *** True Line Result
    -    def collide args, ball
    -** Processing line: ~      slope = collisionSlope args~
    +      rects = args.layout.rect_group row:   11,
    +** Processing line: ~                                     col_offset: {~
     - Inside source: true
     *** True Line Result
    -      slope = collisionSlope args
    -** Processing line: ~~
    +                                     col_offset: {
    +** Processing line: ~                                       count: args.state.sound_files.length,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # perpVect: normal vector perpendicular to collision~
    +                                       count: args.state.sound_files.length,
    +** Processing line: ~                                       w:     2~
     - Inside source: true
     *** True Line Result
    -      # perpVect: normal vector perpendicular to collision
    -** Processing line: ~      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}~
    +                                       w:     2
    +** Processing line: ~                                     },~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: @pointB.x - @pointA.x, y:@pointB.y - @pointA.y}
    -** Processing line: ~      mag  = (perpVect.x**2 + perpVect.y**2)**0.5~
    +                                     },
    +** Processing line: ~                                     dcol:  2,~
     - Inside source: true
     *** True Line Result
    -      mag  = (perpVect.x**2 + perpVect.y**2)**0.5
    -** Processing line: ~      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}~
    +                                     dcol:  2,
    +** Processing line: ~                                     w:     2,~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)}
    -** Processing line: ~      perpVect = {x: -perpVect.y, y: perpVect.x}~
    +                                     w:     2,
    +** Processing line: ~                                     h:     1,~
     - Inside source: true
     *** True Line Result
    -      perpVect = {x: -perpVect.y, y: perpVect.x}
    -** Processing line: ~      if perpVect.y > 0 #ensure perpVect points upward~
    +                                     h:     1,
    +** Processing line: ~                                     group: args.state.sound_files~
     - Inside source: true
     *** True Line Result
    -      if perpVect.y > 0 #ensure perpVect points upward
    -** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +                                     group: args.state.sound_files
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -** Processing line: ~      end~
    +
    +** Processing line: ~      # now that you have the rects~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      previousPosition = {~
    +      # now that you have the rects
    +** Processing line: ~      # construct the metadata for the buttons~
     - Inside source: true
     *** True Line Result
    -      previousPosition = {
    -** Processing line: ~        x:ball.x-ball.velocity.x,~
    +      # construct the metadata for the buttons
    +** Processing line: ~      rects.map do |rect|~
     - Inside source: true
     *** True Line Result
    -        x:ball.x-ball.velocity.x,
    -** Processing line: ~        y:ball.y-ball.velocity.y~
    +      rects.map do |rect|
    +** Processing line: ~        {~
     - Inside source: true
     *** True Line Result
    -        y:ball.y-ball.velocity.y
    -** Processing line: ~      }~
    +        {
    +** Processing line: ~          rect: rect,~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~      yInterc = @pointA.y + -slope*@pointA.x~
    +          rect: rect,
    +** Processing line: ~          name: rect.name,~
     - Inside source: true
     *** True Line Result
    -      yInterc = @pointA.y + -slope*@pointA.x
    -** Processing line: ~      if slope == INFINITY~
    +          name: rect.name,
    +** Processing line: ~          path: rect.path,~
     - Inside source: true
     *** True Line Result
    -      if slope == INFINITY
    -** Processing line: ~        if previousPosition.x < @pointA.x~
    +          path: rect.path,
    +** Processing line: ~          primitives: [~
     - Inside source: true
     *** True Line Result
    -        if previousPosition.x < @pointA.x
    -** Processing line: ~          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +          primitives: [
    +** Processing line: ~            rect.to_border(r: 255, g: 255, b: 255),~
     - Inside source: true
     *** True Line Result
    -          perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    -** Processing line: ~          yInterc = -INFINITY~
    +            rect.to_border(r: 255, g: 255, b: 255),
    +** Processing line: ~            rect.to_label(x: rect.center_x,~
     - Inside source: true
     *** True Line Result
    -          yInterc = -INFINITY
    -** Processing line: ~        end~
    +            rect.to_label(x: rect.center_x,
    +** Processing line: ~                          y: rect.center_y,~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +~
    +                          y: rect.center_y,
    +** Processing line: ~                          text: "#{rect.name}",~
     - Inside source: true
     *** True Line Result
    -      elsif previousPosition.y < slope*previousPosition.x + yInterc #check if ball is bellow or above the collider to determine if perpVect is - or +
    -** Processing line: ~        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}~
    +                          text: "#{rect.name}",
    +** Processing line: ~                          alignment_enum: 1,~
     - Inside source: true
     *** True Line Result
    -        perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
    +                          alignment_enum: 1,
    +** Processing line: ~                          vertical_alignment_enum: 1,~
    +- Inside source: true
    +*** True Line Result
    +                          vertical_alignment_enum: 1,
    +** Processing line: ~                          r: 255, g: 255, b: 255)~
    +- Inside source: true
    +*** True Line Result
    +                          r: 255, g: 255, b: 255)
    +** Processing line: ~          ]~
    +- Inside source: true
    +*** True Line Result
    +          ]
    +** Processing line: ~        }~
    +- Inside source: true
    +*** True Line Result
    +        }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5~
    +** Processing line: ~    if args.inputs.mouse.up~
     - Inside source: true
     *** True Line Result
    -      velocityMag = (ball.velocity.x**2 + ball.velocity.y**2)**0.5
    -** Processing line: ~      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity~
    +    if args.inputs.mouse.up
    +** Processing line: ~      args.state.mouse_state = :released~
     - Inside source: true
     *** True Line Result
    -      theta_ball=Math.atan2(ball.velocity.y,ball.velocity.x) #the angle of the ball's velocity
    -** Processing line: ~      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)~
    +      args.state.mouse_state = :released
    +** Processing line: ~      args.state.dragging_source = false~
     - Inside source: true
     *** True Line Result
    -      theta_repel=Math.atan2(perpVect.y,perpVect.x) #the angle of the repelling force(perpVect)
    +      args.state.dragging_source = false
    +** Processing line: ~    elsif args.inputs.mouse.down~
    +- Inside source: true
    +*** True Line Result
    +    elsif args.inputs.mouse.down
    +** Processing line: ~      args.state.mouse_state = :held~
    +- Inside source: true
    +*** True Line Result
    +      args.state.mouse_state = :held
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity~
    +** Processing line: ~    args.outputs.background_color = [ 0, 0, 0, 255 ]~
     - Inside source: true
     *** True Line Result
    -      fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity
    -** Processing line: ~      fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity~
    +    args.outputs.background_color = [ 0, 0, 0, 255 ]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #the magnitude of the repelling force~
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -      #the magnitude of the repelling force
    -** Processing line: ~      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)~
    +  def render args
    +** Processing line: ~    render_ui args~
     - Inside source: true
     *** True Line Result
    -      repelMag = getRepelMagnitude(fbx, fby, perpVect.x, perpVect.y, (ball.velocity.x**2 + ball.velocity.y**2)**0.5)
    -** Processing line: ~      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +    render_ui args
    +** Processing line: ~    render_sources args~
     - Inside source: true
     *** True Line Result
    -      frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    -** Processing line: ~      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby~
    +    render_sources args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      fsumx = fbx+frx #sum of x forces~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      fsumx = fbx+frx #sum of x forces
    -** Processing line: ~      fsumy = fby+fry #sum of y forces~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -      fsumy = fby+fry #sum of y forces
    -** Processing line: ~      fr = velocityMag#fr is the resulting magnitude~
    +
    +** Processing line: ~*** Advanced Audio - Audio Mixer - server_ip_address.txt~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Audio - Audio Mixer - server_ip_address.txt
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/07_advanced_audio/01_audio_mixer/app/server_ip_address.txt~
     - Inside source: true
     *** True Line Result
    -      fr = velocityMag#fr is the resulting magnitude
    -** Processing line: ~      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle~
    +  # ./samples/07_advanced_audio/01_audio_mixer/app/server_ip_address.txt
    +** Processing line: ~  192.168.1.65~
     - Inside source: true
     *** True Line Result
    -      thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    -** Processing line: ~      xnew = fr*Math.cos(thetaNew)#resulting x velocity~
    +  192.168.1.65
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt~
     - Inside source: true
     *** True Line Result
    -      xnew = fr*Math.cos(thetaNew)#resulting x velocity
    -** Processing line: ~      ynew = fr*Math.sin(thetaNew)#resulting y velocity~
    +  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
    +** Processing line: ~  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~
     - Inside source: true
     *** True Line Result
    -      ynew = fr*Math.sin(thetaNew)#resulting y velocity
    -** Processing line: ~      if (velocityMag < MAX_VELOCITY)~
    +  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
    +** Processing line: ~  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~
     - Inside source: true
     *** True Line Result
    -      if (velocityMag < MAX_VELOCITY)
    -** Processing line: ~        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)~
    +  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        ball.velocity =  Vector2d.new(xnew*1.1, ynew*1.1)
    -** Processing line: ~      else~
    +
    +** Processing line: ~  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        ball.velocity =  Vector2d.new(xnew, ynew)~
    +  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
    +** Processing line: ~  teamid=~
     - Inside source: true
     *** True Line Result
    -        ball.velocity =  Vector2d.new(xnew, ynew)
    -** Processing line: ~      end~
    +  teamid=
    +** Processing line: ~  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
    +** Processing line: ~  appid=~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    end~
    +  appid=
    +** Processing line: ~  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
    +** Processing line: ~  appname=~
     - Inside source: true
     *** True Line Result
    -  end
    +  appname=
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -36316,938 +44551,1066 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - main.rb~
    +** Processing line: ~*** Advanced Audio - Sound Synthesis - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - main.rb
    +*** Advanced Audio - Sound Synthesis - 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/04_physics_and_collisions/09_arbitrary_collision/app/main.rb~
    +** Processing line: ~  # ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/main.rb
    -** Processing line: ~  INFINITY= 10**10~
    +  # ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb
    +** Processing line: ~  begin # region: top level tick methods~
     - Inside source: true
     *** True Line Result
    -  INFINITY= 10**10
    -** Processing line: ~  MAX_VELOCITY = 8.0~
    +  begin # region: top level tick methods
    +** Processing line: ~    def tick args~
     - Inside source: true
     *** True Line Result
    -  MAX_VELOCITY = 8.0
    -** Processing line: ~  BALL_COUNT = 90~
    +    def tick args
    +** Processing line: ~      defaults args~
     - Inside source: true
     *** True Line Result
    -  BALL_COUNT = 90
    -** Processing line: ~  BALL_DISTANCE = 20~
    +      defaults args
    +** Processing line: ~      render args~
     - Inside source: true
     *** True Line Result
    -  BALL_DISTANCE = 20
    -** Processing line: ~  require 'app/vector2d.rb'~
    +      render args
    +** Processing line: ~      input args~
     - Inside source: true
     *** True Line Result
    -  require 'app/vector2d.rb'
    -** Processing line: ~  require 'app/blocks.rb'~
    +      input args
    +** Processing line: ~      process_audio_queue args~
     - Inside source: true
     *** True Line Result
    -  require 'app/blocks.rb'
    -** Processing line: ~  require 'app/ball.rb'~
    +      process_audio_queue args
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  require 'app/ball.rb'
    -** Processing line: ~  require 'app/rectangle.rb'~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  require 'app/rectangle.rb'
    -** Processing line: ~  require 'app/linear_collider.rb'~
    +
    +** Processing line: ~    def defaults args~
     - Inside source: true
     *** True Line Result
    -  require 'app/linear_collider.rb'
    -** Processing line: ~  require 'app/square_collider.rb'~
    +    def defaults args
    +** Processing line: ~      args.state.sine_waves      ||= {}~
     - Inside source: true
     *** True Line Result
    -  require 'app/square_collider.rb'
    -** Processing line: ~~
    +      args.state.sine_waves      ||= {}
    +** Processing line: ~      args.state.square_waves    ||= {}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +      args.state.square_waves    ||= {}
    +** Processing line: ~      args.state.saw_tooth_waves ||= {}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +      args.state.saw_tooth_waves ||= {}
    +** Processing line: ~      args.state.triangle_waves  ||= {}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Method to init default values~
    +      args.state.triangle_waves  ||= {}
    +** Processing line: ~      args.state.audio_queue     ||= []~
     - Inside source: true
     *** True Line Result
    -  #Method to init default values
    -** Processing line: ~  def defaults args~
    +      args.state.audio_queue     ||= []
    +** Processing line: ~      args.state.buttons         ||= [~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    args.state.board_width ||= args.grid.w / 4~
    +      args.state.buttons         ||= [
    +** Processing line: ~        (frequency_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.board_width ||= args.grid.w / 4
    -** Processing line: ~    args.state.board_height ||= args.grid.h~
    +        (frequency_buttons args),
    +** Processing line: ~        (sine_wave_note_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.board_height ||= args.grid.h
    -** Processing line: ~    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]~
    +        (sine_wave_note_buttons args),
    +** Processing line: ~        (bell_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.game_area ||= [(args.state.board_width + args.grid.w / 8), 0, args.state.board_width, args.grid.h]
    -** Processing line: ~    args.state.balls ||= []~
    +        (bell_buttons args),
    +** Processing line: ~        (square_wave_note_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.balls ||= []
    -** Processing line: ~    args.state.num_balls ||= 0~
    +        (square_wave_note_buttons args),
    +** Processing line: ~        (saw_tooth_wave_note_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.num_balls ||= 0
    -** Processing line: ~    args.state.ball_created_at ||= args.state.tick_count~
    +        (saw_tooth_wave_note_buttons args),
    +** Processing line: ~        (triangle_wave_note_buttons args),~
     - Inside source: true
     *** True Line Result
    -    args.state.ball_created_at ||= args.state.tick_count
    -** Processing line: ~    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5~
    +        (triangle_wave_note_buttons args),
    +** Processing line: ~      ].flatten~
     - Inside source: true
     *** True Line Result
    -    args.state.ball_hypotenuse = (10**2 + 10**2)**0.5
    -** Processing line: ~    args.state.ballParents ||=nil~
    +      ].flatten
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.ballParents ||=nil
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    init_blocks args~
    +** Processing line: ~    def render args~
     - Inside source: true
     *** True Line Result
    -    init_blocks args
    -** Processing line: ~    init_balls args~
    +    def render args
    +** Processing line: ~      args.outputs.borders << args.state.buttons.map { |b| b[:border] }~
     - Inside source: true
     *** True Line Result
    -    init_balls args
    -** Processing line: ~  end~
    +      args.outputs.borders << args.state.buttons.map { |b| b[:border] }
    +** Processing line: ~      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      args.outputs.labels  << args.state.buttons.map { |b| b[:label]  }
    +** Processing line: ~      args.outputs.labels  << args.layout~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  begin :default_methods~
    +      args.outputs.labels  << args.layout
    +** Processing line: ~                                .rect(row: 0, col: 11.5)~
     - Inside source: true
     *** True Line Result
    -  begin :default_methods
    -** Processing line: ~    def init_blocks args~
    +                                .rect(row: 0, col: 11.5)
    +** Processing line: ~                                .yield_self { |r| r.merge y: r.y + r.h }~
     - Inside source: true
     *** True Line Result
    -    def init_blocks args
    -** Processing line: ~      block_size = args.state.board_width / 8~
    +                                .yield_self { |r| r.merge y: r.y + r.h }
    +** Processing line: ~                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",~
     - Inside source: true
     *** True Line Result
    -      block_size = args.state.board_width / 8
    -** Processing line: ~      #Space inbetween each block~
    +                                .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",
    +** Processing line: ~                                       alignment_enum: 1)~
     - Inside source: true
     *** True Line Result
    -      #Space inbetween each block
    -** Processing line: ~      block_offset = 4~
    +                                       alignment_enum: 1)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      block_offset = 4
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.squares ||=[~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.squares ||=[
    -** Processing line: ~        Square.new(args, 2, 0, block_size, :right, block_offset),~
    +
    +** Processing line: ~    def input args~
     - Inside source: true
     *** True Line Result
    -        Square.new(args, 2, 0, block_size, :right, block_offset),
    -** Processing line: ~        Square.new(args, 5, 0, block_size, :right, block_offset),~
    +    def input args
    +** Processing line: ~      args.state.buttons.each do |b|~
     - Inside source: true
     *** True Line Result
    -        Square.new(args, 5, 0, block_size, :right, block_offset),
    -** Processing line: ~        Square.new(args, 6, 7, block_size, :right, block_offset)~
    +      args.state.buttons.each do |b|
    +** Processing line: ~        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])~
     - Inside source: true
     *** True Line Result
    -        Square.new(args, 6, 7, block_size, :right, block_offset)
    -** Processing line: ~      ]~
    +        if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])
    +** Processing line: ~          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~~
    +          parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "
    +** Processing line: ~          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +          args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"
    +** Processing line: ~          send b[:method_to_call], args, b~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #Possible orientations are :right, :left, :up, :down~
    +          send b[:method_to_call], args, b
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      #Possible orientations are :right, :left, :up, :down
    -** Processing line: ~~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.tshapes ||= [~
    +** Processing line: ~      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))~
     - Inside source: true
     *** True Line Result
    -      args.state.tshapes ||= [
    -** Processing line: ~        TShape.new(args, 0, 6, block_size, :left, block_offset),~
    +      if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))
    +** Processing line: ~        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'~
     - Inside source: true
     *** True Line Result
    -        TShape.new(args, 0, 6, block_size, :left, block_offset),
    -** Processing line: ~        TShape.new(args, 3, 3, block_size, :down, block_offset),~
    +        args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        TShape.new(args, 3, 3, block_size, :down, block_offset),
    -** Processing line: ~        TShape.new(args, 0, 3, block_size, :right, block_offset),~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        TShape.new(args, 0, 3, block_size, :right, block_offset),
    -** Processing line: ~        TShape.new(args, 0, 11, block_size, :up, block_offset)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        TShape.new(args, 0, 11, block_size, :up, block_offset)
    -** Processing line: ~      ]~
    +
    +** Processing line: ~    def process_audio_queue args~
     - Inside source: true
     *** True Line Result
    -      ]
    +    def process_audio_queue args
    +** Processing line: ~      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }~
    +- Inside source: true
    +*** True Line Result
    +      to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }
    +** Processing line: ~      args.state.audio_queue -= to_queue~
    +- Inside source: true
    +*** True Line Result
    +      args.state.audio_queue -= to_queue
    +** Processing line: ~      to_queue.each { |a| args.audio[a[:id]] = a }~
    +- Inside source: true
    +*** True Line Result
    +      to_queue.each { |a| args.audio[a[:id]] = a }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.state.lines ||= [~
    +** Processing line: ~      args.audio.find_all { |k, v| v[:decay_rate] }~
     - Inside source: true
     *** True Line Result
    -      args.state.lines ||= [
    -** Processing line: ~        Line.new(args,3, 8, block_size, :down, block_offset),~
    +      args.audio.find_all { |k, v| v[:decay_rate] }
    +** Processing line: ~        .each     { |k, v| v[:gain] -= v[:decay_rate] }~
     - Inside source: true
     *** True Line Result
    -        Line.new(args,3, 8, block_size, :down, block_offset),
    -** Processing line: ~        Line.new(args, 7, 3, block_size, :up, block_offset),~
    +        .each     { |k, v| v[:gain] -= v[:decay_rate] }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        Line.new(args, 7, 3, block_size, :up, block_offset),
    -** Processing line: ~        Line.new(args, 3, 7, block_size, :right, block_offset)~
    +
    +** Processing line: ~      sounds_to_stop = args.audio~
     - Inside source: true
     *** True Line Result
    -        Line.new(args, 3, 7, block_size, :right, block_offset)
    -** Processing line: ~      ]~
    +      sounds_to_stop = args.audio
    +** Processing line: ~                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }~
     - Inside source: true
     *** True Line Result
    -      ]
    +                         .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }
    +** Processing line: ~                         .map { |k, v| k }~
    +- Inside source: true
    +*** True Line Result
    +                         .map { |k, v| k }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #exit()~
    +** Processing line: ~      sounds_to_stop.each { |k| args.audio.delete k }~
     - Inside source: true
     *** True Line Result
    -      #exit()
    +      sounds_to_stop.each { |k| args.audio.delete k }
     ** 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 init_balls args~
    +** Processing line: ~  begin # region: button definitions, ui layout, callback functions~
     - Inside source: true
     *** True Line Result
    -    def init_balls args
    -** Processing line: ~      return unless args.state.num_balls < BALL_COUNT~
    +  begin # region: button definitions, ui layout, callback functions
    +** Processing line: ~    def button args, opts~
     - Inside source: true
     *** True Line Result
    -      return unless args.state.num_balls < BALL_COUNT
    +    def button args, opts
    +** Processing line: ~      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))~
    +- Inside source: true
    +*** True Line Result
    +      button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0~
    +- Inside source: true
    +*** True Line Result
    +      button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #only create a new ball every 10 ticks~
    +** Processing line: ~      label_offset_x = 5~
     - Inside source: true
     *** True Line Result
    -      #only create a new ball every 10 ticks
    -** Processing line: ~      return unless args.state.ball_created_at.elapsed_time > 10~
    +      label_offset_x = 5
    +** Processing line: ~      label_offset_y = 30~
     - Inside source: true
     *** True Line Result
    -      return unless args.state.ball_created_at.elapsed_time > 10
    +      label_offset_y = 30
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if (args.state.num_balls == 0)~
    +** Processing line: ~      button_def[:label]  = button_def[:rect].merge text: opts[:text],~
     - Inside source: true
     *** True Line Result
    -      if (args.state.num_balls == 0)
    -** Processing line: ~        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))~
    +      button_def[:label]  = button_def[:rect].merge text: opts[:text],
    +** Processing line: ~                                                    size_enum: -2.5,~
     - Inside source: true
     *** True Line Result
    -        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, nil, nil))
    -** Processing line: ~        args.state.ballParents = [args.state.balls[0]]~
    +                                                    size_enum: -2.5,
    +** Processing line: ~                                                    x: button_def[:rect].x + label_offset_x,~
     - Inside source: true
     *** True Line Result
    -        args.state.ballParents = [args.state.balls[0]]
    -** Processing line: ~      else~
    +                                                    x: button_def[:rect].x + label_offset_x,
    +** Processing line: ~                                                    y: button_def[:rect].y + label_offset_y~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )~
    +                                                    y: button_def[:rect].y + label_offset_y
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        args.state.balls.append(Ball.new(args,args.state.num_balls,BALL_COUNT-1, args.state.balls.last, nil) )
    -** Processing line: ~        args.state.balls[-2].child = args.state.balls[-1]~
    +
    +** Processing line: ~      button_def~
     - Inside source: true
     *** True Line Result
    -        args.state.balls[-2].child = args.state.balls[-1]
    -** Processing line: ~      end~
    +      button_def
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      args.state.ball_created_at = args.state.tick_count~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.ball_created_at = args.state.tick_count
    -** Processing line: ~      args.state.num_balls += 1~
    +
    +** Processing line: ~    def play_sine_wave args, sender~
     - Inside source: true
     *** True Line Result
    -      args.state.num_balls += 1
    +    def play_sine_wave args, sender
    +** Processing line: ~      queue_sine_wave args,~
    +- Inside source: true
    +*** True Line Result
    +      queue_sine_wave args,
    +** Processing line: ~                      frequency: sender[:frequency],~
    +- Inside source: true
    +*** True Line Result
    +                      frequency: sender[:frequency],
    +** Processing line: ~                      duration: 1.seconds,~
    +- Inside source: true
    +*** True Line Result
    +                      duration: 1.seconds,
    +** Processing line: ~                      fade_out: true~
    +- Inside source: true
    +*** True Line Result
    +                      fade_out: true
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~  end~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  end
    +
    +** Processing line: ~    def play_note args, sender~
    +- Inside source: true
    +*** True Line Result
    +    def play_note args, sender
    +** Processing line: ~      method_to_call = :queue_sine_wave~
    +- Inside source: true
    +*** True Line Result
    +      method_to_call = :queue_sine_wave
    +** Processing line: ~      method_to_call = :queue_square_wave    if sender[:type] == :square~
    +- Inside source: true
    +*** True Line Result
    +      method_to_call = :queue_square_wave    if sender[:type] == :square
    +** Processing line: ~      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth~
    +- Inside source: true
    +*** True Line Result
    +      method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth
    +** Processing line: ~      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle~
    +- Inside source: true
    +*** True Line Result
    +      method_to_call = :queue_triangle_wave  if sender[:type] == :triangle
    +** Processing line: ~      method_to_call = :queue_bell           if sender[:type] == :bell~
    +- Inside source: true
    +*** True Line Result
    +      method_to_call = :queue_bell           if sender[:type] == :bell
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  #Render loop~
    +** Processing line: ~      send method_to_call, args,~
     - Inside source: true
     *** True Line Result
    -  #Render loop
    -** Processing line: ~  def render args~
    +      send method_to_call, args,
    +** Processing line: ~           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    bgClr = {r:10, g:10, b:200}~
    +           frequency: (frequency_for note: sender[:note], octave: sender[:octave]),
    +** Processing line: ~           duration: 1.seconds,~
     - Inside source: true
     *** True Line Result
    -    bgClr = {r:10, g:10, b:200}
    -** Processing line: ~    bgClr = {r:255-30, g:255-30, b:255-30}~
    +           duration: 1.seconds,
    +** Processing line: ~           fade_out: true~
     - Inside source: true
     *** True Line Result
    -    bgClr = {r:255-30, g:255-30, b:255-30}
    +           fade_out: true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];~
    +** Processing line: ~    def frequency_buttons args~
    +- Inside source: true
    +*** True Line Result
    +    def frequency_buttons args
    +** Processing line: ~      [~
    +- Inside source: true
    +*** True Line Result
    +      [
    +** Processing line: ~        (button args,~
    +- Inside source: true
    +*** True Line Result
    +        (button args,
    +** Processing line: ~                row: 4.0, col: 0, text: "300hz",~
    +- Inside source: true
    +*** True Line Result
    +                row: 4.0, col: 0, text: "300hz",
    +** Processing line: ~                frequency: 300,~
    +- Inside source: true
    +*** True Line Result
    +                frequency: 300,
    +** Processing line: ~                method_to_call: :play_sine_wave),~
    +- Inside source: true
    +*** True Line Result
    +                method_to_call: :play_sine_wave),
    +** Processing line: ~        (button args,~
    +- Inside source: true
    +*** True Line Result
    +        (button args,
    +** Processing line: ~                row: 5.0, col: 0, text: "400hz",~
    +- Inside source: true
    +*** True Line Result
    +                row: 5.0, col: 0, text: "400hz",
    +** Processing line: ~                frequency: 400,~
    +- Inside source: true
    +*** True Line Result
    +                frequency: 400,
    +** Processing line: ~                method_to_call: :play_sine_wave),~
    +- Inside source: true
    +*** True Line Result
    +                method_to_call: :play_sine_wave),
    +** Processing line: ~        (button args,~
    +- Inside source: true
    +*** True Line Result
    +        (button args,
    +** Processing line: ~                row: 6.0, col: 0, text: "500hz",~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [0, 0, $args.grid.right, $args.grid.top, bgClr[:r], bgClr[:g], bgClr[:b]];
    -** Processing line: ~    args.outputs.borders << args.state.game_area~
    +                row: 6.0, col: 0, text: "500hz",
    +** Processing line: ~                frequency: 500,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.game_area
    -** Processing line: ~~
    +                frequency: 500,
    +** Processing line: ~                method_to_call: :play_sine_wave),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    render_instructions args~
    +                method_to_call: :play_sine_wave),
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -    render_instructions args
    -** Processing line: ~    render_shapes args~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    render_shapes args
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    render_balls args~
    +** Processing line: ~    def sine_wave_note_buttons args~
     - Inside source: true
     *** True Line Result
    -    render_balls args
    -** Processing line: ~~
    +    def sine_wave_note_buttons args
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #args.state.rectangle.draw args~
    +      [
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    #args.state.rectangle.draw args
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 1.5, col: 2, text: "Sine C4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]~
    +                row: 1.5, col: 2, text: "Sine C4",
    +** Processing line: ~                note: :c, octave: 4, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [$args.grid.right-(args.state.board_width + args.grid.w / 8), 0, $args.grid.right, $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    -** Processing line: ~    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]~
    +                note: :c, octave: 4, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [0, 0, (args.state.board_width + args.grid.w / 8), $args.grid.top, "sprites/square-white-2.png", 0, 255, bgClr[:r], bgClr[:g], bgClr[:b]]
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 2.5, col: 2, text: "Sine D4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  end~
    +                row: 2.5, col: 2, text: "Sine D4",
    +** Processing line: ~                note: :d, octave: 4, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                note: :d, octave: 4, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  begin :render_methods~
    +        (button args,
    +** Processing line: ~                row: 3.5, col: 2, text: "Sine E4",~
     - Inside source: true
     *** True Line Result
    -  begin :render_methods
    -** Processing line: ~    def render_instructions args~
    +                row: 3.5, col: 2, text: "Sine E4",
    +** Processing line: ~                note: :e, octave: 4, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -    def render_instructions args
    -** Processing line: ~      #gtk.current_framerate~
    +                note: :e, octave: 4, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      #gtk.current_framerate
    -** Processing line: ~      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]~
    +        (button args,
    +** Processing line: ~                row: 4.5, col: 2, text: "Sine F4",~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [20, $args.grid.top-20, "FPS: " + $gtk.current_framerate.to_s]
    -** Processing line: ~      if (args.state.balls != nil && args.state.balls[0] != nil)~
    +                row: 4.5, col: 2, text: "Sine F4",
    +** Processing line: ~                note: :f, octave: 4, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      if (args.state.balls != nil && args.state.balls[0] != nil)
    -** Processing line: ~          bx =  args.state.balls[0].velocity.x~
    +                note: :f, octave: 4, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -          bx =  args.state.balls[0].velocity.x
    -** Processing line: ~          by =  args.state.balls[0].velocity.y~
    +        (button args,
    +** Processing line: ~                row: 5.5, col: 2, text: "Sine G4",~
     - Inside source: true
     *** True Line Result
    -          by =  args.state.balls[0].velocity.y
    -** Processing line: ~          bmg = (bx**2.0 + by**2.0)**0.5~
    +                row: 5.5, col: 2, text: "Sine G4",
    +** Processing line: ~                note: :g, octave: 4, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -          bmg = (bx**2.0 + by**2.0)**0.5
    -** Processing line: ~          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]~
    +                note: :g, octave: 4, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -          args.outputs.labels << [20, $args.grid.top-20-20, "V: " + bmg.to_s ]
    -** Processing line: ~      end~
    +        (button args,
    +** Processing line: ~                row: 6.5, col: 2, text: "Sine A5",~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                row: 6.5, col: 2, text: "Sine A5",
    +** Processing line: ~                note: :a, octave: 5, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +                note: :a, octave: 5, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    end~
    +        (button args,
    +** Processing line: ~                row: 7.5, col: 2, text: "Sine B5",~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                row: 7.5, col: 2, text: "Sine B5",
    +** Processing line: ~                note: :b, octave: 5, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def render_shapes args~
    +                note: :b, octave: 5, type: :sine, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    def render_shapes args
    -** Processing line: ~      for s in args.state.squares~
    +        (button args,
    +** Processing line: ~                row: 8.5, col: 2, text: "Sine C5",~
     - Inside source: true
     *** True Line Result
    -      for s in args.state.squares
    -** Processing line: ~        s.draw args~
    +                row: 8.5, col: 2, text: "Sine C5",
    +** Processing line: ~                note: :c, octave: 5, type: :sine, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -        s.draw args
    -** Processing line: ~      end~
    +                note: :c, octave: 5, type: :sine, method_to_call: :play_note),
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -      end
    +      ]
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      for l in args.state.lines~
    +** Processing line: ~    def square_wave_note_buttons args~
     - Inside source: true
     *** True Line Result
    -      for l in args.state.lines
    -** Processing line: ~        l.draw args~
    +    def square_wave_note_buttons args
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -        l.draw args
    -** Processing line: ~      end~
    +      [
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 1.5, col: 6, text: "Square C4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      for t in args.state.tshapes~
    +                row: 1.5, col: 6, text: "Square C4",
    +** Processing line: ~                note: :c, octave: 4, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      for t in args.state.tshapes
    -** Processing line: ~        t.draw args~
    +                note: :c, octave: 4, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -        t.draw args
    -** Processing line: ~      end~
    +        (button args,
    +** Processing line: ~                row: 2.5, col: 6, text: "Square D4",~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +                row: 2.5, col: 6, text: "Square D4",
    +** Processing line: ~                note: :d, octave: 4, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +                note: :d, octave: 4, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    end~
    +        (button args,
    +** Processing line: ~                row: 3.5, col: 6, text: "Square E4",~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                row: 3.5, col: 6, text: "Square E4",
    +** Processing line: ~                note: :e, octave: 4, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def render_balls args~
    +                note: :e, octave: 4, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    def render_balls args
    -** Processing line: ~      #args.state.balls.each do |ball|~
    +        (button args,
    +** Processing line: ~                row: 4.5, col: 6, text: "Square F4",~
     - Inside source: true
     *** True Line Result
    -      #args.state.balls.each do |ball|
    -** Processing line: ~        #ball.draw args~
    +                row: 4.5, col: 6, text: "Square F4",
    +** Processing line: ~                note: :f, octave: 4, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -        #ball.draw args
    -** Processing line: ~      #end~
    +                note: :f, octave: 4, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      #end
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 5.5, col: 6, text: "Square G4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      args.outputs.sprites << args.state.balls.map do |ball|~
    +                row: 5.5, col: 6, text: "Square G4",
    +** Processing line: ~                note: :g, octave: 4, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << args.state.balls.map do |ball|
    -** Processing line: ~        ball.getDraw args~
    +                note: :g, octave: 4, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -        ball.getDraw args
    -** Processing line: ~      end~
    +        (button args,
    +** Processing line: ~                row: 6.5, col: 6, text: "Square A5",~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +                row: 6.5, col: 6, text: "Square A5",
    +** Processing line: ~                note: :a, octave: 5, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +                note: :a, octave: 5, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 7.5, col: 6, text: "Square B5",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Calls all methods necessary for performing calculations~
    +                row: 7.5, col: 6, text: "Square B5",
    +** Processing line: ~                note: :b, octave: 5, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -  #Calls all methods necessary for performing calculations
    -** Processing line: ~  def calc args~
    +                note: :b, octave: 5, type: :square, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    for b in args.state.ballParents~
    +        (button args,
    +** Processing line: ~                row: 8.5, col: 6, text: "Square C5",~
     - Inside source: true
     *** True Line Result
    -    for b in args.state.ballParents
    -** Processing line: ~      b.update args~
    +                row: 8.5, col: 6, text: "Square C5",
    +** Processing line: ~                note: :c, octave: 5, type: :square, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      b.update args
    +                note: :c, octave: 5, type: :square, method_to_call: :play_note),
    +** Processing line: ~      ]~
    +- Inside source: true
    +*** True Line Result
    +      ]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~~
    +** Processing line: ~    def saw_tooth_wave_note_buttons args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    for s in args.state.squares~
    +    def saw_tooth_wave_note_buttons args
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -    for s in args.state.squares
    -** Processing line: ~      s.update args~
    +      [
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      s.update args
    -** Processing line: ~    end~
    +        (button args,
    +** Processing line: ~                row: 1.5, col: 8, text: "Saw C4",~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                row: 1.5, col: 8, text: "Saw C4",
    +** Processing line: ~                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    for l in args.state.lines~
    +                note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    for l in args.state.lines
    -** Processing line: ~      l.update args~
    +        (button args,
    +** Processing line: ~                row: 2.5, col: 8, text: "Saw D4",~
     - Inside source: true
     *** True Line Result
    -      l.update args
    -** Processing line: ~    end~
    +                row: 2.5, col: 8, text: "Saw D4",
    +** Processing line: ~                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    for t in args.state.tshapes~
    +        (button args,
    +** Processing line: ~                row: 3.5, col: 8, text: "Saw E4",~
     - Inside source: true
     *** True Line Result
    -    for t in args.state.tshapes
    -** Processing line: ~      t.update args~
    +                row: 3.5, col: 8, text: "Saw E4",
    +** Processing line: ~                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      t.update args
    -** Processing line: ~    end~
    +                note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 4.5, col: 8, text: "Saw F4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +                row: 4.5, col: 8, text: "Saw F4",
    +** Processing line: ~                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +                note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  end~
    +        (button args,
    +** Processing line: ~                row: 5.5, col: 8, text: "Saw G4",~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                row: 5.5, col: 8, text: "Saw G4",
    +** Processing line: ~                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  begin :calc_methods~
    +                note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -  begin :calc_methods
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 6.5, col: 8, text: "Saw A5",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  end~
    +                row: 6.5, col: 8, text: "Saw A5",
    +** Processing line: ~                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +        (button args,
    +** Processing line: ~                row: 7.5, col: 8, text: "Saw B5",~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    defaults args~
    +                row: 7.5, col: 8, text: "Saw B5",
    +** Processing line: ~                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +                note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +        (button args,
    +** Processing line: ~                row: 8.5, col: 8, text: "Saw C5",~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~  end~
    +                row: 8.5, col: 8, text: "Saw C5",
    +** Processing line: ~                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +                note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +      ]
    +** Processing line: ~    end~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - paddle.rb~
    -- Header detected.
    +** Processing line: ~    def triangle_wave_note_buttons args~
    +- Inside source: true
     *** True Line Result
    -
    +    def triangle_wave_note_buttons args
    +** Processing line: ~      [~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - paddle.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +      [
    +** Processing line: ~        (button args,~
    +- Inside source: true
     *** True Line Result
    -
    +        (button args,
    +** Processing line: ~                row: 1.5, col: 10, text: "Triangle C4",~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb~
    +                row: 1.5, col: 10, text: "Triangle C4",
    +** Processing line: ~                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/paddle.rb
    -** Processing line: ~  class Paddle~
    +                note: :c, octave: 4, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -  class Paddle
    -** Processing line: ~    attr_accessor :enabled~
    +        (button args,
    +** Processing line: ~                row: 2.5, col: 10, text: "Triangle D4",~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :enabled
    -** Processing line: ~~
    +                row: 2.5, col: 10, text: "Triangle D4",
    +** Processing line: ~                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def initialize ()~
    +                note: :d, octave: 4, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    def initialize ()
    -** Processing line: ~      @x=WIDTH/2~
    +        (button args,
    +** Processing line: ~                row: 3.5, col: 10, text: "Triangle E4",~
     - Inside source: true
     *** True Line Result
    -      @x=WIDTH/2
    -** Processing line: ~      @y=100~
    +                row: 3.5, col: 10, text: "Triangle E4",
    +** Processing line: ~                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      @y=100
    -** Processing line: ~      @width=100~
    +                note: :e, octave: 4, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      @width=100
    -** Processing line: ~      @height=20~
    +        (button args,
    +** Processing line: ~                row: 4.5, col: 10, text: "Triangle F4",~
     - Inside source: true
     *** True Line Result
    -      @height=20
    -** Processing line: ~      @speed=10~
    +                row: 4.5, col: 10, text: "Triangle F4",
    +** Processing line: ~                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      @speed=10
    -** Processing line: ~~
    +                note: :f, octave: 4, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +        (button args,
    +** Processing line: ~                row: 5.5, col: 10, text: "Triangle G4",~
     - Inside source: true
     *** True Line Result
    -      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -** Processing line: ~      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    +                row: 5.5, col: 10, text: "Triangle G4",
    +** Processing line: ~                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -** Processing line: ~      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +                note: :g, octave: 4, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -** Processing line: ~      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)~
    +        (button args,
    +** Processing line: ~                row: 6.5, col: 10, text: "Triangle A5",~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    -** Processing line: ~~
    +                row: 6.5, col: 10, text: "Triangle A5",
    +** Processing line: ~                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      @enabled = true~
    +                note: :a, octave: 5, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      @enabled = true
    -** Processing line: ~    end~
    +        (button args,
    +** Processing line: ~                row: 7.5, col: 10, text: "Triangle B5",~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                row: 7.5, col: 10, text: "Triangle B5",
    +** Processing line: ~                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def update args~
    +                note: :b, octave: 5, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -    def update args
    -** Processing line: ~      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +        (button args,
    +** Processing line: ~                row: 8.5, col: 10, text: "Triangle C5",~
     - Inside source: true
     *** True Line Result
    -      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -** Processing line: ~      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})~
    +                row: 8.5, col: 10, text: "Triangle C5",
    +** Processing line: ~                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    -** Processing line: ~      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +                note: :c, octave: 5, type: :triangle, method_to_call: :play_note),
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -** Processing line: ~      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @xyCollision.update  args~
    +** Processing line: ~    def bell_buttons args~
     - Inside source: true
     *** True Line Result
    -      @xyCollision.update  args
    -** Processing line: ~      @xyCollision2.update args~
    +    def bell_buttons args
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2.update args
    -** Processing line: ~      @xyCollision3.update args~
    +      [
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3.update args
    -** Processing line: ~      @xyCollision4.update args~
    +        (button args,
    +** Processing line: ~                row: 1.5, col: 4, text: "Bell C4",~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4.update args
    -** Processing line: ~~
    +                row: 1.5, col: 4, text: "Bell C4",
    +** Processing line: ~                note: :c, octave: 4, type: :bell, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      args.inputs.keyboard.key_held.left  ||= false~
    +                note: :c, octave: 4, type: :bell, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      args.inputs.keyboard.key_held.left  ||= false
    -** Processing line: ~      args.inputs.keyboard.key_held.right  ||= false~
    +        (button args,
    +** Processing line: ~                row: 2.5, col: 4, text: "Bell D4",~
     - Inside source: true
     *** True Line Result
    -      args.inputs.keyboard.key_held.right  ||= false
    -** Processing line: ~~
    +                row: 2.5, col: 4, text: "Bell D4",
    +** Processing line: ~                note: :d, octave: 4, type: :bell, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)~
    +                note: :d, octave: 4, type: :bell, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    -** Processing line: ~        if args.inputs.keyboard.key_held.left && @enabled~
    +        (button args,
    +** Processing line: ~                row: 3.5, col: 4, text: "Bell E4",~
     - Inside source: true
     *** True Line Result
    -        if args.inputs.keyboard.key_held.left && @enabled
    -** Processing line: ~          @x-=@speed~
    +                row: 3.5, col: 4, text: "Bell E4",
    +** Processing line: ~                note: :e, octave: 4, type: :bell, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -          @x-=@speed
    -** Processing line: ~        elsif args.inputs.keyboard.key_held.right && @enabled~
    +                note: :e, octave: 4, type: :bell, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -        elsif args.inputs.keyboard.key_held.right && @enabled
    -** Processing line: ~          @x+=@speed~
    +        (button args,
    +** Processing line: ~                row: 4.5, col: 4, text: "Bell F4",~
     - Inside source: true
     *** True Line Result
    -          @x+=@speed
    -** Processing line: ~        end~
    +                row: 4.5, col: 4, text: "Bell F4",
    +** Processing line: ~                note: :f, octave: 4, type: :bell, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +                note: :f, octave: 4, type: :bell, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +        (button args,
    +** Processing line: ~                row: 5.5, col: 4, text: "Bell G4",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      xmin =WIDTH/4~
    +                row: 5.5, col: 4, text: "Bell G4",
    +** Processing line: ~                note: :g, octave: 4, type: :bell, method_to_call: :play_note),~
     - Inside source: true
     *** True Line Result
    -      xmin =WIDTH/4
    -** Processing line: ~      xmax = 3*(WIDTH/4)~
    +                note: :g, octave: 4, type: :bell, method_to_call: :play_note),
    +** Processing line: ~        (button args,~
     - Inside source: true
     *** True Line Result
    -      xmax = 3*(WIDTH/4)
    -** Processing line: ~      @x = (@x+@width > xmax) ? xmax-@width : (@x xmax) ? xmax-@width : (@x= 0~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[1],@points[2], :neg))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[2],@points[3], :neg))~
    +          if v >= 0
    +** Processing line: ~            1.0~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[2],@points[3], :neg))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[3],@points[4], :neg))~
    +            1.0
    +** Processing line: ~          else~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[3],@points[4], :neg))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[4],@points[5], :pos))~
    +          else
    +** Processing line: ~            -1.0~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[4],@points[5], :pos))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[5],@points[6], :pos))~
    +            -1.0
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[5],@points[6], :pos))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[6],@points[7], :pos))~
    +          end
    +** Processing line: ~        end.to_a~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[6],@points[7], :pos))
    -** Processing line: ~      @colliders.append(LinearCollider.new(@points[0],@points[7], :pos))~
    +        end.to_a
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      @colliders.append(LinearCollider.new(@points[0],@points[7], :pos))
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    +** Processing line: ~      def defaults_queue_square_wave~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      def defaults_queue_square_wave
    +** Processing line: ~        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def update args~
    +        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    def update args
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      for b in args.state.balls~
    +** Processing line: ~      def queue_square_wave args, opts = {}~
     - Inside source: true
     *** True Line Result
    -      for b in args.state.balls
    -** Processing line: ~        if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)~
    +      def queue_square_wave args, opts = {}
    +** Processing line: ~        opts        = defaults_queue_square_wave.merge opts~
     - Inside source: true
     *** True Line Result
    -        if [b.x, b.y, b.width, b.height].intersect_rect?(@bold)
    -** Processing line: ~          for c in @colliders~
    +        opts        = defaults_queue_square_wave.merge opts
    +** Processing line: ~        frequency   = opts[:frequency]~
     - Inside source: true
     *** True Line Result
    -          for c in @colliders
    -** Processing line: ~            if c.collision?(args, b.getPoints(args),b)~
    +        frequency   = opts[:frequency]
    +** Processing line: ~        sample_rate = 48000~
     - Inside source: true
     *** True Line Result
    -            if c.collision?(args, b.getPoints(args),b)
    -** Processing line: ~              c.collide args, b~
    +        sample_rate = 48000
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              c.collide args, b
    -** Processing line: ~            end~
    +
    +** Processing line: ~        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~          end~
    +        square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate
    +** Processing line: ~        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +        args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~        proc = lambda do~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +        proc = lambda do
    +** Processing line: ~          generate_audio_data args.state.square_waves[frequency], sample_rate~
     - Inside source: true
     *** True Line Result
    -    end
    +          generate_audio_data args.state.square_waves[frequency], sample_rate
    +** Processing line: ~        end~
    +- Inside source: true
    +*** True Line Result
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def draw args~
    +** Processing line: ~        audio_state = new_audio_state args, opts~
     - Inside source: true
     *** True Line Result
    -    def draw args
    -** Processing line: ~      args.outputs.sprites << [~
    +        audio_state = new_audio_state args, opts
    +** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << [
    -** Processing line: ~        @x,                                       # X~
    +        audio_state[:input] = [1, sample_rate, proc]
    +** Processing line: ~        queue_audio args, audio_state: audio_state, wave: square_wave~
     - Inside source: true
     *** True Line Result
    -        @x,                                       # X
    -** Processing line: ~        @y,                                       # Y~
    +        queue_audio args, audio_state: audio_state, wave: square_wave
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        @y,                                       # Y
    -** Processing line: ~        @width,                                   # W~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        @width,                                   # W
    -** Processing line: ~        @height,                                  # H~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        @height,                                  # H
    -** Processing line: ~        @image,                                   # PATH~
    +
    +** Processing line: ~    begin # region: saw tooth wave~
     - Inside source: true
     *** True Line Result
    -        @image,                                   # PATH
    -** Processing line: ~        0,                                        # ANGLE~
    +    begin # region: saw tooth wave
    +** Processing line: ~      def defaults_saw_tooth_wave_for~
     - Inside source: true
     *** True Line Result
    -        0,                                        # ANGLE
    -** Processing line: ~        255,                                      # ALPHA~
    +      def defaults_saw_tooth_wave_for
    +** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
     - Inside source: true
     *** True Line Result
    -        255,                                      # ALPHA
    -** Processing line: ~        219,                                      # RED_SATURATION~
    +        { frequency: 440, sample_rate: 48000 }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        219,                                      # RED_SATURATION
    -** Processing line: ~        112,                                      # GREEN_SATURATION~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        112,                                      # GREEN_SATURATION
    -** Processing line: ~        147                                       # BLUE_SATURATION~
    +
    +** Processing line: ~      def saw_tooth_wave_for opts = {}~
     - Inside source: true
     *** True Line Result
    -        147                                       # BLUE_SATURATION
    -** Processing line: ~      ]~
    +      def saw_tooth_wave_for opts = {}
    +** Processing line: ~        opts = defaults_saw_tooth_wave_for.merge opts~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~      #args.outputs.sprites << [@x, @y, @width, @height, "sprites/roundSquare_small_black.png"]~
    +        opts = defaults_saw_tooth_wave_for.merge opts
    +** Processing line: ~        sine_wave = sine_wave_for opts~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.sprites << [@x, @y, @width, @height, "sprites/roundSquare_small_black.png"]
    -** Processing line: ~    end~
    +        sine_wave = sine_wave_for opts
    +** Processing line: ~        period_size = sine_wave.length~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        period_size = sine_wave.length
    +** Processing line: ~        sine_wave.map_with_index do |v, i|~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def serialize~
    +        sine_wave.map_with_index do |v, i|
    +** Processing line: ~          (((i % period_size).fdiv period_size) * 2) - 1~
     - Inside source: true
     *** True Line Result
    -    def serialize
    -** Processing line: ~    	{x: @x, y:@y}~
    +          (((i % period_size).fdiv period_size) * 2) - 1
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    	{x: @x, y:@y}
    -** Processing line: ~    end~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def inspect~
    +** Processing line: ~      def defaults_queue_saw_tooth_wave~
     - Inside source: true
     *** True Line Result
    -    def inspect
    -** Processing line: ~    	serialize.to_s~
    +      def defaults_queue_saw_tooth_wave
    +** Processing line: ~        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -    	serialize.to_s
    -** Processing line: ~    end~
    +        { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def to_s~
    +** Processing line: ~      def queue_saw_tooth_wave args, opts = {}~
     - Inside source: true
     *** True Line Result
    -    def to_s
    -** Processing line: ~    	serialize.to_s~
    +      def queue_saw_tooth_wave args, opts = {}
    +** Processing line: ~        opts        = defaults_queue_saw_tooth_wave.merge opts~
     - Inside source: true
     *** True Line Result
    -    	serialize.to_s
    -** Processing line: ~    end~
    +        opts        = defaults_queue_saw_tooth_wave.merge opts
    +** Processing line: ~        frequency   = opts[:frequency]~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +        frequency   = opts[:frequency]
    +** Processing line: ~        sample_rate = 48000~
     - Inside source: true
     *** True Line Result
    -  end
    +        sample_rate = 48000
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +** Processing line: ~        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    +        saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +** Processing line: ~        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - square_collider.rb~
    -- Header detected.
    +        args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~        proc = lambda do~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - square_collider.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    -*** True Line Result
    -
    +        proc = lambda do
    +** Processing line: ~          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/square_collider.rb~
    +          generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/square_collider.rb
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class SquareCollider~
    -- Inside source: true
    -*** True Line Result
    -  class SquareCollider
    -** Processing line: ~    def initialize x,y,direction,size=COLLISIONWIDTH~
    +** Processing line: ~        audio_state = new_audio_state args, opts~
     - Inside source: true
     *** True Line Result
    -    def initialize x,y,direction,size=COLLISIONWIDTH
    -** Processing line: ~      @x = x~
    +        audio_state = new_audio_state args, opts
    +** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
     - Inside source: true
     *** True Line Result
    -      @x = x
    -** Processing line: ~      @y = y~
    +        audio_state[:input] = [1, sample_rate, proc]
    +** Processing line: ~        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave~
     - Inside source: true
     *** True Line Result
    -      @y = y
    -** Processing line: ~      @size = size~
    +        queue_audio args, audio_state: audio_state, wave: saw_tooth_wave
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      @size = size
    -** Processing line: ~      @direction = direction~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      @direction = direction
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    +** Processing line: ~    begin # region: triangle wave~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    def collision? args, ball~
    +    begin # region: triangle wave
    +** Processing line: ~      def defaults_triangle_wave_for~
     - Inside source: true
     *** True Line Result
    -    def collision? args, ball
    -** Processing line: ~      #args.outputs.solids <<  [@x, @y, @size, @size,     000, 255, 255]~
    +      def defaults_triangle_wave_for
    +** Processing line: ~        { frequency: 440, sample_rate: 48000 }~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.solids <<  [@x, @y, @size, @size,     000, 255, 255]
    +        { frequency: 440, sample_rate: 48000 }
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~      def triangle_wave_for opts = {}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      return [@x,@y,@size,@size].intersect_rect?([ball.x,ball.y,ball.width,ball.height])~
    +      def triangle_wave_for opts = {}
    +** Processing line: ~        opts = defaults_saw_tooth_wave_for.merge opts~
     - Inside source: true
     *** True Line Result
    -      return [@x,@y,@size,@size].intersect_rect?([ball.x,ball.y,ball.width,ball.height])
    -** Processing line: ~    end~
    +        opts = defaults_saw_tooth_wave_for.merge opts
    +** Processing line: ~        sine_wave = sine_wave_for opts~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        sine_wave = sine_wave_for opts
    +** Processing line: ~        period_size = sine_wave.length~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def collide args, ball~
    +        period_size = sine_wave.length
    +** Processing line: ~        sine_wave.map_with_index do |v, i|~
     - Inside source: true
     *** True Line Result
    -    def collide args, ball
    -** Processing line: ~      vmag = (ball.velocity.x**2.0 +ball.velocity.y**2.0)**0.5~
    +        sine_wave.map_with_index do |v, i|
    +** Processing line: ~          ratio = (i.fdiv period_size)~
     - Inside source: true
     *** True Line Result
    -      vmag = (ball.velocity.x**2.0 +ball.velocity.y**2.0)**0.5
    -** Processing line: ~      a = ((2.0**0.5)*vmag)/2.0~
    +          ratio = (i.fdiv period_size)
    +** Processing line: ~          if ratio <= 0.5~
     - Inside source: true
     *** True Line Result
    -      a = ((2.0**0.5)*vmag)/2.0
    -** Processing line: ~      if vmag < MAX_VELOCITY~
    +          if ratio <= 0.5
    +** Processing line: ~            (ratio * 4) - 1~
     - Inside source: true
     *** True Line Result
    -      if vmag < MAX_VELOCITY
    -** Processing line: ~        ball.velocity.x = (a) * @direction.x * 1.1~
    +            (ratio * 4) - 1
    +** Processing line: ~          else~
     - Inside source: true
     *** True Line Result
    -        ball.velocity.x = (a) * @direction.x * 1.1
    -** Processing line: ~        ball.velocity.y = (a) * @direction.y * 1.1~
    +          else
    +** Processing line: ~            ratio -= 0.5~
     - Inside source: true
     *** True Line Result
    -        ball.velocity.y = (a) * @direction.y * 1.1
    -** Processing line: ~      else~
    +            ratio -= 0.5
    +** Processing line: ~            1 - (ratio * 4)~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        ball.velocity.x = (a) * @direction.x~
    +            1 - (ratio * 4)
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -        ball.velocity.x = (a) * @direction.x
    -** Processing line: ~        ball.velocity.y = (a) * @direction.y~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        ball.velocity.y = (a) * @direction.y
    +        end
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -37780,122 +46155,106 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    +** Processing line: ~      def defaults_queue_triangle_wave~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      def defaults_queue_triangle_wave
    +** Processing line: ~        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +      end
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Arbitrary Collision - vector2d.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Arbitrary Collision - vector2d.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~      def queue_triangle_wave args, opts = {}~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/vector2d.rb~
    +      def queue_triangle_wave args, opts = {}
    +** Processing line: ~        opts        = defaults_queue_triangle_wave.merge opts~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/09_arbitrary_collision/app/vector2d.rb
    -** Processing line: ~  class Vector2d~
    +        opts        = defaults_queue_triangle_wave.merge opts
    +** Processing line: ~        frequency   = opts[:frequency]~
     - Inside source: true
     *** True Line Result
    -  class Vector2d
    -** Processing line: ~      attr_accessor :x, :y~
    +        frequency   = opts[:frequency]
    +** Processing line: ~        sample_rate = 48000~
     - Inside source: true
     *** True Line Result
    -      attr_accessor :x, :y
    +        sample_rate = 48000
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      def initialize x=0, y=0~
    -- Inside source: true
    -*** True Line Result
    -      def initialize x=0, y=0
    -** Processing line: ~        @x=x~
    -- Inside source: true
    -*** True Line Result
    -        @x=x
    -** Processing line: ~        @y=y~
    +** Processing line: ~        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate~
     - Inside source: true
     *** True Line Result
    -        @y=y
    -** Processing line: ~      end~
    +        triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate
    +** Processing line: ~        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate~
     - Inside source: true
     *** True Line Result
    -      end
    +        args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a vector multiplied by scalar x~
    +** Processing line: ~        proc = lambda do~
     - Inside source: true
     *** True Line Result
    -      #returns a vector multiplied by scalar x
    -** Processing line: ~      #x [float] scalar~
    +        proc = lambda do
    +** Processing line: ~          generate_audio_data args.state.triangle_waves[frequency], sample_rate~
     - Inside source: true
     *** True Line Result
    -      #x [float] scalar
    -** Processing line: ~      def mult x~
    +          generate_audio_data args.state.triangle_waves[frequency], sample_rate
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      def mult x
    -** Processing line: ~        r = Vector2d.new(0,0)~
    +        end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        r = Vector2d.new(0,0)
    -** Processing line: ~        r.x=@x*x~
    +
    +** Processing line: ~        audio_state = new_audio_state args, opts~
     - Inside source: true
     *** True Line Result
    -        r.x=@x*x
    -** Processing line: ~        r.y=@y*x~
    +        audio_state = new_audio_state args, opts
    +** Processing line: ~        audio_state[:input] = [1, sample_rate, proc]~
     - Inside source: true
     *** True Line Result
    -        r.y=@y*x
    -** Processing line: ~        r~
    +        audio_state[:input] = [1, sample_rate, proc]
    +** Processing line: ~        queue_audio args, audio_state: audio_state, wave: triangle_wave~
     - Inside source: true
     *** True Line Result
    -        r
    +        queue_audio args, audio_state: audio_state, wave: triangle_wave
     ** 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: ~      # vect [Vector2d] vector to copy~
    +** Processing line: ~    begin # region: bell~
     - Inside source: true
     *** True Line Result
    -      # vect [Vector2d] vector to copy
    -** Processing line: ~      def copy vect~
    +    begin # region: bell
    +** Processing line: ~      def defaults_queue_bell~
     - Inside source: true
     *** True Line Result
    -      def copy vect
    -** Processing line: ~        Vector2d.new(@x, @y)~
    +      def defaults_queue_bell
    +** Processing line: ~        { frequency: 440, duration: 1.seconds, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x, @y)
    +        { frequency: 440, duration: 1.seconds, queue_in: 0 }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -37904,22 +46263,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a new vector equivalent to this+vect~
    -- Inside source: true
    -*** True Line Result
    -      #returns a new vector equivalent to this+vect
    -** Processing line: ~      #vect [Vector2d] vector to add to self~
    -- Inside source: true
    -*** True Line Result
    -      #vect [Vector2d] vector to add to self
    -** Processing line: ~      def add vect~
    +** Processing line: ~      def queue_bell args, opts = {}~
     - Inside source: true
     *** True Line Result
    -      def add vect
    -** Processing line: ~        Vector2d.new(@x+vect.x,@y+vect.y)~
    +      def queue_bell args, opts = {}
    +** Processing line: ~        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x+vect.x,@y+vect.y)
    +        (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -37928,42 +46279,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a new vector equivalent to this-vect~
    +** Processing line: ~      def bell_harmonics~
     - Inside source: true
     *** True Line Result
    -      #returns a new vector equivalent to this-vect
    -** Processing line: ~      #vect [Vector2d] vector to subtract to self~
    +      def bell_harmonics
    +** Processing line: ~        [~
     - Inside source: true
     *** True Line Result
    -      #vect [Vector2d] vector to subtract to self
    -** Processing line: ~      def sub vect~
    +        [
    +** Processing line: ~          { frequency_ratio: 0.5, duration_ratio: 1.00 },~
     - Inside source: true
     *** True Line Result
    -      def sub vect
    -** Processing line: ~        Vector2d.new(@x-vect.c, @y-vect.y)~
    +          { frequency_ratio: 0.5, duration_ratio: 1.00 },
    +** Processing line: ~          { frequency_ratio: 1.0, duration_ratio: 0.80 },~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x-vect.c, @y-vect.y)
    -** Processing line: ~      end~
    +          { frequency_ratio: 1.0, duration_ratio: 0.80 },
    +** Processing line: ~          { frequency_ratio: 2.0, duration_ratio: 0.60 },~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          { frequency_ratio: 2.0, duration_ratio: 0.60 },
    +** Processing line: ~          { frequency_ratio: 3.0, duration_ratio: 0.40 },~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #return the magnitude of the vector~
    +          { frequency_ratio: 3.0, duration_ratio: 0.40 },
    +** Processing line: ~          { frequency_ratio: 4.2, duration_ratio: 0.25 },~
     - Inside source: true
     *** True Line Result
    -      #return the magnitude of the vector
    -** Processing line: ~      def mag~
    +          { frequency_ratio: 4.2, duration_ratio: 0.25 },
    +** Processing line: ~          { frequency_ratio: 5.4, duration_ratio: 0.20 },~
     - Inside source: true
     *** True Line Result
    -      def mag
    -** Processing line: ~        ((@x**2)+(@y**2))**0.5~
    +          { frequency_ratio: 5.4, duration_ratio: 0.20 },
    +** Processing line: ~          { frequency_ratio: 6.8, duration_ratio: 0.15 }~
     - Inside source: true
     *** True Line Result
    -        ((@x**2)+(@y**2))**0.5
    +          { frequency_ratio: 6.8, duration_ratio: 0.15 }
    +** Processing line: ~        ]~
    +- Inside source: true
    +*** True Line Result
    +        ]
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -37972,18 +46327,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #returns a new normalize version of the vector~
    -- Inside source: true
    -*** True Line Result
    -      #returns a new normalize version of the vector
    -** Processing line: ~      def normalize~
    +** Processing line: ~      def defaults_bell_to_sine_waves~
     - Inside source: true
     *** True Line Result
    -      def normalize
    -** Processing line: ~        Vector2d.new(@x/mag, @y/mag)~
    +      def defaults_bell_to_sine_waves
    +** Processing line: ~        { frequency: 440, duration: 1.seconds, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -        Vector2d.new(@x/mag, @y/mag)
    +        { frequency: 440, duration: 1.seconds, queue_in: 0 }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -37992,458 +46343,446 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #TODO delet?~
    +** Processing line: ~      def bell_to_sine_waves opts = {}~
     - Inside source: true
     *** True Line Result
    -      #TODO delet?
    -** Processing line: ~      def distABS vect~
    +      def bell_to_sine_waves opts = {}
    +** Processing line: ~        opts = defaults_bell_to_sine_waves.merge opts~
     - Inside source: true
     *** True Line Result
    -      def distABS vect
    -** Processing line: ~        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()~
    +        opts = defaults_bell_to_sine_waves.merge opts
    +** Processing line: ~        bell_harmonics.map do |b|~
     - Inside source: true
     *** True Line Result
    -        (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
    -** Processing line: ~      end~
    +        bell_harmonics.map do |b|
    +** Processing line: ~          {~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +          {
    +** Processing line: ~            frequency: opts[:frequency] * b[:frequency_ratio],~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Collision With Object Removal - ball.rb~
    -- Header detected.
    +            frequency: opts[:frequency] * b[:frequency_ratio],
    +** Processing line: ~            duration:  opts[:duration] * b[:duration_ratio],~
    +- Inside source: true
     *** True Line Result
    -
    +            duration:  opts[:duration] * b[:duration_ratio],
    +** Processing line: ~            queue_in:  opts[:queue_in],~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Collision With Object Removal - ball.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +            queue_in:  opts[:queue_in],
    +** Processing line: ~            gain:      (1.fdiv bell_harmonics.length),~
    +- Inside source: true
     *** True Line Result
    -
    +            gain:      (1.fdiv bell_harmonics.length),
    +** Processing line: ~            fade_out:  true~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/ball.rb~
    +            fade_out:  true
    +** Processing line: ~          }~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/ball.rb
    -** Processing line: ~  class Ball~
    +          }
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  class Ball
    -** Processing line: ~    #TODO limit accessors?~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    #TODO limit accessors?
    -** Processing line: ~    attr_accessor :xy, :width, :height, :velocity~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :xy, :width, :height, :velocity
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~~
    +** Processing line: ~    begin # audio entity construction~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #@xy [Vector2d] x,y position~
    +    begin # audio entity construction
    +** Processing line: ~      def generate_audio_data sine_wave, sample_rate~
     - Inside source: true
     *** True Line Result
    -    #@xy [Vector2d] x,y position
    -** Processing line: ~    #@velocity [Vector2d] velocity of ball~
    +      def generate_audio_data sine_wave, sample_rate
    +** Processing line: ~        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil~
     - Inside source: true
     *** True Line Result
    -    #@velocity [Vector2d] velocity of ball
    -** Processing line: ~    def initialize~
    +        sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil
    +** Processing line: ~        copy_count  = (sample_size.fdiv sine_wave.length).ceil~
     - Inside source: true
     *** True Line Result
    -    def initialize
    -** Processing line: ~      @xy = Vector2d.new(WIDTH/2,500)~
    +        copy_count  = (sample_size.fdiv sine_wave.length).ceil
    +** Processing line: ~        sine_wave * copy_count~
     - Inside source: true
     *** True Line Result
    -      @xy = Vector2d.new(WIDTH/2,500)
    -** Processing line: ~      @velocity = Vector2d.new(4,-4)~
    +        sine_wave * copy_count
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      @velocity = Vector2d.new(4,-4)
    -** Processing line: ~      @width =  20~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @width =  20
    -** Processing line: ~      @height = 20~
    +
    +** Processing line: ~      def defaults_new_audio_state~
     - Inside source: true
     *** True Line Result
    -      @height = 20
    -** Processing line: ~    end~
    +      def defaults_new_audio_state
    +** Processing line: ~        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~
     - Inside source: true
     *** True Line Result
    -    end
    +        { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #move the ball according to its velocity~
    +** Processing line: ~      def new_audio_state args, opts = {}~
     - Inside source: true
     *** True Line Result
    -    #move the ball according to its velocity
    -** Processing line: ~    def update args~
    +      def new_audio_state args, opts = {}
    +** Processing line: ~        opts        = defaults_new_audio_state.merge opts~
     - Inside source: true
     *** True Line Result
    -    def update args
    -** Processing line: ~      @xy.x+=@velocity.x~
    +        opts        = defaults_new_audio_state.merge opts
    +** Processing line: ~        decay_rate  = 0~
     - Inside source: true
     *** True Line Result
    -      @xy.x+=@velocity.x
    -** Processing line: ~      @xy.y+=@velocity.y~
    +        decay_rate  = 0
    +** Processing line: ~        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]~
     - Inside source: true
     *** True Line Result
    -      @xy.y+=@velocity.y
    -** Processing line: ~    end~
    +        decay_rate  = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]
    +** Processing line: ~        frequency   = opts[:frequency]~
     - Inside source: true
     *** True Line Result
    -    end
    +        frequency   = opts[:frequency]
    +** Processing line: ~        sample_rate = 48000~
    +- Inside source: true
    +*** True Line Result
    +        sample_rate = 48000
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #render the ball to the screen~
    +** Processing line: ~        {~
     - Inside source: true
     *** True Line Result
    -    #render the ball to the screen
    -** Processing line: ~    def render args~
    +        {
    +** Processing line: ~          id:               (new_id! args),~
     - Inside source: true
     *** True Line Result
    -    def render args
    -** Processing line: ~      args.outputs.solids << [@xy.x,@xy.y,@width,@height,255,0,255];~
    +          id:               (new_id! args),
    +** Processing line: ~          frequency:        frequency,~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << [@xy.x,@xy.y,@width,@height,255,0,255];
    -** Processing line: ~      #args.outputs.labels << [20,HEIGHT-50,"velocity: " +@velocity.x.to_s+","+@velocity.y.to_s + "   magnitude:" + @velocity.mag.to_s]~
    +          frequency:        frequency,
    +** Processing line: ~          sample_rate:      48000,~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.labels << [20,HEIGHT-50,"velocity: " +@velocity.x.to_s+","+@velocity.y.to_s + "   magnitude:" + @velocity.mag.to_s]
    -** Processing line: ~    end~
    +          sample_rate:      48000,
    +** Processing line: ~          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          stop_at:          args.tick_count + opts[:queue_in] + opts[:duration],
    +** Processing line: ~          gain:             opts[:gain].to_f,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def rect~
    +          gain:             opts[:gain].to_f,
    +** Processing line: ~          queue_at:         args.state.tick_count + opts[:queue_in],~
     - Inside source: true
     *** True Line Result
    -    def rect
    -** Processing line: ~      [@xy.x,@xy.y,@width,@height]~
    +          queue_at:         args.state.tick_count + opts[:queue_in],
    +** Processing line: ~          decay_rate:       decay_rate,~
     - Inside source: true
     *** True Line Result
    -      [@xy.x,@xy.y,@width,@height]
    -** Processing line: ~    end~
    +          decay_rate:       decay_rate,
    +** Processing line: ~          pitch:            1.0,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          pitch:            1.0,
    +** Processing line: ~          looping:          true,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  end~
    +          looping:          true,
    +** Processing line: ~          paused:           false~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +          paused:           false
    +** Processing line: ~        }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +        }
    +** Processing line: ~      end~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +      end
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Collision With Object Removal - linear_collider.rb~
    -- Header detected.
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~      def queue_audio args, opts = {}~
    +- Inside source: true
     *** True Line Result
    -*** Physics And Collisions - Collision With Object Removal - linear_collider.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    -*** True Line Result
    -
    +      def queue_audio args, opts = {}
    +** Processing line: ~        graph_wave args, opts[:wave], opts[:audio_state][:frequency]~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/linear_collider.rb~
    +        graph_wave args, opts[:wave], opts[:audio_state][:frequency]
    +** Processing line: ~        args.state.audio_queue << opts[:audio_state]~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/linear_collider.rb
    -** Processing line: ~  #The LinearCollider (theoretically) produces collisions upon a line segment defined point.y two x,y cordinates~
    +        args.state.audio_queue << opts[:audio_state]
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  #The LinearCollider (theoretically) produces collisions upon a line segment defined point.y two x,y cordinates
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class LinearCollider~
    +** Processing line: ~      def new_id! args~
     - Inside source: true
     *** True Line Result
    -  class LinearCollider
    -** Processing line: ~~
    +      def new_id! args
    +** Processing line: ~        args.state.audio_id ||= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #start [Array of length 2] start of the line segment as a x,y cordinate~
    +        args.state.audio_id ||= 0
    +** Processing line: ~        args.state.audio_id  += 1~
     - Inside source: true
     *** True Line Result
    -    #start [Array of length 2] start of the line segment as a x,y cordinate
    -** Processing line: ~    #last [Array of length 2] end of the line segment as a x,y cordinate~
    +        args.state.audio_id  += 1
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    #last [Array of length 2] end of the line segment as a x,y cordinate
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #inorder for the LinearCollider to be functional the line segment must be said to have a thickness~
    -- Inside source: true
    -*** True Line Result
    -    #inorder for the LinearCollider to be functional the line segment must be said to have a thickness
    -** Processing line: ~    #(as it is unlikly that a colliding object will land exactly on the linesegment)~
    +** Processing line: ~      def graph_wave args, wave, frequency~
     - Inside source: true
     *** True Line Result
    -    #(as it is unlikly that a colliding object will land exactly on the linesegment)
    -** Processing line: ~~
    +      def graph_wave args, wave, frequency
    +** Processing line: ~        if args.state.tick_count != args.state.graphed_at~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #extension defines if the line's thickness extends negatively or positively~
    +        if args.state.tick_count != args.state.graphed_at
    +** Processing line: ~          args.outputs.static_lines.clear~
     - Inside source: true
     *** True Line Result
    -    #extension defines if the line's thickness extends negatively or positively
    -** Processing line: ~    #extension :pos     extends positively~
    +          args.outputs.static_lines.clear
    +** Processing line: ~          args.outputs.static_sprites.clear~
     - Inside source: true
     *** True Line Result
    -    #extension :pos     extends positively
    -** Processing line: ~    #extension :neg     extends negatively~
    +          args.outputs.static_sprites.clear
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    #extension :neg     extends negatively
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)~
    -- Inside source: true
    -*** True Line Result
    -    #thickness [float] how thick the line should be (should always be atleast as large as the magnitude of the colliding object)
    -** Processing line: ~    def initialize (pointA, pointB, extension=:neg, thickness=10)~
    +** Processing line: ~        wave = wave~
     - Inside source: true
     *** True Line Result
    -    def initialize (pointA, pointB, extension=:neg, thickness=10)
    -** Processing line: ~      @pointA = pointA~
    +        wave = wave
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @pointA = pointA
    -** Processing line: ~      @pointB = pointB~
    +
    +** Processing line: ~        r, g, b = frequency.to_i % 85,~
     - Inside source: true
     *** True Line Result
    -      @pointB = pointB
    -** Processing line: ~      @thickness = thickness~
    +        r, g, b = frequency.to_i % 85,
    +** Processing line: ~                  frequency.to_i % 170,~
     - Inside source: true
     *** True Line Result
    -      @thickness = thickness
    -** Processing line: ~      @extension = extension~
    +                  frequency.to_i % 170,
    +** Processing line: ~                  frequency.to_i % 255~
     - Inside source: true
     *** True Line Result
    -      @extension = extension
    +                  frequency.to_i % 255
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @pointAExtended={~
    +** Processing line: ~        starting_rect = args.layout.rect(row: 5, col: 13)~
     - Inside source: true
     *** True Line Result
    -      @pointAExtended={
    -** Processing line: ~        x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),~
    +        starting_rect = args.layout.rect(row: 5, col: 13)
    +** Processing line: ~        x_scale    = 10~
     - Inside source: true
     *** True Line Result
    -        x: @pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -** Processing line: ~        y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)~
    +        x_scale    = 10
    +** Processing line: ~        y_scale    = 100~
     - Inside source: true
     *** True Line Result
    -        y: @pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -** Processing line: ~      }~
    +        y_scale    = 100
    +** Processing line: ~        max_points = 25~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~      @pointBExtended={~
    +        max_points = 25
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @pointBExtended={
    -** Processing line: ~        x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),~
    +
    +** Processing line: ~        points = wave~
     - Inside source: true
     *** True Line Result
    -        x: @pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -** Processing line: ~        y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)~
    +        points = wave
    +** Processing line: ~        if wave.length > max_points~
     - Inside source: true
     *** True Line Result
    -        y: @pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -** Processing line: ~      }~
    +        if wave.length > max_points
    +** Processing line: ~          resolution = wave.length.idiv max_points~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~~
    +          resolution = wave.length.idiv max_points
    +** Processing line: ~          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    end~
    +          points = wave.find_all.with_index { |y, i| (i % resolution == 0) }
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    end
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def resetPoints(pointA,pointB)~
    -- Inside source: true
    -*** True Line Result
    -    def resetPoints(pointA,pointB)
    -** Processing line: ~      @pointA = pointA~
    +** Processing line: ~        args.outputs.static_lines << points.map_with_index do |y, x|~
     - Inside source: true
     *** True Line Result
    -      @pointA = pointA
    -** Processing line: ~      @pointB = pointB~
    +        args.outputs.static_lines << points.map_with_index do |y, x|
    +** Processing line: ~          next_y = points[x + 1]~
     - Inside source: true
     *** True Line Result
    -      @pointB = pointB
    +          next_y = points[x + 1]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @pointAExtended={~
    +** Processing line: ~          if next_y~
     - Inside source: true
     *** True Line Result
    -      @pointAExtended={
    -** Processing line: ~        x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),~
    +          if next_y
    +** Processing line: ~            {~
     - Inside source: true
     *** True Line Result
    -        x:@pointA.x + @thickness*(@extension == :neg ? -1 : 1),
    -** Processing line: ~        y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)~
    +            {
    +** Processing line: ~              x:  starting_rect.x + (x * x_scale),~
     - Inside source: true
     *** True Line Result
    -        y:@pointA.y + @thickness*(@extension == :neg ? -1 : 1)
    -** Processing line: ~      }~
    +              x:  starting_rect.x + (x * x_scale),
    +** Processing line: ~              y:  starting_rect.y + starting_rect.h.half + y_scale * y,~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~      @pointBExtended={~
    +              y:  starting_rect.y + starting_rect.h.half + y_scale * y,
    +** Processing line: ~              x2: starting_rect.x + ((x + 1) * x_scale),~
     - Inside source: true
     *** True Line Result
    -      @pointBExtended={
    -** Processing line: ~        x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),~
    +              x2: starting_rect.x + ((x + 1) * x_scale),
    +** Processing line: ~              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,~
     - Inside source: true
     *** True Line Result
    -        x:@pointB.x + @thickness*(@extension == :neg ? -1 : 1),
    -** Processing line: ~        y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)~
    +              y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,
    +** Processing line: ~              r:  r,~
     - Inside source: true
     *** True Line Result
    -        y:@pointB.y + @thickness*(@extension == :neg ? -1 : 1)
    -** Processing line: ~      }~
    +              r:  r,
    +** Processing line: ~              g:  g,~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~    end~
    +              g:  g,
    +** Processing line: ~              b:  b~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +              b:  b
    +** Processing line: ~            }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #TODO: Ugly function~
    +            }
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -    #TODO: Ugly function
    -** Processing line: ~    def slope (pointA, pointB)~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    def slope (pointA, pointB)
    -** Processing line: ~      return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)~
    +        end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      return (pointB.x==pointA.x) ? INFINITY : (pointB.y+-pointA.y)/(pointB.x+-pointA.x)
    -** Processing line: ~    end~
    +
    +** Processing line: ~        args.outputs.static_sprites << points.map_with_index do |y, x|~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        args.outputs.static_sprites << points.map_with_index do |y, x|
    +** Processing line: ~          {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #TODO: Ugly function~
    +          {
    +** Processing line: ~            x:  (starting_rect.x + (x * x_scale)) - 2,~
     - Inside source: true
     *** True Line Result
    -    #TODO: Ugly function
    -** Processing line: ~    def intercept(pointA, pointB)~
    +            x:  (starting_rect.x + (x * x_scale)) - 2,
    +** Processing line: ~            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,~
     - Inside source: true
     *** True Line Result
    -    def intercept(pointA, pointB)
    -** Processing line: ~      if (slope(pointA, pointB) == INFINITY)~
    +            y:  (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,
    +** Processing line: ~            w:  4,~
     - Inside source: true
     *** True Line Result
    -      if (slope(pointA, pointB) == INFINITY)
    -** Processing line: ~        -INFINITY~
    +            w:  4,
    +** Processing line: ~            h:  4,~
     - Inside source: true
     *** True Line Result
    -        -INFINITY
    -** Processing line: ~      elsif slope(pointA, pointB) == -1*INFINITY~
    +            h:  4,
    +** Processing line: ~            path: 'sprites/square-white.png',~
     - Inside source: true
     *** True Line Result
    -      elsif slope(pointA, pointB) == -1*INFINITY
    -** Processing line: ~        INFINITY~
    +            path: 'sprites/square-white.png',
    +** Processing line: ~            r: r,~
     - Inside source: true
     *** True Line Result
    -        INFINITY
    -** Processing line: ~      else~
    +            r: r,
    +** Processing line: ~            g: g,~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)~
    +            g: g,
    +** Processing line: ~            b: b~
     - Inside source: true
     *** True Line Result
    -        pointA.y+-1.0*(slope(pointA, pointB)*pointA.x)
    -** Processing line: ~      end~
    +            b: b
    +** Processing line: ~          }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +          }
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -    end
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calcY(pointA, pointB, x)~
    +** Processing line: ~        args.state.graphed_at = args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    def calcY(pointA, pointB, x)
    -** Processing line: ~      return slope(pointA, pointB)*x + intercept(pointA, pointB)~
    +        args.state.graphed_at = args.state.tick_count
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      return slope(pointA, pointB)*x + intercept(pointA, pointB)
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -38452,38 +46791,18 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #test if a collision has occurred~
    -- Inside source: true
    -*** True Line Result
    -    #test if a collision has occurred
    -** Processing line: ~    def isCollision? (point)~
    -- Inside source: true
    -*** True Line Result
    -    def isCollision? (point)
    -** Processing line: ~      #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test~
    -- Inside source: true
    -*** True Line Result
    -      #INFINITY slop breaks down when trying to determin collision, ergo it requires a special test
    -** Processing line: ~      if slope(@pointA, @pointB) ==  INFINITY &&~
    -- Inside source: true
    -*** True Line Result
    -      if slope(@pointA, @pointB) ==  INFINITY &&
    -** Processing line: ~        point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&~
    -- Inside source: true
    -*** True Line Result
    -        point.x >= [@pointA.x,@pointB.x].min+(@extension == :pos ? -@thickness : 0) &&
    -** Processing line: ~        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&~
    +** Processing line: ~    begin # region: musical note mapping~
     - Inside source: true
     *** True Line Result
    -        point.x <= [@pointA.x,@pointB.x].max+(@extension == :neg ?  @thickness : 0) &&
    -** Processing line: ~        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max~
    +    begin # region: musical note mapping
    +** Processing line: ~      def defaults_frequency_for~
     - Inside source: true
     *** True Line Result
    -        point.y >= [@pointA.y,@pointB.y].min && point.y <= [@pointA.y,@pointB.y].max
    -** Processing line: ~          return true~
    +      def defaults_frequency_for
    +** Processing line: ~        { note: :a, octave: 5, sharp:  false, flat:   false }~
     - Inside source: true
     *** True Line Result
    -          return true
    +        { note: :a, octave: 5, sharp:  false, flat:   false }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -38492,366 +46811,370 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      isNegInLine   = @extension == :neg &&~
    -- Inside source: true
    -*** True Line Result
    -      isNegInLine   = @extension == :neg &&
    -** Processing line: ~                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&~
    +** Processing line: ~      def frequency_for opts = {}~
     - Inside source: true
     *** True Line Result
    -                      point.y <= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -** Processing line: ~                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)~
    +      def frequency_for opts = {}
    +** Processing line: ~        opts = defaults_frequency_for.merge opts~
     - Inside source: true
     *** True Line Result
    -                      point.y >= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -** Processing line: ~      isPosInLine   = @extension == :pos &&~
    +        opts = defaults_frequency_for.merge opts
    +** Processing line: ~        octave_offset_multiplier  = opts[:octave] - 5~
     - Inside source: true
     *** True Line Result
    -      isPosInLine   = @extension == :pos &&
    -** Processing line: ~                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&~
    +        octave_offset_multiplier  = opts[:octave] - 5
    +** Processing line: ~        note = note_frequencies_octave_5[opts[:note]]~
     - Inside source: true
     *** True Line Result
    -                      point.y >= slope(@pointA, @pointB)*point.x+intercept(@pointA,@pointB) &&
    -** Processing line: ~                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)~
    +        note = note_frequencies_octave_5[opts[:note]]
    +** Processing line: ~        if octave_offset_multiplier < 0~
     - Inside source: true
     *** True Line Result
    -                      point.y <= point.x*slope(@pointAExtended, @pointBExtended)+intercept(@pointAExtended,@pointBExtended)
    -** Processing line: ~      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&~
    +        if octave_offset_multiplier < 0
    +** Processing line: ~          note = note * 1 / (octave_offset_multiplier.abs + 1)~
     - Inside source: true
     *** True Line Result
    -      isInBoxBounds = point.x >= [@pointA.x,@pointB.x].min &&
    -** Processing line: ~                      point.x <= [@pointA.x,@pointB.x].max &&~
    +          note = note * 1 / (octave_offset_multiplier.abs + 1)
    +** Processing line: ~        elsif octave_offset_multiplier > 0~
     - Inside source: true
     *** True Line Result
    -                      point.x <= [@pointA.x,@pointB.x].max &&
    -** Processing line: ~                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&~
    +        elsif octave_offset_multiplier > 0
    +** Processing line: ~          note = note * (octave_offset_multiplier.abs + 1) / 1~
     - Inside source: true
     *** True Line Result
    -                      point.y >= [@pointA.y,@pointB.y].min+(@extension == :neg ? -@thickness : 0) &&
    -** Processing line: ~                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)~
    +          note = note * (octave_offset_multiplier.abs + 1) / 1
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -                      point.y <= [@pointA.y,@pointB.y].max+(@extension == :pos ? @thickness : 0)
    -** Processing line: ~~
    +        end
    +** Processing line: ~        note~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      return isInBoxBounds && (isNegInLine || isPosInLine)~
    +        note
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      return isInBoxBounds && (isNegInLine || isPosInLine)
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    +** Processing line: ~      def note_frequencies_octave_5~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      def note_frequencies_octave_5
    +** Processing line: ~        {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def getRepelMagnitude (fbx, fby, vrx, vry, args)~
    +        {
    +** Processing line: ~          a: 440.0,~
     - Inside source: true
     *** True Line Result
    -    def getRepelMagnitude (fbx, fby, vrx, vry, args)
    -** Processing line: ~      a = fbx ; b = vrx ; c = fby~
    +          a: 440.0,
    +** Processing line: ~          a_sharp: 466.16, b_flat: 466.16,~
     - Inside source: true
     *** True Line Result
    -      a = fbx ; b = vrx ; c = fby
    -** Processing line: ~      d = vry ; e = args.state.ball.velocity.mag~
    +          a_sharp: 466.16, b_flat: 466.16,
    +** Processing line: ~          b: 493.88,~
     - Inside source: true
     *** True Line Result
    -      d = vry ; e = args.state.ball.velocity.mag
    -** Processing line: ~~
    +          b: 493.88,
    +** Processing line: ~          c: 523.25,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if b**2 + d**2 == 0~
    +          c: 523.25,
    +** Processing line: ~          c_sharp: 554.37, d_flat: 587.33,~
     - Inside source: true
     *** True Line Result
    -      if b**2 + d**2 == 0
    -** Processing line: ~        puts "magnitude error"~
    +          c_sharp: 554.37, d_flat: 587.33,
    +** Processing line: ~          d: 587.33,~
     - Inside source: true
     *** True Line Result
    -        puts "magnitude error"
    -** Processing line: ~      end~
    +          d: 587.33,
    +** Processing line: ~          d_sharp: 622.25, e_flat: 659.25,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          d_sharp: 622.25, e_flat: 659.25,
    +** Processing line: ~          e: 659.25,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)~
    +          e: 659.25,
    +** Processing line: ~          f: 698.25,~
     - Inside source: true
     *** True Line Result
    -      x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
    -** Processing line: ~      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))~
    +          f: 698.25,
    +** Processing line: ~          f_sharp: 739.99, g_flat: 739.99,~
     - Inside source: true
     *** True Line Result
    -      x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
    -** Processing line: ~      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2~
    +          f_sharp: 739.99, g_flat: 739.99,
    +** Processing line: ~          g: 783.99,~
     - Inside source: true
     *** True Line Result
    -      return ((a+x1*b)**2 + (c+x1*d)**2 == e**2) ? x1 : x2
    -** Processing line: ~    end~
    +          g: 783.99,
    +** Processing line: ~          g_sharp: 830.61, a_flat: 830.61~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +          g_sharp: 830.61, a_flat: 830.61
    +** Processing line: ~        }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def update args~
    +        }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    def update args
    -** Processing line: ~      #each of the four points on the square ball - NOTE simple to extend to a circle~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      #each of the four points on the square ball - NOTE simple to extend to a circle
    -** Processing line: ~      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      points= [ {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y},
    -** Processing line: ~                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y},
    -** Processing line: ~                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},~
    +
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -                {x: args.state.ball.xy.x,                          y: args.state.ball.xy.y+args.state.ball.height},
    -** Processing line: ~                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}~
    +  $gtk.reset
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                {x: args.state.ball.xy.x+args.state.ball.width,    y: args.state.ball.xy.y + args.state.ball.height}
    -** Processing line: ~              ]~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -              ]
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~      #for each point p in points~
    -- Inside source: true
    +** Processing line: ~*** Advanced Rendering - Simple Render Targets - main.rb~
    +- Header detected.
     *** True Line Result
    -      #for each point p in points
    -** Processing line: ~      for point in points~
    -- Inside source: true
    +
     *** True Line Result
    -      for point in points
    -** Processing line: ~        #isCollision.md has more information on this section~
    +*** Advanced Rendering - Simple Render Targets - 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/01_simple_render_targets/app/main.rb~
     - Inside source: true
     *** True Line Result
    -        #isCollision.md has more information on this section
    -** Processing line: ~        #TODO: section can certainly be simplifyed~
    +  # ./samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -        #TODO: section can certainly be simplifyed
    -** Processing line: ~        if isCollision?(point)~
    +  def tick args
    +** Processing line: ~    # args.outputs.render_targets are really really powerful.~
     - Inside source: true
     *** True Line Result
    -        if isCollision?(point)
    -** Processing line: ~          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector~
    +    # args.outputs.render_targets are really really powerful.
    +** Processing line: ~    # They essentially allow you to create a sprite programmatically and cache the result.~
     - Inside source: true
     *** True Line Result
    -          u = Vector2d.new(1.0,((slope(@pointA, @pointB)==0) ? INFINITY : -1/slope(@pointA, @pointB))*1.0).normalize #normal perpendicular (to line segment) vector
    +    # They essentially allow you to create a sprite programmatically and cache the result.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment~
    +** Processing line: ~    # Create a render_target of a :block and a :gradient on tick zero.~
     - Inside source: true
     *** True Line Result
    -          #the vector with the repeling force can be u or -u depending of where the ball was coming from in relation to the line segment
    -** Processing line: ~          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)~
    +    # Create a render_target of a :block and a :gradient on tick zero.
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -          previousBallPosition=Vector2d.new(point.x-args.state.ball.velocity.x,point.y-args.state.ball.velocity.y)
    -** Processing line: ~          choiceA = (u.mult(1))~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.render_target(:block).solids << [0, 0, 1280, 100]~
     - Inside source: true
     *** True Line Result
    -          choiceA = (u.mult(1))
    -** Processing line: ~          choiceB =  (u.mult(-1))~
    +      args.render_target(:block).solids << [0, 0, 1280, 100]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          choiceB =  (u.mult(-1))
    -** Processing line: ~          vectorRepel = nil~
    +
    +** Processing line: ~      # The gradient is actually just a collection of black solids with increasing~
     - Inside source: true
     *** True Line Result
    -          vectorRepel = nil
    -** Processing line: ~~
    +      # The gradient is actually just a collection of black solids with increasing
    +** Processing line: ~      # opacities.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0~
    +      # opacities.
    +** Processing line: ~      args.render_target(:gradient).solids << 90.map_with_index do |x|~
     - Inside source: true
     *** True Line Result
    -          if (slope(@pointA, @pointB))!=INFINITY && u.y < 0
    -** Processing line: ~            choiceA, choiceB = choiceB, choiceA~
    +      args.render_target(:gradient).solids << 90.map_with_index do |x|
    +** Processing line: ~        50.map_with_index do |y|~
     - Inside source: true
     *** True Line Result
    -            choiceA, choiceB = choiceB, choiceA
    -** Processing line: ~          end~
    +        50.map_with_index do |y|
    +** Processing line: ~          [x * 15, y * 15, 15, 15, 0, 0, 0, (x * 3).fdiv(255) * 255]~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB~
    +          [x * 15, y * 15, 15, 15, 0, 0, 0, (x * 3).fdiv(255) * 255]
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -          vectorRepel = (previousBallPosition.y > calcY(@pointA, @pointB, previousBallPosition.x)) ? choiceA : choiceB
    -** Processing line: ~~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          #vectorRepel = (previousBallPosition.y > slope(@pointA, @pointB)*previousBallPosition.x+intercept(@pointA,@pointB)) ? choiceA : choiceB)
    -** Processing line: ~          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          if (slope(@pointA, @pointB) == INFINITY) #slope INFINITY breaks down in the above test, ergo it requires a custom test
    -** Processing line: ~            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))~
    +
    +** Processing line: ~    # Take the :block render_target and present it horizontally centered.~
     - Inside source: true
     *** True Line Result
    -            vectorRepel = (previousBallPosition.x > @pointA.x) ? (u.mult(1)) : (u.mult(-1))
    -** Processing line: ~          end~
    +    # Take the :block render_target and present it horizontally centered.
    +** Processing line: ~    # Use a subsection of the render_targetd specified by source_x,~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)~
    +    # Use a subsection of the render_targetd specified by source_x,
    +** Processing line: ~    # source_y, source_w, source_h.~
     - Inside source: true
     *** True Line Result
    -          #puts ("     " + $t[0].to_s + "," + $t[1].to_s + "    " + $t[2].to_s + "," + $t[3].to_s + "     " + "   " + u.x.to_s + "," + u.y.to_s)
    -** Processing line: ~          #vectorRepel now has the repeling force~
    +    # source_y, source_w, source_h.
    +** Processing line: ~    args.outputs.sprites << { x: 0,~
     - Inside source: true
     *** True Line Result
    -          #vectorRepel now has the repeling force
    -** Processing line: ~~
    +    args.outputs.sprites << { x: 0,
    +** Processing line: ~                              y: 310,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          mag = args.state.ball.velocity.mag~
    +                              y: 310,
    +** Processing line: ~                              w: 1280,~
     - Inside source: true
     *** True Line Result
    -          mag = args.state.ball.velocity.mag
    -** Processing line: ~          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity~
    +                              w: 1280,
    +** Processing line: ~                              h: 100,~
     - Inside source: true
     *** True Line Result
    -          theta_ball=Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
    -** Processing line: ~          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force~
    +                              h: 100,
    +** Processing line: ~                              path: :block,~
     - Inside source: true
     *** True Line Result
    -          theta_repel=Math.atan2(vectorRepel.y,vectorRepel.x) #the angle of the repeling force
    -** Processing line: ~          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay~
    +                              path: :block,
    +** Processing line: ~                              source_x: 0,~
     - Inside source: true
     *** True Line Result
    -          #puts ("theta:" + theta_ball.to_s + " " + theta_repel.to_s) #theta okay
    -** Processing line: ~~
    +                              source_x: 0,
    +** Processing line: ~                              source_y: 0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity~
    +                              source_y: 0,
    +** Processing line: ~                              source_w: 1280,~
     - Inside source: true
     *** True Line Result
    -          fbx = mag * Math.cos(theta_ball) #the x component of the ball's velocity
    -** Processing line: ~          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity~
    +                              source_w: 1280,
    +** Processing line: ~                              source_h: 100 }~
     - Inside source: true
     *** True Line Result
    -          fby = mag * Math.sin(theta_ball) #the y component of the ball's velocity
    +                              source_h: 100 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)~
    +** Processing line: ~    # After rendering :block, render gradient on top of :block.~
     - Inside source: true
     *** True Line Result
    -          repelMag = getRepelMagnitude(fbx, fby, vectorRepel.x, vectorRepel.y, args)
    +    # After rendering :block, render gradient on top of :block.
    +** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, :gradient]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [0, 0, 1280, 720, :gradient]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx~
    +** Processing line: ~    args.outputs.labels  << [1270, 710, args.gtk.current_framerate, 0, 2, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -          frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
    -** Processing line: ~          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby~
    +    args.outputs.labels  << [1270, 710, args.gtk.current_framerate, 0, 2, 255, 255, 255]
    +** Processing line: ~    tick_instructions args, "Sample app shows how to use render_targets (programmatically create cached sprites)."~
     - Inside source: true
     *** True Line Result
    -          fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
    -** Processing line: ~~
    +    tick_instructions args, "Sample app shows how to use render_targets (programmatically create cached sprites)."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          fsumx = fbx+frx #sum of x forces~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          fsumx = fbx+frx #sum of x forces
    -** Processing line: ~          fsumy = fby+fry #sum of y forces~
    +
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -          fsumy = fby+fry #sum of y forces
    -** Processing line: ~          fr = mag#fr is the resulting magnitude~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -          fr = mag#fr is the resulting magnitude
    -** Processing line: ~          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -          thetaNew = Math.atan2(fsumy, fsumx)  #thetaNew is the resulting angle
    -** Processing line: ~          xnew = fr*Math.cos(thetaNew) #resulting x velocity~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -          xnew = fr*Math.cos(thetaNew) #resulting x velocity
    -** Processing line: ~          ynew = fr*Math.sin(thetaNew) #resulting y velocity~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -          ynew = fr*Math.sin(thetaNew) #resulting y velocity
    -** Processing line: ~~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~          args.state.ball.velocity = Vector2d.new(xnew,ynew)~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -          args.state.ball.velocity = Vector2d.new(xnew,ynew)
    -** Processing line: ~          #args.state.ball.xy.add(args.state.ball.velocity)~
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          #args.state.ball.xy.add(args.state.ball.velocity)
    -** Processing line: ~          break #no need to check the other points ?~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          break #no need to check the other points ?
    -** Processing line: ~        else~
    +
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~        end~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end #end update~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end #end update
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  end~
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -  end
    +  $gtk.reset
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -38864,146 +47187,150 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Physics And Collisions - Collision With Object Removal - main.rb~
    +** Processing line: ~*** Advanced Rendering - Render Targets With Tile Manipulation - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Physics And Collisions - Collision With Object Removal - main.rb
    +*** Advanced Rendering - Render Targets With Tile Manipulation - 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/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb~
    +** Processing line: ~  # ./samples/07_advanced_rendering/02_render_targets_with_tile_manipulation/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/main.rb
    -** Processing line: ~  # coding: utf-8~
    +  # ./samples/07_advanced_rendering/02_render_targets_with_tile_manipulation/app/main.rb
    +** Processing line: ~  # This sample is meant to show you how to do that dripping transition thing~
     - Inside source: true
     *** True Line Result
    -  # coding: utf-8
    -** Processing line: ~  INFINITY= 10**10~
    +  # This sample is meant to show you how to do that dripping transition thing
    +** Processing line: ~  #  at the start of the original Doom. Most of this file is here to animate~
     - Inside source: true
     *** True Line Result
    -  INFINITY= 10**10
    -** Processing line: ~  WIDTH=1280~
    +  #  at the start of the original Doom. Most of this file is here to animate
    +** Processing line: ~  #  a scene to wipe away; the actual wipe effect is in the last 20 lines or~
     - Inside source: true
     *** True Line Result
    -  WIDTH=1280
    -** Processing line: ~  HEIGHT=720~
    +  #  a scene to wipe away; the actual wipe effect is in the last 20 lines or
    +** Processing line: ~  #  so.~
     - Inside source: true
     *** True Line Result
    -  HEIGHT=720
    +  #  so.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  require 'app/vector2d.rb'~
    +** Processing line: ~  $gtk.reset   # reset all game state if reloaded.~
     - Inside source: true
     *** True Line Result
    -  require 'app/vector2d.rb'
    -** Processing line: ~  require 'app/paddle.rb'~
    +  $gtk.reset   # reset all game state if reloaded.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  require 'app/paddle.rb'
    -** Processing line: ~  require 'app/ball.rb'~
    +
    +** Processing line: ~  def circle_of_blocks pass, xoffset, yoffset, angleoffset, blocksize, distance~
     - Inside source: true
     *** True Line Result
    -  require 'app/ball.rb'
    -** Processing line: ~  require 'app/linear_collider.rb'~
    +  def circle_of_blocks pass, xoffset, yoffset, angleoffset, blocksize, distance
    +** Processing line: ~    numblocks = 10~
     - Inside source: true
     *** True Line Result
    -  require 'app/linear_collider.rb'
    +    numblocks = 10
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  #Method to init default values~
    +** Processing line: ~    for i in 1..numblocks do~
     - Inside source: true
     *** True Line Result
    -  #Method to init default values
    -** Processing line: ~  def defaults args~
    +    for i in 1..numblocks do
    +** Processing line: ~      angle = ((360 / numblocks) * i) + angleoffset~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]~
    +      angle = ((360 / numblocks) * i) + angleoffset
    +** Processing line: ~      radians = angle * (Math::PI / 180)~
     - Inside source: true
     *** True Line Result
    -    args.state.game_board ||= [(args.grid.w / 2 - args.grid.w / 4), 0, (args.grid.w / 2), args.grid.h]
    -** Processing line: ~    args.state.bricks ||= []~
    +      radians = angle * (Math::PI / 180)
    +** Processing line: ~      x = (xoffset + (distance * Math.cos(radians))).round~
     - Inside source: true
     *** True Line Result
    -    args.state.bricks ||= []
    -** Processing line: ~    args.state.num_bricks ||= 0~
    +      x = (xoffset + (distance * Math.cos(radians))).round
    +** Processing line: ~      y = (yoffset + (distance * Math.sin(radians))).round~
     - Inside source: true
     *** True Line Result
    -    args.state.num_bricks ||= 0
    -** Processing line: ~    args.state.game_over_at ||= 0~
    +      y = (yoffset + (distance * Math.sin(radians))).round
    +** Processing line: ~      pass.solids << [ x, y, blocksize, blocksize, 255, 255, 0 ]~
     - Inside source: true
     *** True Line Result
    -    args.state.game_over_at ||= 0
    -** Processing line: ~    args.state.paddle ||= Paddle.new~
    +      pass.solids << [ x, y, blocksize, blocksize, 255, 255, 0 ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.paddle ||= Paddle.new
    -** Processing line: ~    args.state.ball   ||= Ball.new~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.state.ball   ||= Ball.new
    -** Processing line: ~    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.westWall  ||= LinearCollider.new({x: args.grid.w/4,      y: 0},          {x: args.grid.w/4,      y: args.grid.h}, :pos)
    -** Processing line: ~    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})~
    +
    +** Processing line: ~  def draw_scene args, pass~
     - Inside source: true
     *** True Line Result
    -    args.state.eastWall  ||= LinearCollider.new({x: 3*args.grid.w*0.25, y: 0},          {x: 3*args.grid.w*0.25, y: args.grid.h})
    -** Processing line: ~    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})~
    +  def draw_scene args, pass
    +** Processing line: ~    pass.solids << [0, 360, 1280, 360, 0, 0, 200]~
     - Inside source: true
     *** True Line Result
    -    args.state.southWall ||= LinearCollider.new({x: 0,                  y: 0},          {x: args.grid.w,        y: 0})
    -** Processing line: ~    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)~
    +    pass.solids << [0, 360, 1280, 360, 0, 0, 200]
    +** Processing line: ~    pass.solids << [0, 0, 1280, 360, 0, 127, 0]~
     - Inside source: true
     *** True Line Result
    -    args.state.northWall ||= LinearCollider.new({x: 0,                  y:args.grid.h}, {x: args.grid.w,        y: args.grid.h}, :pos)
    +    pass.solids << [0, 0, 1280, 360, 0, 127, 0]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})~
    +** Processing line: ~    blocksize = 100~
     - Inside source: true
     *** True Line Result
    -    #args.state.testWall ||= LinearCollider.new({x:0 , y:0},{x:args.grid.w, y:args.grid.h})
    -** Processing line: ~  end~
    +    blocksize = 100
    +** Processing line: ~    angleoffset = args.state.tick_count * 2.5~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    angleoffset = args.state.tick_count * 2.5
    +** Processing line: ~    centerx = (1280 - blocksize) / 2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Render loop~
    +    centerx = (1280 - blocksize) / 2
    +** Processing line: ~    centery = (720 - blocksize) / 2~
     - Inside source: true
     *** True Line Result
    -  #Render loop
    -** Processing line: ~  def render args~
    +    centery = (720 - blocksize) / 2
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    render_instructions args~
    +
    +** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize * 2, 500~
     - Inside source: true
     *** True Line Result
    -    render_instructions args
    -** Processing line: ~    render_board args~
    +    circle_of_blocks pass, centerx, centery, angleoffset, blocksize * 2, 500
    +** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize, 325~
     - Inside source: true
     *** True Line Result
    -    render_board args
    -** Processing line: ~    render_bricks args~
    +    circle_of_blocks pass, centerx, centery, angleoffset, blocksize, 325
    +** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 2, 200~
     - Inside source: true
     *** True Line Result
    -    render_bricks args
    +    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 2, 200
    +** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 4, 100~
    +- Inside source: true
    +*** True Line Result
    +    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 4, 100
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -39012,38 +47339,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin :render_methods~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -  begin :render_methods
    -** Processing line: ~    #Method to display the instructions of the game~
    +  def tick args
    +** Processing line: ~    segments = 160~
     - Inside source: true
     *** True Line Result
    -    #Method to display the instructions of the game
    -** Processing line: ~    def render_instructions args~
    +    segments = 160
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def render_instructions args
    -** Processing line: ~      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]~
    +
    +** Processing line: ~    # On the first tick, initialize some stuff.~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [225, args.grid.h - 30, "← and → to move the paddle left and right",  0, 1]
    -** Processing line: ~    end~
    +    # On the first tick, initialize some stuff.
    +** Processing line: ~    if !args.state.yoffsets~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    if !args.state.yoffsets
    +** Processing line: ~      args.state.baseyoff = 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def render_board args~
    +      args.state.baseyoff = 0
    +** Processing line: ~      args.state.yoffsets = []~
     - Inside source: true
     *** True Line Result
    -    def render_board args
    -** Processing line: ~      args.outputs.borders << args.state.game_board~
    +      args.state.yoffsets = []
    +** Processing line: ~      for i in 0..segments do~
     - Inside source: true
     *** True Line Result
    -      args.outputs.borders << args.state.game_board
    +      for i in 0..segments do
    +** Processing line: ~        args.state.yoffsets << rand * 100~
    +- Inside source: true
    +*** True Line Result
    +        args.state.yoffsets << rand * 100
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -39052,806 +47387,782 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_bricks args~
    +** Processing line: ~    # Just draw some random stuff for a few seconds.~
     - Inside source: true
     *** True Line Result
    -    def render_bricks args
    -** Processing line: ~      args.outputs.solids << args.state.bricks.map(&:rect)~
    +    # Just draw some random stuff for a few seconds.
    +** Processing line: ~    args.state.static_debounce ||= 60 * 2.5~
     - Inside source: true
     *** True Line Result
    -      args.outputs.solids << args.state.bricks.map(&:rect)
    -** Processing line: ~    end~
    +    args.state.static_debounce ||= 60 * 2.5
    +** Processing line: ~    if args.state.static_debounce > 0~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +    if args.state.static_debounce > 0
    +** Processing line: ~      last_frame = args.state.static_debounce == 1~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      last_frame = args.state.static_debounce == 1
    +** Processing line: ~      target = last_frame ? args.render_target(:last_frame) : args.outputs~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  #Calls all methods necessary for performing calculations~
    +      target = last_frame ? args.render_target(:last_frame) : args.outputs
    +** Processing line: ~      draw_scene args, target~
     - Inside source: true
     *** True Line Result
    -  #Calls all methods necessary for performing calculations
    -** Processing line: ~  def calc args~
    +      draw_scene args, target
    +** Processing line: ~      args.state.static_debounce -= 1~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    add_new_bricks args~
    +      args.state.static_debounce -= 1
    +** Processing line: ~      return unless last_frame~
     - Inside source: true
     *** True Line Result
    -    add_new_bricks args
    -** Processing line: ~    reset_game args~
    +      return unless last_frame
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    reset_game args
    -** Processing line: ~    calc_collision args~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    calc_collision args
    -** Processing line: ~    win_game args~
    +
    +** Processing line: ~    # build up the wipe...~
     - Inside source: true
     *** True Line Result
    -    win_game args
    +    # build up the wipe...
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.westWall.update args~
    +** Processing line: ~    # this is the thing we're wiping to.~
     - Inside source: true
     *** True Line Result
    -    args.state.westWall.update args
    -** Processing line: ~    args.state.eastWall.update args~
    +    # this is the thing we're wiping to.
    +** Processing line: ~    args.outputs.sprites << [ 0, 0, 1280, 720, 'dragonruby.png' ]~
     - Inside source: true
     *** True Line Result
    -    args.state.eastWall.update args
    -** Processing line: ~    args.state.southWall.update args~
    +    args.outputs.sprites << [ 0, 0, 1280, 720, 'dragonruby.png' ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.southWall.update args
    -** Processing line: ~    args.state.northWall.update args~
    +
    +** Processing line: ~    return if (args.state.baseyoff > (1280 + 100))  # stop when done sliding~
     - Inside source: true
     *** True Line Result
    -    args.state.northWall.update args
    -** Processing line: ~    args.state.paddle.update args~
    +    return if (args.state.baseyoff > (1280 + 100))  # stop when done sliding
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.paddle.update args
    -** Processing line: ~    args.state.ball.update args~
    +
    +** Processing line: ~    segmentw = 1280 / segments~
     - Inside source: true
     *** True Line Result
    -    args.state.ball.update args
    +    segmentw = 1280 / segments
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #args.state.testWall.update args~
    +** Processing line: ~    x = 0~
     - Inside source: true
     *** True Line Result
    -    #args.state.testWall.update args
    -** Processing line: ~~
    +    x = 0
    +** Processing line: ~    for i in 0..segments do~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.paddle.render args~
    +    for i in 0..segments do
    +** Processing line: ~      yoffset = 0~
     - Inside source: true
     *** True Line Result
    -    args.state.paddle.render args
    -** Processing line: ~    args.state.ball.render args~
    +      yoffset = 0
    +** Processing line: ~      if args.state.yoffsets[i] < args.state.baseyoff~
     - Inside source: true
     *** True Line Result
    -    args.state.ball.render args
    -** Processing line: ~  end~
    +      if args.state.yoffsets[i] < args.state.baseyoff
    +** Processing line: ~        yoffset = args.state.baseyoff - args.state.yoffsets[i]~
     - Inside source: true
     *** True Line Result
    -  end
    +        yoffset = args.state.baseyoff - args.state.yoffsets[i]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  begin :calc_methods~
    +** Processing line: ~      # (720 - yoffset) flips the coordinate system, (- 720) adjusts for the height of the segment.~
     - Inside source: true
     *** True Line Result
    -  begin :calc_methods
    -** Processing line: ~    def add_new_bricks args~
    +      # (720 - yoffset) flips the coordinate system, (- 720) adjusts for the height of the segment.
    +** Processing line: ~      args.outputs.sprites << [ x, (720 - yoffset) - 720, segmentw, 720, 'last_frame', 0, 255, 255, 255, 255, x, 0, segmentw, 720 ]~
     - Inside source: true
     *** True Line Result
    -    def add_new_bricks args
    -** Processing line: ~      return if args.state.num_bricks > 40~
    +      args.outputs.sprites << [ x, (720 - yoffset) - 720, segmentw, 720, 'last_frame', 0, 255, 255, 255, 255, x, 0, segmentw, 720 ]
    +** Processing line: ~      x += segmentw~
     - Inside source: true
     *** True Line Result
    -      return if args.state.num_bricks > 40
    +      x += segmentw
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Width of the game board is 640px~
    +** Processing line: ~    args.state.baseyoff += 4~
     - Inside source: true
     *** True Line Result
    -      #Width of the game board is 640px
    -** Processing line: ~      brick_width = (args.grid.w / 2) / 10~
    +    args.state.baseyoff += 4
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      brick_width = (args.grid.w / 2) / 10
    -** Processing line: ~      brick_height = brick_width / 2~
    +
    +** Processing line: ~    tick_instructions args, "Sample app shows an advanced usage of render_target."~
     - Inside source: true
     *** True Line Result
    -      brick_height = brick_width / 2
    +    tick_instructions args, "Sample app shows an advanced usage of render_target."
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      (4).map_with_index do |y|~
    +** Processing line: ~  def tick_instructions args, text, y = 715~
     - Inside source: true
     *** True Line Result
    -      (4).map_with_index do |y|
    -** Processing line: ~        #Make a box that is 10 bricks wide and 4 bricks tall~
    +  def tick_instructions args, text, y = 715
    +** Processing line: ~    return if args.state.key_event_occurred~
     - Inside source: true
     *** True Line Result
    -        #Make a box that is 10 bricks wide and 4 bricks tall
    -** Processing line: ~        args.state.bricks += (10).map_with_index do |x|~
    +    return if args.state.key_event_occurred
    +** Processing line: ~    if args.inputs.mouse.click ||~
     - Inside source: true
     *** True Line Result
    -        args.state.bricks += (10).map_with_index do |x|
    -** Processing line: ~          args.state.new_entity(:brick) do |b|~
    +    if args.inputs.mouse.click ||
    +** Processing line: ~       args.inputs.keyboard.directional_vector ||~
     - Inside source: true
     *** True Line Result
    -          args.state.new_entity(:brick) do |b|
    -** Processing line: ~            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)~
    +       args.inputs.keyboard.directional_vector ||
    +** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
     - Inside source: true
     *** True Line Result
    -            b.x = x * brick_width + (args.grid.w / 2 - args.grid.w / 4)
    -** Processing line: ~            b.y = args.grid.h - ((y + 1) * brick_height)~
    +       args.inputs.keyboard.key_down.enter ||
    +** Processing line: ~       args.inputs.keyboard.key_down.escape~
     - Inside source: true
     *** True Line Result
    -            b.y = args.grid.h - ((y + 1) * brick_height)
    -** Processing line: ~            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]~
    +       args.inputs.keyboard.key_down.escape
    +** Processing line: ~      args.state.key_event_occurred = true~
     - Inside source: true
     *** True Line Result
    -            b.rect = [b.x + 1, b.y - 1, brick_width - 2, brick_height - 2, 235, 50 * y, 52]
    +      args.state.key_event_occurred = true
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            #Add linear colliders to the brick~
    +** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
     - Inside source: true
     *** True Line Result
    -            #Add linear colliders to the brick
    -** Processing line: ~            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)~
    +    args.outputs.debug << [0, y - 50, 1280, 60].solid
    +** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -            b.collider_bottom = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x+brick_width+1), (b.y-5)], :pos, brick_height)
    -** Processing line: ~            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)~
    +    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    +** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
     - Inside source: true
     *** True Line Result
    -            b.collider_right = LinearCollider.new([(b.x+brick_width+1), (b.y-5)], [(b.x+brick_width+1), (b.y+brick_height+1)], :pos)
    -** Processing line: ~            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)~
    +    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -            b.collider_left = LinearCollider.new([(b.x-2), (b.y-5)], [(b.x-2), (b.y+brick_height+1)], :neg)
    -** Processing line: ~            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            b.collider_top = LinearCollider.new([(b.x-2), (b.y+brick_height+1)], [(b.x+brick_width+1), (b.y+brick_height+1)], :neg)
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})~
    -- Inside source: true
    +** Processing line: ~*** Advanced Rendering - Render Target Viewports - main.rb~
    +- Header detected.
     *** True Line Result
    -            # @xyCollision  = LinearCollider.new({x: @x,y: @y+@height}, {x: @x+@width, y: @y+@height})
    -** Processing line: ~            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    -- Inside source: true
    +
     *** True Line Result
    -            # @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -** Processing line: ~            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})~
    +*** Advanced Rendering - Render Target Viewports - 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/03_render_target_viewports/app/main.rb~
     - Inside source: true
     *** True Line Result
    -            # @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height})
    -** Processing line: ~            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)~
    +  # ./samples/07_advanced_rendering/03_render_target_viewports/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -            # @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height}, :pos)
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            b.broken = false~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -            b.broken = false
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            args.state.num_bricks += 1~
    -- Inside source: true
    -*** True Line Result
    -            args.state.num_bricks += 1
    -** Processing line: ~          end~
    +** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    +** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +     For example, if we want to create a new button, we would declare it as a new entity and
    +** Processing line: ~     then define its properties. (Remember, you can use state to define ANY property and it will~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +     then define its properties. (Remember, you can use state to define ANY property and it will
    +** Processing line: ~     be retained across frames.)~
     - Inside source: true
     *** True Line Result
    -    end
    +     be retained across frames.)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def reset_game args~
    +** Processing line: ~     If you have a solar system and you're creating args.state.sun and setting its image path to an~
     - Inside source: true
     *** True Line Result
    -    def reset_game args
    -** Processing line: ~      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60~
    +     If you have a solar system and you're creating args.state.sun and setting its image path to an
    +** Processing line: ~     image in the sprites folder, you would do the following:~
     - Inside source: true
     *** True Line Result
    -      if args.state.ball.xy.y < 20 && args.state.game_over_at.elapsed_time > 60
    -** Processing line: ~        #Freeze the ball~
    +     image in the sprites folder, you would do the following:
    +** Processing line: ~     (See samples/99_sample_nddnug_workshop for more details.)~
     - Inside source: true
     *** True Line Result
    -        #Freeze the ball
    -** Processing line: ~        args.state.ball.velocity.x = 0~
    +     (See samples/99_sample_nddnug_workshop for more details.)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.x = 0
    -** Processing line: ~        args.state.ball.velocity.y = 0~
    +
    +** Processing line: ~     args.state.sun ||= args.state.new_entity(:sun) do |s|~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.y = 0
    -** Processing line: ~        #Freeze the paddle~
    +     args.state.sun ||= args.state.new_entity(:sun) do |s|
    +** Processing line: ~     s.path = 'sprites/sun.png'~
     - Inside source: true
     *** True Line Result
    -        #Freeze the paddle
    -** Processing line: ~        args.state.paddle.enabled = false~
    +     s.path = 'sprites/sun.png'
    +** Processing line: ~     end~
     - Inside source: true
     *** True Line Result
    -        args.state.paddle.enabled = false
    +     end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.state.game_over_at = args.state.tick_count~
    +** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
     - Inside source: true
     *** True Line Result
    -        args.state.game_over_at = args.state.tick_count
    -** Processing line: ~      end~
    +   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    +** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
     - Inside source: true
     *** True Line Result
    -      end
    +     as Ruby code, and the placeholder is replaced with its corresponding value or result.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0~
    +** Processing line: ~     For example, if we have a variable~
     - Inside source: true
     *** True Line Result
    -      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count != 0
    -** Processing line: ~        #Display a "Game over" message~
    +     For example, if we have a variable
    +** Processing line: ~     name = "Ruby"~
     - Inside source: true
     *** True Line Result
    -        #Display a "Game over" message
    -** Processing line: ~        args.outputs.labels << [100, 100, "GAME OVER", 10]~
    +     name = "Ruby"
    +** Processing line: ~     then the line~
     - Inside source: true
     *** True Line Result
    -        args.outputs.labels << [100, 100, "GAME OVER", 10]
    -** Processing line: ~      end~
    +     then the line
    +** Processing line: ~     puts "How are you, #{name}?"~
     - Inside source: true
     *** True Line Result
    -      end
    +     puts "How are you, #{name}?"
    +** Processing line: ~     would print "How are you, Ruby?" to the console.~
    +- Inside source: true
    +*** True Line Result
    +     would print "How are you, Ruby?" to the console.
    +** Processing line: ~     (Remember, string interpolation only works with double quotes!)~
    +- Inside source: true
    +*** True Line Result
    +     (Remember, string interpolation only works with double quotes!)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #If 60 frames have passed since the game ended, restart the game~
    +** Processing line: ~   - Ternary operator (?): Similar to if statement; first evalulates whether a statement is~
     - Inside source: true
     *** True Line Result
    -      #If 60 frames have passed since the game ended, restart the game
    -** Processing line: ~      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60~
    +   - Ternary operator (?): Similar to if statement; first evalulates whether a statement is
    +** Processing line: ~     true or false, and then executes a command depending on that result.~
     - Inside source: true
     *** True Line Result
    -      if args.state.game_over_at != 0 && args.state.game_over_at.elapsed_time == 60
    -** Processing line: ~        # FIXME: only put value types in state~
    +     true or false, and then executes a command depending on that result.
    +** Processing line: ~     For example, if we had a variable~
     - Inside source: true
     *** True Line Result
    -        # FIXME: only put value types in state
    -** Processing line: ~        args.state.ball = Ball.new~
    +     For example, if we had a variable
    +** Processing line: ~     grade = 75~
     - Inside source: true
     *** True Line Result
    -        args.state.ball = Ball.new
    -** Processing line: ~~
    +     grade = 75
    +** Processing line: ~     and used the ternary operator in the command~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        # FIXME: only put value types in state~
    +     and used the ternary operator in the command
    +** Processing line: ~     pass_or_fail = grade > 65 ? "pass" : "fail"~
     - Inside source: true
     *** True Line Result
    -        # FIXME: only put value types in state
    -** Processing line: ~        args.state.paddle = Paddle.new~
    +     pass_or_fail = grade > 65 ? "pass" : "fail"
    +** Processing line: ~     then the value of pass_or_fail would be "pass" since grade's value was greater than 65.~
     - Inside source: true
     *** True Line Result
    -        args.state.paddle = Paddle.new
    +     then the value of pass_or_fail would be "pass" since grade's value was greater than 65.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.state.bricks = []~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -        args.state.bricks = []
    -** Processing line: ~        args.state.num_bricks = 0~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        args.state.num_bricks = 0
    -** Processing line: ~      end~
    +
    +** Processing line: ~   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual
    +** Processing line: ~     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~
     - Inside source: true
     *** True Line Result
    -    end
    +     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_collision args~
    -- Inside source: true
    -*** True Line Result
    -    def calc_collision args
    -** Processing line: ~      #Remove the brick if it is hit with the ball~
    -- Inside source: true
    -*** True Line Result
    -      #Remove the brick if it is hit with the ball
    -** Processing line: ~      ball = args.state.ball~
    +** Processing line: ~   - Numeric#shift_(left|right|up|down): Shifts the Numeric in the correct direction~
     - Inside source: true
     *** True Line Result
    -      ball = args.state.ball
    -** Processing line: ~      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]~
    +   - Numeric#shift_(left|right|up|down): Shifts the Numeric in the correct direction
    +** Processing line: ~     by adding or subracting.~
     - Inside source: true
     *** True Line Result
    -      ball_rect = [ball.xy.x, ball.xy.y, 20, 20]
    +     by adding or subracting.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      #Loop through each brick to see if the ball is colliding with it~
    +** Processing line: ~   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
     - Inside source: true
     *** True Line Result
    -      #Loop through each brick to see if the ball is colliding with it
    -** Processing line: ~      args.state.bricks.each do |b|~
    +   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    +** Processing line: ~     with at least four values is considered a rect. The inside_rect? function returns true~
     - Inside source: true
     *** True Line Result
    -      args.state.bricks.each do |b|
    -** Processing line: ~        if b.rect.intersect_rect?(ball_rect)~
    +     with at least four values is considered a rect. The inside_rect? function returns true
    +** Processing line: ~     or false depending on if the point is inside the rect.~
     - Inside source: true
     *** True Line Result
    -        if b.rect.intersect_rect?(ball_rect)
    -** Processing line: ~          #Run the linear collider for the brick if there is a collision~
    +     or false depending on if the point is inside the rect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          #Run the linear collider for the brick if there is a collision
    -** Processing line: ~          b[:collider_bottom].update args~
    +
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -          b[:collider_bottom].update args
    -** Processing line: ~          b[:collider_right].update args~
    +   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          b[:collider_right].update args
    -** Processing line: ~          b[:collider_left].update args~
    +
    +** Processing line: ~   - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
     - Inside source: true
     *** True Line Result
    -          b[:collider_left].update args
    -** Processing line: ~          b[:collider_top].update args~
    +   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    +** Processing line: ~     For more information about the mouse, go to mygame/documentation/07-mouse.md.~
     - Inside source: true
     *** True Line Result
    -          b[:collider_top].update args
    +     For more information about the mouse, go to mygame/documentation/07-mouse.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          b.broken = true~
    +** Processing line: ~   - args.inputs.keyboard.key_up.KEY: The value of the properties will be set~
     - Inside source: true
     *** True Line Result
    -          b.broken = true
    -** Processing line: ~        end~
    +   - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    +** Processing line: ~     to the frame  that the key_up event occurred (the frame correlates~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +     to the frame  that the key_up event occurred (the frame correlates
    +** Processing line: ~     to args.state.tick_count).~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +     to args.state.tick_count).
    +** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      args.state.bricks = args.state.bricks.reject(&:broken)~
    +     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      args.state.bricks = args.state.bricks.reject(&:broken)
    -** Processing line: ~    end~
    +
    +** Processing line: ~   - args.state.labels:~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +   - args.state.labels:
    +** Processing line: ~     The parameters for a label are~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def win_game args~
    +     The parameters for a label are
    +** Processing line: ~     1. the position (x, y)~
     - Inside source: true
     *** True Line Result
    -    def win_game args
    -** Processing line: ~      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60~
    +     1. the position (x, y)
    +** Processing line: ~     2. the text~
     - Inside source: true
     *** True Line Result
    -      if args.state.bricks.count == 0 && args.state.game_over_at.elapsed_time > 60
    -** Processing line: ~        #Freeze the ball~
    +     2. the text
    +** Processing line: ~     3. the size~
     - Inside source: true
     *** True Line Result
    -        #Freeze the ball
    -** Processing line: ~        args.state.ball.velocity.x = 0~
    +     3. the size
    +** Processing line: ~     4. the alignment~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.x = 0
    -** Processing line: ~        args.state.ball.velocity.y = 0~
    +     4. the alignment
    +** Processing line: ~     5. the color (red, green, and blue saturations)~
     - Inside source: true
     *** True Line Result
    -        args.state.ball.velocity.y = 0
    -** Processing line: ~        #Freeze the paddle~
    +     5. the color (red, green, and blue saturations)
    +** Processing line: ~     6. the alpha (or transparency)~
     - Inside source: true
     *** True Line Result
    -        #Freeze the paddle
    -** Processing line: ~        args.state.paddle.enabled = false~
    +     6. the alpha (or transparency)
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -        args.state.paddle.enabled = false
    +     For more information about labels, go to mygame/documentation/02-labels.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        args.state.game_over_at = args.state.tick_count~
    -- Inside source: true
    -*** True Line Result
    -        args.state.game_over_at = args.state.tick_count
    -** Processing line: ~      end~
    +** Processing line: ~   - args.state.lines:~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +   - args.state.lines:
    +** Processing line: ~     The parameters for a line are~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0~
    +     The parameters for a line are
    +** Processing line: ~     1. the starting position (x, y)~
     - Inside source: true
     *** True Line Result
    -      if args.state.game_over_at.elapsed_time < 60 && args.state.tick_count > 60 && args.state.bricks.count == 0
    -** Processing line: ~        #Display a "Game over" message~
    +     1. the starting position (x, y)
    +** Processing line: ~     2. the ending position (x2, y2)~
     - Inside source: true
     *** True Line Result
    -        #Display a "Game over" message
    -** Processing line: ~        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]~
    +     2. the ending position (x2, y2)
    +** Processing line: ~     3. the color (red, green, and blue saturations)~
     - Inside source: true
     *** True Line Result
    -        args.outputs.labels << [100, 100, "CONGRATULATIONS!", 10]
    -** Processing line: ~      end~
    +     3. the color (red, green, and blue saturations)
    +** Processing line: ~     4. the alpha (or transparency)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +     4. the alpha (or transparency)
    +** Processing line: ~     For more information about lines, go to mygame/documentation/04-lines.md.~
     - Inside source: true
     *** True Line Result
    -    end
    +     For more information about lines, go to mygame/documentation/04-lines.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  end~
    +** Processing line: ~   - args.state.solids (and args.state.borders):~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +   - args.state.solids (and args.state.borders):
    +** Processing line: ~     The parameters for a solid (or border) are~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +     The parameters for a solid (or border) are
    +** Processing line: ~     1. the position (x, y)~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    defaults args~
    +     1. the position (x, y)
    +** Processing line: ~     2. the width (w)~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    render args~
    +     2. the width (w)
    +** Processing line: ~     3. the height (h)~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~    calc args~
    +     3. the height (h)
    +** Processing line: ~     4. the color (r, g, b)~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~~
    +     4. the color (r, g, b)
    +** Processing line: ~     5. the alpha (or transparency)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]~
    +     5. the alpha (or transparency)
    +** Processing line: ~     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -    #args.outputs.lines << [0, 0, args.grid.w, args.grid.h]
    +     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #$tc+=1~
    +** Processing line: ~   - args.state.sprites:~
     - Inside source: true
     *** True Line Result
    -    #$tc+=1
    -** Processing line: ~    #if $tc == 5~
    +   - args.state.sprites:
    +** Processing line: ~     The parameters for a sprite are~
     - Inside source: true
     *** True Line Result
    -    #if $tc == 5
    -** Processing line: ~      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]~
    +     The parameters for a sprite are
    +** Processing line: ~     1. the position (x, y)~
     - Inside source: true
     *** True Line Result
    -      #$train << [args.state.ball.xy.x, args.state.ball.xy.y]
    -** Processing line: ~      #$tc = 0~
    +     1. the position (x, y)
    +** Processing line: ~     2. the width (w)~
     - Inside source: true
     *** True Line Result
    -      #$tc = 0
    -** Processing line: ~    #end~
    +     2. the width (w)
    +** Processing line: ~     3. the height (h)~
     - Inside source: true
     *** True Line Result
    -    #end
    -** Processing line: ~    #for t in $train~
    +     3. the height (h)
    +** Processing line: ~     4. the image path~
     - Inside source: true
     *** True Line Result
    -    #for t in $train
    -** Processing line: ~~
    +     4. the image path
    +** Processing line: ~     5. the angle~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];~
    +     5. the angle
    +** Processing line: ~     6. the alpha (or transparency)~
     - Inside source: true
     *** True Line Result
    -      #args.outputs.solids << [t[0],t[1],5,5,255,0,0];
    -** Processing line: ~    #end~
    +     6. the alpha (or transparency)
    +** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -    #end
    -** Processing line: ~  end~
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -  end
    +  =end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Physics And Collisions - Collision With Object Removal - paddle.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Physics And Collisions - Collision With Object Removal - paddle.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/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb~
    -- Inside source: true
    -*** True Line Result
    -  # ./samples/04_physics_and_collisions/10_collision_with_object_removal/app/paddle.rb
    -** Processing line: ~  class Paddle~
    +** Processing line: ~  # This sample app shows different objects that can be used when making games, such as labels,~
     - Inside source: true
     *** True Line Result
    -  class Paddle
    -** Processing line: ~    attr_accessor :enabled~
    +  # This sample app shows different objects that can be used when making games, such as labels,
    +** Processing line: ~  # lines, sprites, solids, buttons, etc. Each demo section shows how these objects can be used.~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :enabled
    +  # lines, sprites, solids, buttons, etc. Each demo section shows how these objects can be used.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def initialize ()~
    -- Inside source: true
    -*** True Line Result
    -    def initialize ()
    -** Processing line: ~      @x=WIDTH/2~
    -- Inside source: true
    -*** True Line Result
    -      @x=WIDTH/2
    -** Processing line: ~      @y=100~
    +** Processing line: ~  # Also note that state.tick_count refers to the passage of time, or current frame.~
     - Inside source: true
     *** True Line Result
    -      @y=100
    -** Processing line: ~      @width=100~
    +  # Also note that state.tick_count refers to the passage of time, or current frame.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      @width=100
    -** Processing line: ~      @height=20~
    +
    +** Processing line: ~  class TechDemo~
     - Inside source: true
     *** True Line Result
    -      @height=20
    -** Processing line: ~      @speed=10~
    +  class TechDemo
    +** Processing line: ~    attr_accessor :inputs, :state, :outputs, :grid, :args~
     - Inside source: true
     *** True Line Result
    -      @speed=10
    +    attr_accessor :inputs, :state, :outputs, :grid, :args
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    -- Inside source: true
    -*** True Line Result
    -      @xyCollision  = LinearCollider.new({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -** Processing line: ~      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)~
    +** Processing line: ~    # Calls all methods necessary for the app to run properly.~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2 = LinearCollider.new({x: @x,y: @y}, {x: @x+@width, y: @y}, :pos)
    -** Processing line: ~      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +    # Calls all methods necessary for the app to run properly.
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3 = LinearCollider.new({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -** Processing line: ~      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)~
    +    def tick
    +** Processing line: ~      labels_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4 = LinearCollider.new({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5}, :pos)
    -** Processing line: ~~
    +      labels_tech_demo
    +** Processing line: ~      lines_tech_demo~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      @enabled = true~
    +      lines_tech_demo
    +** Processing line: ~      solids_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @enabled = true
    -** Processing line: ~    end~
    +      solids_tech_demo
    +** Processing line: ~      borders_tech_demo~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      borders_tech_demo
    +** Processing line: ~      sprites_tech_demo~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def update args~
    +      sprites_tech_demo
    +** Processing line: ~      keyboards_tech_demo~
     - Inside source: true
     *** True Line Result
    -    def update args
    -** Processing line: ~      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})~
    +      keyboards_tech_demo
    +** Processing line: ~      controller_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision.resetPoints({x: @x,y: @y+@height+5}, {x: @x+@width, y: @y+@height+5})
    -** Processing line: ~      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})~
    +      controller_tech_demo
    +** Processing line: ~      mouse_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2.resetPoints({x: @x,y: @y}, {x: @x+@width, y: @y})
    -** Processing line: ~      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})~
    +      mouse_tech_demo
    +** Processing line: ~      point_to_rect_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3.resetPoints({x: @x,y: @y}, {x: @x, y: @y+@height+5})
    -** Processing line: ~      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})~
    +      point_to_rect_tech_demo
    +** Processing line: ~      rect_to_rect_tech_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4.resetPoints({x: @x+@width,y: @y}, {x: @x+@width, y: @y+@height+5})
    -** Processing line: ~~
    +      rect_to_rect_tech_demo
    +** Processing line: ~      button_tech_demo~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      @xyCollision.update  args~
    +      button_tech_demo
    +** Processing line: ~      export_game_state_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision.update  args
    -** Processing line: ~      @xyCollision2.update args~
    +      export_game_state_demo
    +** Processing line: ~      window_state_demo~
     - Inside source: true
     *** True Line Result
    -      @xyCollision2.update args
    -** Processing line: ~      @xyCollision3.update args~
    +      window_state_demo
    +** Processing line: ~      render_seperators~
     - Inside source: true
     *** True Line Result
    -      @xyCollision3.update args
    -** Processing line: ~      @xyCollision4.update args~
    +      render_seperators
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      @xyCollision4.update args
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      args.inputs.keyboard.key_held.left  ||= false~
    -- Inside source: true
    -*** True Line Result
    -      args.inputs.keyboard.key_held.left  ||= false
    -** Processing line: ~      args.inputs.keyboard.key_held.right  ||= false~
    +** Processing line: ~    # Shows output of different kinds of labels on the screen~
     - Inside source: true
     *** True Line Result
    -      args.inputs.keyboard.key_held.right  ||= false
    -** Processing line: ~~
    +    # Shows output of different kinds of labels on the screen
    +** Processing line: ~    def labels_tech_demo~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)~
    +    def labels_tech_demo
    +** Processing line: ~      outputs.labels << [grid.left.shift_right(5), grid.top.shift_down(5), "This is a label located at the top left."]~
     - Inside source: true
     *** True Line Result
    -      if not (args.inputs.keyboard.key_held.left == args.inputs.keyboard.key_held.right)
    -** Processing line: ~        if args.inputs.keyboard.key_held.left && @enabled~
    +      outputs.labels << [grid.left.shift_right(5), grid.top.shift_down(5), "This is a label located at the top left."]
    +** Processing line: ~      outputs.labels << [grid.left.shift_right(5), grid.bottom.shift_up(30), "This is a label located at the bottom left."]~
     - Inside source: true
     *** True Line Result
    -        if args.inputs.keyboard.key_held.left && @enabled
    -** Processing line: ~          @x-=@speed~
    +      outputs.labels << [grid.left.shift_right(5), grid.bottom.shift_up(30), "This is a label located at the bottom left."]
    +** Processing line: ~      outputs.labels << [ 5, 690, "Labels (x, y, text, size, align, r, g, b, a)"]~
     - Inside source: true
     *** True Line Result
    -          @x-=@speed
    -** Processing line: ~        elsif args.inputs.keyboard.key_held.right && @enabled~
    +      outputs.labels << [ 5, 690, "Labels (x, y, text, size, align, r, g, b, a)"]
    +** Processing line: ~      outputs.labels << [ 5, 660, "Smaller label.",  -2]~
     - Inside source: true
     *** True Line Result
    -        elsif args.inputs.keyboard.key_held.right && @enabled
    -** Processing line: ~          @x+=@speed~
    +      outputs.labels << [ 5, 660, "Smaller label.",  -2]
    +** Processing line: ~      outputs.labels << [ 5, 630, "Small label.",    -1]~
     - Inside source: true
     *** True Line Result
    -          @x+=@speed
    -** Processing line: ~        end~
    +      outputs.labels << [ 5, 630, "Small label.",    -1]
    +** Processing line: ~      outputs.labels << [ 5, 600, "Medium label.",    0]~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      outputs.labels << [ 5, 600, "Medium label.",    0]
    +** Processing line: ~      outputs.labels << [ 5, 570, "Large label.",     1]~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      outputs.labels << [ 5, 570, "Large label.",     1]
    +** Processing line: ~      outputs.labels << [ 5, 540, "Larger label.",    2]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      xmin =WIDTH/4~
    +      outputs.labels << [ 5, 540, "Larger label.",    2]
    +** Processing line: ~      outputs.labels << [300, 660, "Left aligned.",    0, 2]~
     - Inside source: true
     *** True Line Result
    -      xmin =WIDTH/4
    -** Processing line: ~      xmax = 3*(WIDTH/4)~
    +      outputs.labels << [300, 660, "Left aligned.",    0, 2]
    +** Processing line: ~      outputs.labels << [300, 640, "Center aligned.",  0, 1]~
     - Inside source: true
     *** True Line Result
    -      xmax = 3*(WIDTH/4)
    -** Processing line: ~      @x = (@x+@width > xmax) ? xmax-@width : (@x xmax) ? xmax-@width : (@x")~
     - Inside source: true
     *** True Line Result
    -  # This sample app is a classic game of Tic Tac Toe.
    +      outputs.labels << small_label(x, 15, "Click inside the blue box maybe ---->")
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class TicTacToe~
    +** Processing line: ~      box = [765, 370, 50, 50, 0, 0, 170] # blue box~
     - Inside source: true
     *** True Line Result
    -  class TicTacToe
    -** Processing line: ~    attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk~
    +      box = [765, 370, 50, 50, 0, 0, 170] # blue box
    +** Processing line: ~      outputs.borders << box~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :_, :state, :outputs, :inputs, :grid, :gtk
    +      outputs.borders << box
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Starts the game with player x's turn and creates an array (to_a) for space combinations.~
    +** Processing line: ~      if state.last_mouse_click # if the mouse was clicked~
     - Inside source: true
     *** True Line Result
    -    # Starts the game with player x's turn and creates an array (to_a) for space combinations.
    -** Processing line: ~    # Calls methods necessary for the game to run properly.~
    +      if state.last_mouse_click # if the mouse was clicked
    +** Processing line: ~        if state.last_mouse_click.point.inside_rect? box # if mouse clicked inside box~
     - Inside source: true
     *** True Line Result
    -    # Calls methods necessary for the game to run properly.
    -** Processing line: ~    def tick~
    +        if state.last_mouse_click.point.inside_rect? box # if mouse clicked inside box
    +** Processing line: ~          outputs.labels << small_label(x, 16, "Mouse click happened inside the box.")~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      state.current_turn ||= :x~
    +          outputs.labels << small_label(x, 16, "Mouse click happened inside the box.")
    +** Processing line: ~        else # otherwise, if mouse was clicked outside the box~
     - Inside source: true
     *** True Line Result
    -      state.current_turn ||= :x
    -** Processing line: ~      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a~
    +        else # otherwise, if mouse was clicked outside the box
    +** Processing line: ~          outputs.labels << small_label(x, 16, "Mouse click happened outside the box.")~
     - Inside source: true
     *** True Line Result
    -      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
    -** Processing line: ~      render_board~
    +          outputs.labels << small_label(x, 16, "Mouse click happened outside the box.")
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      render_board
    -** Processing line: ~      input_board~
    +        end
    +** Processing line: ~      else # otherwise, if was not clicked at all~
     - Inside source: true
     *** True Line Result
    -      input_board
    -** Processing line: ~    end~
    +      else # otherwise, if was not clicked at all
    +** Processing line: ~        outputs.labels << small_label(x, 16, "Mouse click has not occurred yet.") # output if the mouse was not clicked~
     - Inside source: true
     *** True Line Result
    -    end
    +        outputs.labels << small_label(x, 16, "Mouse click has not occurred yet.") # output if the mouse was not clicked
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.~
    +** Processing line: ~      # border around mouse input demo section~
     - Inside source: true
     *** True Line Result
    -    # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
    -** Processing line: ~    def render_board~
    +      # border around mouse input demo section
    +** Processing line: ~      outputs.borders << [455, row_to_px(14), 360, row_to_px(11).shift_up(5) - row_to_px(14)]~
     - Inside source: true
     *** True Line Result
    -    def render_board
    -** Processing line: ~      square_size = 80~
    +      outputs.borders << [455, row_to_px(14), 360, row_to_px(11).shift_up(5) - row_to_px(14)]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      square_size = 80
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Positions the game's board in the center of the screen.~
    +** Processing line: ~    # Outputs a red box onto the screen. A mouse click from the user inside of the red box will output~
     - Inside source: true
     *** True Line Result
    -      # Positions the game's board in the center of the screen.
    -** Processing line: ~      # Try removing what follows grid.w_half or grid.h_half and see how the position changes!~
    +    # Outputs a red box onto the screen. A mouse click from the user inside of the red box will output
    +** Processing line: ~    # a smaller box. If two small boxes are inside of the red box, it will be determined whether or not~
     - Inside source: true
     *** True Line Result
    -      # Try removing what follows grid.w_half or grid.h_half and see how the position changes!
    -** Processing line: ~      board_left = grid.w_half - square_size * 1.5~
    +    # a smaller box. If two small boxes are inside of the red box, it will be determined whether or not
    +** Processing line: ~    # they intersect.~
     - Inside source: true
     *** True Line Result
    -      board_left = grid.w_half - square_size * 1.5
    -** Processing line: ~      board_top  = grid.h_half - square_size * 1.5~
    +    # they intersect.
    +** Processing line: ~    def rect_to_rect_tech_demo~
     - Inside source: true
     *** True Line Result
    -      board_top  = grid.h_half - square_size * 1.5
    -** Processing line: ~~
    +    def rect_to_rect_tech_demo
    +** Processing line: ~      x = 460~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # At first glance, the add(1) looks pretty trivial. But if you remove it,~
    +      x = 460
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # At first glance, the add(1) looks pretty trivial. But if you remove it,
    -** Processing line: ~      # you'll see that the positioning of the board would be skewed without it!~
    +
    +** Processing line: ~      outputs.labels << small_label(x, 17.5, "Click inside the red box below.") # label with instructions~
     - Inside source: true
     *** True Line Result
    -      # you'll see that the positioning of the board would be skewed without it!
    -** Processing line: ~      # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares~
    +      outputs.labels << small_label(x, 17.5, "Click inside the red box below.") # label with instructions
    +** Processing line: ~      red_box = [460, 250, 355, 90, 170, 0, 0] # definition of the red box~
     - Inside source: true
     *** True Line Result
    -      # Or if you put 2 in the parenthesis, the pieces will be placed in the wrong squares
    -** Processing line: ~      # due to the change in board placement.~
    +      red_box = [460, 250, 355, 90, 170, 0, 0] # definition of the red box
    +** Processing line: ~      outputs.borders << red_box # output as a border (not filled in)~
     - Inside source: true
     *** True Line Result
    -      # due to the change in board placement.
    -** Processing line: ~      outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces~
    +      outputs.borders << red_box # output as a border (not filled in)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << all_spaces do |x, y, space| # outputs borders for all board spaces
    -** Processing line: ~        space.border ||= [~
    +
    +** Processing line: ~      # If the mouse is clicked inside the red box, two collision boxes are created.~
     - Inside source: true
     *** True Line Result
    -        space.border ||= [
    -** Processing line: ~          board_left + x.add(1) * square_size, # space.border is initialized using this definition~
    +      # If the mouse is clicked inside the red box, two collision boxes are created.
    +** Processing line: ~      if inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -          board_left + x.add(1) * square_size, # space.border is initialized using this definition
    -** Processing line: ~          board_top  + y.add(1) * square_size,~
    +      if inputs.mouse.click
    +** Processing line: ~        if inputs.mouse.click.point.inside_rect? red_box~
     - Inside source: true
     *** True Line Result
    -          board_top  + y.add(1) * square_size,
    -** Processing line: ~          square_size,~
    +        if inputs.mouse.click.point.inside_rect? red_box
    +** Processing line: ~          if !state.box_collision_one # if the collision_one box does not yet have a definition~
     - Inside source: true
     *** True Line Result
    -          square_size,
    -** Processing line: ~          square_size~
    +          if !state.box_collision_one # if the collision_one box does not yet have a definition
    +** Processing line: ~            # Subtracts 25 from the x and y positions of the click point in order to make the click point the center of the box.~
     - Inside source: true
     *** True Line Result
    -          square_size
    -** Processing line: ~        ]~
    +            # Subtracts 25 from the x and y positions of the click point in order to make the click point the center of the box.
    +** Processing line: ~            # You can try deleting the subtraction to see how it impacts the box placement.~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~      end~
    +            # You can try deleting the subtraction to see how it impacts the box placement.
    +** Processing line: ~            state.box_collision_one = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 180, 0,   0, 180]  # sets definition~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +            state.box_collision_one = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 180, 0,   0, 180]  # sets definition
    +** Processing line: ~          elsif !state.box_collision_two # if collision_two does not yet have a definition~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Again, the calculations ensure that the piece is placed in the center of the grid square.~
    +          elsif !state.box_collision_two # if collision_two does not yet have a definition
    +** Processing line: ~            state.box_collision_two = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50,   0, 0, 180, 180] # sets definition~
     - Inside source: true
     *** True Line Result
    -      # Again, the calculations ensure that the piece is placed in the center of the grid square.
    -** Processing line: ~      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.~
    +            state.box_collision_two = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50,   0, 0, 180, 180] # sets definition
    +** Processing line: ~          else~
     - Inside source: true
     *** True Line Result
    -      # Remove the '- 20' and the piece will be placed at the top of the grid square instead of the center.
    -** Processing line: ~      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board~
    +          else
    +** Processing line: ~            state.box_collision_one = nil # both boxes are empty~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << filled_spaces do |x, y, space| # put label in each filled space of board
    -** Processing line: ~            label board_left + x.add(1) * square_size + square_size.fdiv(2),~
    +            state.box_collision_one = nil # both boxes are empty
    +** Processing line: ~            state.box_collision_two = nil~
     - Inside source: true
     *** True Line Result
    -            label board_left + x.add(1) * square_size + square_size.fdiv(2),
    -** Processing line: ~            board_top  + y.add(1) * square_size + square_size - 20,~
    +            state.box_collision_two = nil
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -            board_top  + y.add(1) * square_size + square_size - 20,
    -** Processing line: ~            space.piece # text of label, either "x" or "o"~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -            space.piece # text of label, either "x" or "o"
    +        end
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -40624,86 +48891,82 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Uses a label to output whether x or o won, or if a draw occurred.~
    -- Inside source: true
    -*** True Line Result
    -      # Uses a label to output whether x or o won, or if a draw occurred.
    -** Processing line: ~      # If the game is ongoing, a label shows whose turn it currently is.~
    +** Processing line: ~      # If collision boxes exist, they are output onto screen inside the red box as solids~
     - Inside source: true
     *** True Line Result
    -      # If the game is ongoing, a label shows whose turn it currently is.
    -** Processing line: ~      outputs.labels << if state.x_won~
    +      # If collision boxes exist, they are output onto screen inside the red box as solids
    +** Processing line: ~      if state.box_collision_one~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << if state.x_won
    -** Processing line: ~                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top~
    +      if state.box_collision_one
    +** Processing line: ~        outputs.solids << state.box_collision_one~
     - Inside source: true
     *** True Line Result
    -                          label grid.w_half, grid.top - 80, "x won" # the '-80' positions the label 80 pixels lower than top
    -** Processing line: ~                        elsif state.o_won~
    +        outputs.solids << state.box_collision_one
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                        elsif state.o_won
    -** Processing line: ~                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                          label grid.w_half, grid.top - 80, "o won" # grid.w_half positions the label in the center horizontally
    -** Processing line: ~                        elsif state.draw~
    +
    +** Processing line: ~      if state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -                        elsif state.draw
    -** Processing line: ~                          label grid.w_half, grid.top - 80, "a draw"~
    +      if state.box_collision_two
    +** Processing line: ~        outputs.solids << state.box_collision_two~
     - Inside source: true
     *** True Line Result
    -                          label grid.w_half, grid.top - 80, "a draw"
    -** Processing line: ~                        else # if no one won and the game is ongoing~
    +        outputs.solids << state.box_collision_two
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                        else # if no one won and the game is ongoing
    -** Processing line: ~                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                          label grid.w_half, grid.top - 80, "turn: #{state.current_turn}"
    -** Processing line: ~                        end~
    +
    +** Processing line: ~      # Outputs whether or not the two collision boxes intersect.~
     - Inside source: true
     *** True Line Result
    -                        end
    -** Processing line: ~    end~
    +      # Outputs whether or not the two collision boxes intersect.
    +** Processing line: ~      if state.box_collision_one && state.box_collision_two # if both collision_boxes are defined (and not nil or empty)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      if state.box_collision_one && state.box_collision_two # if both collision_boxes are defined (and not nil or empty)
    +** Processing line: ~        if state.box_collision_one.intersect_rect? state.box_collision_two # if the two boxes intersect~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls the methods responsible for handling user input and determining the winner.~
    +        if state.box_collision_one.intersect_rect? state.box_collision_two # if the two boxes intersect
    +** Processing line: ~          outputs.labels << small_label(x, 23.5, 'The boxes intersect.')~
     - Inside source: true
     *** True Line Result
    -    # Calls the methods responsible for handling user input and determining the winner.
    -** Processing line: ~    # Does nothing unless the mouse is clicked.~
    +          outputs.labels << small_label(x, 23.5, 'The boxes intersect.')
    +** Processing line: ~        else # otherwise, if the two boxes do not intersect~
     - Inside source: true
     *** True Line Result
    -    # Does nothing unless the mouse is clicked.
    -** Processing line: ~    def input_board~
    +        else # otherwise, if the two boxes do not intersect
    +** Processing line: ~          outputs.labels << small_label(x, 23.5, 'The boxes do not intersect.')~
     - Inside source: true
     *** True Line Result
    -    def input_board
    -** Processing line: ~      return unless inputs.mouse.click~
    +          outputs.labels << small_label(x, 23.5, 'The boxes do not intersect.')
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      return unless inputs.mouse.click
    -** Processing line: ~      input_place_piece~
    +        end
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -      input_place_piece
    -** Processing line: ~      input_restart_game~
    +      else
    +** Processing line: ~        outputs.labels << small_label(x, 23.5, '--') # if the two boxes are not defined (are nil or empty), this label is output~
     - Inside source: true
     *** True Line Result
    -      input_restart_game
    -** Processing line: ~      determine_winner~
    +        outputs.labels << small_label(x, 23.5, '--') # if the two boxes are not defined (are nil or empty), this label is output
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      determine_winner
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -40712,98 +48975,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Handles user input for placing pieces on the board.~
    +** Processing line: ~    # Creates a button and outputs it onto the screen using labels and borders.~
     - Inside source: true
     *** True Line Result
    -    # Handles user input for placing pieces on the board.
    -** Processing line: ~    def input_place_piece~
    +    # Creates a button and outputs it onto the screen using labels and borders.
    +** Processing line: ~    # If the button is clicked, the color changes to make it look faded.~
     - Inside source: true
     *** True Line Result
    -    def input_place_piece
    -** Processing line: ~      return if state.game_over~
    +    # If the button is clicked, the color changes to make it look faded.
    +** Processing line: ~    def button_tech_demo~
     - Inside source: true
     *** True Line Result
    -      return if state.game_over
    -** Processing line: ~~
    +    def button_tech_demo
    +** Processing line: ~      x, y, w, h = 460, 160, 300, 50~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already~
    +      x, y, w, h = 460, 160, 300, 50
    +** Processing line: ~      state.button        ||= state.new_entity(:button_with_fade)~
     - Inside source: true
     *** True Line Result
    -      # Checks to find the space that the mouse was clicked inside of, and makes sure the space does not already
    -** Processing line: ~      # have a piece in it.~
    +      state.button        ||= state.new_entity(:button_with_fade)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # have a piece in it.
    -** Processing line: ~      __, __, space = all_spaces.find do |__, __, space|~
    +
    +** Processing line: ~      # Adds w.half to x and h.half + 10 to y in order to display the text inside the button's borders.~
     - Inside source: true
     *** True Line Result
    -      __, __, space = all_spaces.find do |__, __, space|
    -** Processing line: ~        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece~
    +      # Adds w.half to x and h.half + 10 to y in order to display the text inside the button's borders.
    +** Processing line: ~      state.button.label  ||= [x + w.half, y + h.half + 10, "click me and watch me fade", 0, 1]~
     - Inside source: true
     *** True Line Result
    -        inputs.mouse.click.point.inside_rect?(space.border) && !space.piece
    -** Processing line: ~      end~
    +      state.button.label  ||= [x + w.half, y + h.half + 10, "click me and watch me fade", 0, 1]
    +** Processing line: ~      state.button.border ||= [x, y, w, h]~
     - Inside source: true
     *** True Line Result
    -      end
    +      state.button.border ||= [x, y, w, h]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # The piece that goes into the space belongs to the player whose turn it currently is.~
    +** Processing line: ~      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.button.border) # if mouse is clicked, and clicked inside button's border~
     - Inside source: true
     *** True Line Result
    -      # The piece that goes into the space belongs to the player whose turn it currently is.
    -** Processing line: ~      return unless space~
    +      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.button.border) # if mouse is clicked, and clicked inside button's border
    +** Processing line: ~        state.button.clicked_at = inputs.mouse.click.created_at # stores the time the click occurred~
     - Inside source: true
     *** True Line Result
    -      return unless space
    -** Processing line: ~      space.piece = state.current_turn~
    +        state.button.clicked_at = inputs.mouse.click.created_at # stores the time the click occurred
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      space.piece = state.current_turn
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # This ternary operator statement allows us to change the current player's turn.~
    +** Processing line: ~      outputs.labels << state.button.label~
     - Inside source: true
     *** True Line Result
    -      # This ternary operator statement allows us to change the current player's turn.
    -** Processing line: ~      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.~
    +      outputs.labels << state.button.label
    +** Processing line: ~      outputs.borders << state.button.border~
     - Inside source: true
     *** True Line Result
    -      # If it is currently x's turn, it becomes o's turn. If it is not x's turn, it become's x's turn.
    -** Processing line: ~      state.current_turn = state.current_turn == :x ? :o : :x~
    +      outputs.borders << state.button.border
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.current_turn = state.current_turn == :x ? :o : :x
    -** Processing line: ~    end~
    +
    +** Processing line: ~      if state.button.clicked_at # if button was clicked (variable has a value and is not nil)~
     - Inside source: true
     *** True Line Result
    -    end
    +      if state.button.clicked_at # if button was clicked (variable has a value and is not nil)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Resets the game.~
    +** Processing line: ~        # The appearance of the button changes for 0.25 seconds after the time the button is clicked at.~
     - Inside source: true
     *** True Line Result
    -    # Resets the game.
    -** Processing line: ~    def input_restart_game~
    +        # The appearance of the button changes for 0.25 seconds after the time the button is clicked at.
    +** Processing line: ~        # The color changes (rgb is set to 0, 180, 80) and the transparency gradually changes.~
     - Inside source: true
     *** True Line Result
    -    def input_restart_game
    -** Processing line: ~      return unless state.game_over~
    +        # The color changes (rgb is set to 0, 180, 80) and the transparency gradually changes.
    +** Processing line: ~        # Change 0.25 to 1.25 and notice that the transparency takes longer to return to normal.~
     - Inside source: true
     *** True Line Result
    -      return unless state.game_over
    -** Processing line: ~      gtk.reset~
    +        # Change 0.25 to 1.25 and notice that the transparency takes longer to return to normal.
    +** Processing line: ~        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.button.clicked_at.ease(0.25.seconds, :flip)]~
     - Inside source: true
     *** True Line Result
    -      gtk.reset
    +        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.button.clicked_at.ease(0.25.seconds, :flip)]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -40812,38 +49079,34 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Checks if x or o won the game.~
    -- Inside source: true
    -*** True Line Result
    -    # Checks if x or o won the game.
    -** Processing line: ~    # If neither player wins and all nine squares are filled, a draw happens.~
    +** Processing line: ~    # Creates a new button by declaring it as a new entity, and sets values.~
     - Inside source: true
     *** True Line Result
    -    # If neither player wins and all nine squares are filled, a draw happens.
    -** Processing line: ~    # Once a player is chosen as the winner or a draw happens, the game is over.~
    +    # Creates a new button by declaring it as a new entity, and sets values.
    +** Processing line: ~    def new_button_prefab x, y, message~
     - Inside source: true
     *** True Line Result
    -    # Once a player is chosen as the winner or a draw happens, the game is over.
    -** Processing line: ~    def determine_winner~
    +    def new_button_prefab x, y, message
    +** Processing line: ~      w, h = 300, 50~
     - Inside source: true
     *** True Line Result
    -    def determine_winner
    -** Processing line: ~      state.x_won = won? :x # evaluates to either true or false (boolean values)~
    +      w, h = 300, 50
    +** Processing line: ~      button        = state.new_entity(:button_with_fade)~
     - Inside source: true
     *** True Line Result
    -      state.x_won = won? :x # evaluates to either true or false (boolean values)
    -** Processing line: ~      state.o_won = won? :o~
    +      button        = state.new_entity(:button_with_fade)
    +** Processing line: ~      button.label  = [x + w.half, y + h.half + 10, message, 0, 1] # '+ 10' keeps label's text within button's borders~
     - Inside source: true
     *** True Line Result
    -      state.o_won = won? :o
    -** Processing line: ~      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won~
    +      button.label  = [x + w.half, y + h.half + 10, message, 0, 1] # '+ 10' keeps label's text within button's borders
    +** Processing line: ~      button.border = [x, y, w, h] # sets border definition~
     - Inside source: true
     *** True Line Result
    -      state.draw = true if filled_spaces.length == 9 && !state.x_won && !state.o_won
    -** Processing line: ~      state.game_over = state.x_won || state.o_won || state.draw~
    +      button.border = [x, y, w, h] # sets border definition
    +** Processing line: ~      button~
     - Inside source: true
     *** True Line Result
    -      state.game_over = state.x_won || state.o_won || state.draw
    +      button
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -40852,94 +49115,58 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Determines if a player won by checking if there is a horizontal match or vertical match.~
    +** Processing line: ~    # If the mouse has been clicked and the click's location is inside of the button's border, that means~
     - Inside source: true
     *** True Line Result
    -    # Determines if a player won by checking if there is a horizontal match or vertical match.
    -** Processing line: ~    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.~
    +    # If the mouse has been clicked and the click's location is inside of the button's border, that means
    +** Processing line: ~    # that the button has been clicked. This method returns a boolean value.~
     - Inside source: true
     *** True Line Result
    -    # Horizontal_match and vertical_match have boolean values. If either is true, the game has been won.
    -** Processing line: ~    def won? piece~
    +    # that the button has been clicked. This method returns a boolean value.
    +** Processing line: ~    def button_clicked? button~
     - Inside source: true
     *** True Line Result
    -    def won? piece
    -** Processing line: ~      # performs action on all space combinations~
    +    def button_clicked? button
    +** Processing line: ~      inputs.mouse.click && inputs.mouse.click.point.inside_rect?(button.border)~
     - Inside source: true
     *** True Line Result
    -      # performs action on all space combinations
    -** Processing line: ~      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|~
    +      inputs.mouse.click && inputs.mouse.click.point.inside_rect?(button.border)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      won = [[-1, 0, 1]].product([-1, 0, 1]).map do |xs, y|
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # Checks if the 3 grid spaces with the same y value (or same row) and~
    -- Inside source: true
    -*** True Line Result
    -        # Checks if the 3 grid spaces with the same y value (or same row) and
    -** Processing line: ~        # x values that are next to each other have pieces that belong to the same player.~
    -- Inside source: true
    -*** True Line Result
    -        # x values that are next to each other have pieces that belong to the same player.
    -** Processing line: ~        # Remember, the value of piece is equal to the current turn (which is the player).~
    +** Processing line: ~    # Determines if button was clicked, and changes its appearance if it is clicked~
     - Inside source: true
     *** True Line Result
    -        # Remember, the value of piece is equal to the current turn (which is the player).
    -** Processing line: ~        horizontal_match = state.spaces[xs[0]][y].piece == piece &&~
    +    # Determines if button was clicked, and changes its appearance if it is clicked
    +** Processing line: ~    def tick_button_prefab button~
     - Inside source: true
     *** True Line Result
    -        horizontal_match = state.spaces[xs[0]][y].piece == piece &&
    -** Processing line: ~                           state.spaces[xs[1]][y].piece == piece &&~
    +    def tick_button_prefab button
    +** Processing line: ~      outputs.labels << button.label # outputs button's label and border~
     - Inside source: true
     *** True Line Result
    -                           state.spaces[xs[1]][y].piece == piece &&
    -** Processing line: ~                           state.spaces[xs[2]][y].piece == piece~
    +      outputs.labels << button.label # outputs button's label and border
    +** Processing line: ~      outputs.borders << button.border~
     - Inside source: true
     *** True Line Result
    -                           state.spaces[xs[2]][y].piece == piece
    +      outputs.borders << button.border
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # Checks if the 3 grid spaces with the same x value (or same column) and~
    -- Inside source: true
    -*** True Line Result
    -        # Checks if the 3 grid spaces with the same x value (or same column) and
    -** Processing line: ~        # y values that are next to each other have pieces that belong to the same player.~
    -- Inside source: true
    -*** True Line Result
    -        # y values that are next to each other have pieces that belong to the same player.
    -** Processing line: ~        # The && represents an "and" statement: if even one part of the statement is false,~
    -- Inside source: true
    -*** True Line Result
    -        # The && represents an "and" statement: if even one part of the statement is false,
    -** Processing line: ~        # the entire statement evaluates to false.~
    -- Inside source: true
    -*** True Line Result
    -        # the entire statement evaluates to false.
    -** Processing line: ~        vertical_match = state.spaces[y][xs[0]].piece == piece &&~
    -- Inside source: true
    -*** True Line Result
    -        vertical_match = state.spaces[y][xs[0]].piece == piece &&
    -** Processing line: ~                         state.spaces[y][xs[1]].piece == piece &&~
    -- Inside source: true
    -*** True Line Result
    -                         state.spaces[y][xs[1]].piece == piece &&
    -** Processing line: ~                         state.spaces[y][xs[2]].piece == piece~
    -- Inside source: true
    -*** True Line Result
    -                         state.spaces[y][xs[2]].piece == piece
    -** Processing line: ~~
    +** Processing line: ~      if button_clicked? button # if button is clicked~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        horizontal_match || vertical_match # if either is true, true is returned~
    +      if button_clicked? button # if button is clicked
    +** Processing line: ~        button.clicked_at = inputs.mouse.click.created_at # stores the time that the button was clicked~
     - Inside source: true
     *** True Line Result
    -        horizontal_match || vertical_match # if either is true, true is returned
    +        button.clicked_at = inputs.mouse.click.created_at # stores the time that the button was clicked
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -40948,62 +49175,62 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.~
    +** Processing line: ~      if button.clicked_at # if clicked_at has a frame value and is not nil~
     - Inside source: true
     *** True Line Result
    -      # Sees if there is a diagonal match, starting from the bottom left and ending at the top right.
    -** Processing line: ~      # Is added to won regardless of whether the statement is true or false.~
    +      if button.clicked_at # if clicked_at has a frame value and is not nil
    +** Processing line: ~        # button is output; color changes and transparency changes for 0.25 seconds after click occurs~
     - Inside source: true
     *** True Line Result
    -      # Is added to won regardless of whether the statement is true or false.
    -** Processing line: ~      won << (state.spaces[-1][-1].piece == piece && # bottom left~
    +        # button is output; color changes and transparency changes for 0.25 seconds after click occurs
    +** Processing line: ~        outputs.solids << [button.border.x, button.border.y, button.border.w, button.border.h,~
     - Inside source: true
     *** True Line Result
    -      won << (state.spaces[-1][-1].piece == piece && # bottom left
    -** Processing line: ~              state.spaces[ 0][ 0].piece == piece && # center~
    +        outputs.solids << [button.border.x, button.border.y, button.border.w, button.border.h,
    +** Processing line: ~                           0, 180, 80, 255 * button.clicked_at.ease(0.25.seconds, :flip)] # transparency changes for 0.25 seconds~
     - Inside source: true
     *** True Line Result
    -              state.spaces[ 0][ 0].piece == piece && # center
    -** Processing line: ~              state.spaces[ 1][ 1].piece == piece)   # top right~
    +                           0, 180, 80, 255 * button.clicked_at.ease(0.25.seconds, :flip)] # transparency changes for 0.25 seconds
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -              state.spaces[ 1][ 1].piece == piece)   # top right
    -** Processing line: ~~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # Sees if there is a diagonal match, starting at the bottom right and ending at the top left
    -** Processing line: ~      # and is added to won.~
    +
    +** Processing line: ~    # Exports the app's game state if the export button is clicked.~
     - Inside source: true
     *** True Line Result
    -      # and is added to won.
    -** Processing line: ~      won << (state.spaces[ 1][-1].piece == piece && # bottom right~
    +    # Exports the app's game state if the export button is clicked.
    +** Processing line: ~    def export_game_state_demo~
     - Inside source: true
     *** True Line Result
    -      won << (state.spaces[ 1][-1].piece == piece && # bottom right
    -** Processing line: ~              state.spaces[ 0][ 0].piece == piece && # center~
    +    def export_game_state_demo
    +** Processing line: ~      state.export_game_state_button ||= new_button_prefab(460, 100, "click to export app state")~
     - Inside source: true
     *** True Line Result
    -              state.spaces[ 0][ 0].piece == piece && # center
    -** Processing line: ~              state.spaces[-1][ 1].piece == piece)   # top left~
    +      state.export_game_state_button ||= new_button_prefab(460, 100, "click to export app state")
    +** Processing line: ~      tick_button_prefab(state.export_game_state_button) # calls method to output button~
     - Inside source: true
     *** True Line Result
    -              state.spaces[-1][ 1].piece == piece)   # top left
    -** Processing line: ~~
    +      tick_button_prefab(state.export_game_state_button) # calls method to output button
    +** Processing line: ~      if button_clicked? state.export_game_state_button # if the export button is clicked~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Any false statements (meaning false diagonal matches) are rejected from won~
    +      if button_clicked? state.export_game_state_button # if the export button is clicked
    +** Processing line: ~        args.gtk.export! "Exported from clicking the export button in the tech demo." # the export occurs~
     - Inside source: true
     *** True Line Result
    -      # Any false statements (meaning false diagonal matches) are rejected from won
    -** Processing line: ~      won.reject_false.any?~
    +        args.gtk.export! "Exported from clicking the export button in the tech demo." # the export occurs
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      won.reject_false.any?
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -41012,58 +49239,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.~
    -- Inside source: true
    -*** True Line Result
    -    # Defines filled spaces on the board by rejecting all spaces that do not have game pieces in them.
    -** Processing line: ~    # The ! before a statement means "not". For example, we are rejecting any space combinations that do~
    -- Inside source: true
    -*** True Line Result
    -    # The ! before a statement means "not". For example, we are rejecting any space combinations that do
    -** Processing line: ~    # NOT have pieces in them.~
    -- Inside source: true
    -*** True Line Result
    -    # NOT have pieces in them.
    -** Processing line: ~    def filled_spaces~
    +** Processing line: ~    # The mouse and keyboard focus are set to "yes" when the Dragonruby window is the active window.~
     - Inside source: true
     *** True Line Result
    -    def filled_spaces
    -** Processing line: ~      state.space_combinations~
    +    # The mouse and keyboard focus are set to "yes" when the Dragonruby window is the active window.
    +** Processing line: ~    def window_state_demo~
     - Inside source: true
     *** True Line Result
    -      state.space_combinations
    -** Processing line: ~        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them~
    +    def window_state_demo
    +** Processing line: ~      m = $gtk.args.inputs.mouse.has_focus ? 'Y' : 'N' # ternary operator (similar to if statement)~
     - Inside source: true
     *** True Line Result
    -        .reject { |x, y| !state.spaces[x][y].piece } # reject spaces with no pieces in them
    -** Processing line: ~        .map do |x, y|~
    +      m = $gtk.args.inputs.mouse.has_focus ? 'Y' : 'N' # ternary operator (similar to if statement)
    +** Processing line: ~      k = $gtk.args.inputs.keyboard.has_focus ? 'Y' : 'N'~
     - Inside source: true
     *** True Line Result
    -        .map do |x, y|
    -** Processing line: ~          if block_given?~
    +      k = $gtk.args.inputs.keyboard.has_focus ? 'Y' : 'N'
    +** Processing line: ~      outputs.labels << [460, 20, "mouse focus: #{m}   keyboard focus: #{k}", small_font]~
     - Inside source: true
     *** True Line Result
    -          if block_given?
    -** Processing line: ~            yield x, y, state.spaces[x][y]~
    +      outputs.labels << [460, 20, "mouse focus: #{m}   keyboard focus: #{k}", small_font]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            yield x, y, state.spaces[x][y]
    -** Processing line: ~          else~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          else
    -** Processing line: ~            [x, y, state.spaces[x][y]] # sets definition of space~
    +
    +** Processing line: ~    #Sets values for the horizontal separator (divides demo sections)~
     - Inside source: true
     *** True Line Result
    -            [x, y, state.spaces[x][y]] # sets definition of space
    -** Processing line: ~          end~
    +    #Sets values for the horizontal separator (divides demo sections)
    +** Processing line: ~    def horizontal_seperator y, x, x2~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~      end~
    +    def horizontal_seperator y, x, x2
    +** Processing line: ~      [x, y, x2, y, 150, 150, 150]~
     - Inside source: true
     *** True Line Result
    -      end
    +      [x, y, x2, y, 150, 150, 150]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -41072,70 +49287,78 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Defines all spaces on the board.~
    +** Processing line: ~    #Sets the values for the vertical separator (divides demo sections)~
     - Inside source: true
     *** True Line Result
    -    # Defines all spaces on the board.
    -** Processing line: ~    def all_spaces~
    +    #Sets the values for the vertical separator (divides demo sections)
    +** Processing line: ~    def vertical_seperator x, y, y2~
     - Inside source: true
     *** True Line Result
    -    def all_spaces
    -** Processing line: ~      if !block_given?~
    +    def vertical_seperator x, y, y2
    +** Processing line: ~      [x, y, x, y2, 150, 150, 150]~
     - Inside source: true
     *** True Line Result
    -      if !block_given?
    -** Processing line: ~        state.space_combinations.map do |x, y|~
    +      [x, y, x, y2, 150, 150, 150]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.space_combinations.map do |x, y|
    -** Processing line: ~          [x, y, state.spaces[x][y]] # sets definition of space~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          [x, y, state.spaces[x][y]] # sets definition of space
    -** Processing line: ~        end~
    +
    +** Processing line: ~    # Outputs vertical and horizontal separators onto the screen to separate each demo section.~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      else # if a block is given (block_given? is true)~
    +    # Outputs vertical and horizontal separators onto the screen to separate each demo section.
    +** Processing line: ~    def render_seperators~
     - Inside source: true
     *** True Line Result
    -      else # if a block is given (block_given? is true)
    -** Processing line: ~        state.space_combinations.map do |x, y|~
    +    def render_seperators
    +** Processing line: ~      outputs.lines << horizontal_seperator(505, grid.left, 445)~
     - Inside source: true
     *** True Line Result
    -        state.space_combinations.map do |x, y|
    -** Processing line: ~          yield x, y, state.spaces[x][y] # yield if a block is given~
    +      outputs.lines << horizontal_seperator(505, grid.left, 445)
    +** Processing line: ~      outputs.lines << horizontal_seperator(353, grid.left, 445)~
     - Inside source: true
     *** True Line Result
    -          yield x, y, state.spaces[x][y] # yield if a block is given
    -** Processing line: ~        end~
    +      outputs.lines << horizontal_seperator(353, grid.left, 445)
    +** Processing line: ~      outputs.lines << horizontal_seperator(264, grid.left, 445)~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      outputs.lines << horizontal_seperator(264, grid.left, 445)
    +** Processing line: ~      outputs.lines << horizontal_seperator(174, grid.left, 445)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      outputs.lines << horizontal_seperator(174, grid.left, 445)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    +
    +** Processing line: ~      outputs.lines << vertical_seperator(445, grid.top, grid.bottom)~
    +- Inside source: true
    +*** True Line Result
    +      outputs.lines << vertical_seperator(445, grid.top, grid.bottom)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets values for a label, such as the position, value, size, alignment, and color.~
    +** Processing line: ~      outputs.lines << horizontal_seperator(690, 445, 820)~
     - Inside source: true
     *** True Line Result
    -    # Sets values for a label, such as the position, value, size, alignment, and color.
    -** Processing line: ~    def label x, y, value~
    +      outputs.lines << horizontal_seperator(690, 445, 820)
    +** Processing line: ~      outputs.lines << horizontal_seperator(426, 445, 820)~
    +- Inside source: true
    +*** True Line Result
    +      outputs.lines << horizontal_seperator(426, 445, 820)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def label x, y, value
    -** Processing line: ~      [x, y + 10, value, 20, 1, 0, 0, 0]~
    +
    +** Processing line: ~      outputs.lines << vertical_seperator(820, grid.top, grid.bottom)~
     - Inside source: true
     *** True Line Result
    -      [x, y + 10, value, 20, 1, 0, 0, 0]
    +      outputs.lines << vertical_seperator(820, grid.top, grid.bottom)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -41148,10 +49371,10 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $tic_tac_toe = TicTacToe.new~
    +** Processing line: ~  $tech_demo = TechDemo.new~
     - Inside source: true
     *** True Line Result
    -  $tic_tac_toe = TicTacToe.new
    +  $tech_demo = TechDemo.new
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -41160,38 +49383,46 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
       def tick args
    -** Processing line: ~    $tic_tac_toe._       = args~
    +** Processing line: ~    $tech_demo.inputs = args.inputs~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe._       = args
    -** Processing line: ~    $tic_tac_toe.state   = args.state~
    +    $tech_demo.inputs = args.inputs
    +** Processing line: ~    $tech_demo.state = args.state~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.state   = args.state
    -** Processing line: ~    $tic_tac_toe.outputs = args.outputs~
    +    $tech_demo.state = args.state
    +** Processing line: ~    $tech_demo.grid = args.grid~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.outputs = args.outputs
    -** Processing line: ~    $tic_tac_toe.inputs  = args.inputs~
    +    $tech_demo.grid = args.grid
    +** Processing line: ~    $tech_demo.args = args~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.inputs  = args.inputs
    -** Processing line: ~    $tic_tac_toe.grid    = args.grid~
    +    $tech_demo.args = args
    +** Processing line: ~    $tech_demo.outputs = args.render_target(:mini_map)~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.grid    = args.grid
    -** Processing line: ~    $tic_tac_toe.gtk     = args.gtk~
    +    $tech_demo.outputs = args.render_target(:mini_map)
    +** Processing line: ~    $tech_demo.tick~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.gtk     = args.gtk
    -** Processing line: ~    $tic_tac_toe.tick~
    +    $tech_demo.tick
    +** Processing line: ~    args.outputs.labels  << [830, 715, "Render target:", [-2, 0, 0, 0, 0, 255]]~
     - Inside source: true
     *** True Line Result
    -    $tic_tac_toe.tick
    -** Processing line: ~    tick_instructions args, "Sample app shows how to work with mouse clicks."~
    +    args.outputs.labels  << [830, 715, "Render target:", [-2, 0, 0, 0, 0, 255]]
    +** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, :mini_map]~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to work with mouse clicks."
    +    args.outputs.sprites << [0, 0, 1280, 720, :mini_map]
    +** Processing line: ~    args.outputs.sprites << [830, 300, 675, 379, :mini_map]~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.sprites << [830, 300, 675, 379, :mini_map]
    +** Processing line: ~    tick_instructions args, "Sample app shows all the rendering apis available."~
    +- Inside source: true
    +*** True Line Result
    +    tick_instructions args, "Sample app shows all the rendering apis available."
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -41264,22 +49495,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Mouse - Mouse Move - main.rb~
    +** Processing line: ~*** Advanced Rendering - Render Primitive Hierarchies - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Mouse - Mouse Move - main.rb
    +*** Advanced Rendering - Render Primitive Hierarchies - 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/05_mouse/02_mouse_move/app/main.rb~
    +** Processing line: ~  # ./samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/05_mouse/02_mouse_move/app/main.rb
    +  # ./samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb
     ** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    @@ -41288,1594 +49519,1606 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    +   APIs listing that haven't been encountered in previous sample apps:
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - num1.greater(num2): Returns the greater value.~
    -- Inside source: true
    -*** True Line Result
    -   - num1.greater(num2): Returns the greater value.
    -** Processing line: ~     For example, if we have the command~
    -- Inside source: true
    -*** True Line Result
    -     For example, if we have the command
    -** Processing line: ~     puts 4.greater(3)~
    -- Inside source: true
    -*** True Line Result
    -     puts 4.greater(3)
    -** Processing line: ~     the number 4 would be printed to the console since it has a greater value than 3.~
    +** Processing line: ~   - Nested array: An array whose individual elements are also arrays; useful for~
     - Inside source: true
     *** True Line Result
    -     the number 4 would be printed to the console since it has a greater value than 3.
    -** Processing line: ~     Similar to lesser, which returns the lesser value.~
    +   - Nested array: An array whose individual elements are also arrays; useful for
    +** Processing line: ~     storing groups of similar data.  Also called multidimensional arrays.~
     - Inside source: true
     *** True Line Result
    -     Similar to lesser, which returns the lesser value.
    +     storing groups of similar data.  Also called multidimensional arrays.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - find_all: Finds all elements of a collection that meet certain requirements.~
    +** Processing line: ~     In this sample app, we see nested arrays being used in object definitions.~
     - Inside source: true
     *** True Line Result
    -   - find_all: Finds all elements of a collection that meet certain requirements.
    -** Processing line: ~     For example, in this sample app, we're using find_all to find all zombies that have intersected~
    +     In this sample app, we see nested arrays being used in object definitions.
    +** Processing line: ~     Notice the parameters for solids, listed below. Parameters 1-3 set the~
     - Inside source: true
     *** True Line Result
    -     For example, in this sample app, we're using find_all to find all zombies that have intersected
    -** Processing line: ~     or hit the player's sprite since these zombies have been killed.~
    +     Notice the parameters for solids, listed below. Parameters 1-3 set the
    +** Processing line: ~     definition for the rect, and parameter 4 sets the definition of the color.~
     - Inside source: true
     *** True Line Result
    -     or hit the player's sprite since these zombies have been killed.
    +     definition for the rect, and parameter 4 sets the definition of the color.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.~
    +** Processing line: ~     Instead of having a solid definition that looks like this,~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.keyboard.key_down.KEY: Determines if a key is being held or pressed.
    -** Processing line: ~     Stores the frame the "down" event occurred.~
    +     Instead of having a solid definition that looks like this,
    +** Processing line: ~     [X, Y, W, H, R, G, B]~
     - Inside source: true
     *** True Line Result
    -     Stores the frame the "down" event occurred.
    -** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
    +     [X, Y, W, H, R, G, B]
    +** Processing line: ~     we can separate it into two separate array definitions in one, like this~
     - Inside source: true
     *** True Line Result
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    -** Processing line: ~~
    +     we can separate it into two separate array definitions in one, like this
    +** Processing line: ~     [[X, Y, W, H], [R, G, B]]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
    +     [[X, Y, W, H], [R, G, B]]
    +** Processing line: ~     and both options work fine in defining our solid (or any object).~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
    +     and both options work fine in defining our solid (or any object).
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
    +
    +** Processing line: ~   - Collections: Lists of data; useful for organizing large amounts of data.~
     - Inside source: true
     *** True Line Result
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    -** Processing line: ~~
    +   - Collections: Lists of data; useful for organizing large amounts of data.
    +** Processing line: ~     One element of a collection could be an array (which itself contains many elements).~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
    +     One element of a collection could be an array (which itself contains many elements).
    +** Processing line: ~     For example, a collection that stores two solid objects would look like this:~
     - Inside source: true
     *** True Line Result
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -** Processing line: ~     When we want to create a new object, we can declare it as a new entity and then define~
    +     For example, a collection that stores two solid objects would look like this:
    +** Processing line: ~     [~
     - Inside source: true
     *** True Line Result
    -     When we want to create a new object, we can declare it as a new entity and then define
    -** Processing line: ~     its properties. (Remember, you can use state to define ANY property and it will~
    +     [
    +** Processing line: ~      [100, 100, 50, 50, 0, 0, 0],~
     - Inside source: true
     *** True Line Result
    -     its properties. (Remember, you can use state to define ANY property and it will
    -** Processing line: ~     be retained across frames.)~
    +      [100, 100, 50, 50, 0, 0, 0],
    +** Processing line: ~      [100, 150, 50, 50, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -     be retained across frames.)
    -** Processing line: ~~
    +      [100, 150, 50, 50, 255, 255, 255]
    +** Processing line: ~     ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
    +     ]
    +** Processing line: ~     If this collection was added to args.outputs.solids, two solids would be output~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +     If this collection was added to args.outputs.solids, two solids would be output
    +** Processing line: ~     next to each other, one black and one white.~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +     next to each other, one black and one white.
    +** Processing line: ~     Nested arrays can be used in collections, as you will see in this sample app.~
    +- Inside source: true
    +*** True Line Result
    +     Nested arrays can be used in collections, as you will see in this sample app.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - map: Ruby method used to transform data; used in arrays, hashes, and collections.~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -   - map: Ruby method used to transform data; used in arrays, hashes, and collections.
    -** Processing line: ~     Can be used to perform an action on every element of a collection, such as multiplying~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     Can be used to perform an action on every element of a collection, such as multiplying
    -** Processing line: ~     each element by 2 or declaring every element as a new entity.~
    +
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -     each element by 2 or declaring every element as a new entity.
    -** Processing line: ~~
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters for a solid are~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - sample: Chooses a random element from the array.~
    +     The parameters for a solid are
    +** Processing line: ~     1. The position on the screen (x, y)~
     - Inside source: true
     *** True Line Result
    -   - sample: Chooses a random element from the array.
    -** Processing line: ~~
    +     1. The position on the screen (x, y)
    +** Processing line: ~     2. The width (w)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - reject: Removes elements that meet certain requirements.~
    +     2. The width (w)
    +** Processing line: ~     3. The height (h)~
     - Inside source: true
     *** True Line Result
    -   - reject: Removes elements that meet certain requirements.
    -** Processing line: ~     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also~
    +     3. The height (h)
    +** Processing line: ~     4. The color (r, g, b) (if a color is not assigned, the object's default color will be black)~
     - Inside source: true
     *** True Line Result
    -     In this sample app, we're removing/rejecting zombies that reach the center of the screen. We're also
    -** Processing line: ~     rejecting zombies that were killed more than 30 frames ago.~
    +     4. The color (r, g, b) (if a color is not assigned, the object's default color will be black)
    +** Processing line: ~     NOTE: THE PARAMETERS ARE THE SAME FOR BORDERS!~
     - Inside source: true
     *** True Line Result
    -     rejecting zombies that were killed more than 30 frames ago.
    +     NOTE: THE PARAMETERS ARE THE SAME FOR BORDERS!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~     Here is an example of a (red) border or solid definition:~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +     Here is an example of a (red) border or solid definition:
    +** Processing line: ~     [100, 100, 400, 500, 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal~
    +     [100, 100, 400, 500, 255, 0, 0]
    +** Processing line: ~     It will be a solid or border depending on if it is added to args.outputs.solids or args.outputs.borders.~
     - Inside source: true
     *** True Line Result
    -  # This sample app allows users to move around the screen in order to kill zombies. Zombies appear from every direction so the goal
    -** Processing line: ~  # is to kill the zombies as fast as possible!~
    +     It will be a solid or border depending on if it is added to args.outputs.solids or args.outputs.borders.
    +** Processing line: ~     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -  # is to kill the zombies as fast as possible!
    +     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class ProtectThePuppiesFromTheZombies~
    +** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
     - Inside source: true
     *** True Line Result
    -  class ProtectThePuppiesFromTheZombies
    -** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +** Processing line: ~     The parameters for sprites are~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :grid, :inputs, :state, :outputs
    -** Processing line: ~~
    +     The parameters for sprites are
    +** Processing line: ~     1. The position on the screen (x, y)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls the methods necessary for the game to run properly.~
    +     1. The position on the screen (x, y)
    +** Processing line: ~     2. The width (w)~
     - Inside source: true
     *** True Line Result
    -    # Calls the methods necessary for the game to run properly.
    -** Processing line: ~    def tick~
    +     2. The width (w)
    +** Processing line: ~     3. The height (h)~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +     3. The height (h)
    +** Processing line: ~     4. The image path (p)~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +     4. The image path (p)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      calc~
    +
    +** Processing line: ~     Here is an example of a sprite definition:~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~      input~
    +     Here is an example of a sprite definition:
    +** Processing line: ~     [100, 100, 400, 500, 'sprites/dragonruby.png']~
     - Inside source: true
     *** True Line Result
    -      input
    -** Processing line: ~    end~
    +     [100, 100, 400, 500, 'sprites/dragonruby.png']
    +** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -    end
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets default values for the zombies and for the player.~
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -    # Sets default values for the zombies and for the player.
    -** Processing line: ~    # Initialization happens only in the first frame.~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Initialization happens only in the first frame.
    -** Processing line: ~    def defaults~
    +
    +** Processing line: ~  # This code demonstrates the creation and output of objects like sprites, borders, and solids~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      state.flash_at               ||= 0~
    +  # This code demonstrates the creation and output of objects like sprites, borders, and solids
    +** Processing line: ~  # If filled in, they are solids~
     - Inside source: true
     *** True Line Result
    -      state.flash_at               ||= 0
    -** Processing line: ~      state.zombie_min_spawn_rate  ||= 60~
    +  # If filled in, they are solids
    +** Processing line: ~  # If hollow, they are borders~
     - Inside source: true
     *** True Line Result
    -      state.zombie_min_spawn_rate  ||= 60
    -** Processing line: ~      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate~
    +  # If hollow, they are borders
    +** Processing line: ~  # If images, they are sprites~
     - Inside source: true
     *** True Line Result
    -      state.zombie_spawn_countdown ||= random_spawn_countdown state.zombie_min_spawn_rate
    -** Processing line: ~      state.zombies                ||= []~
    +  # If images, they are sprites
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.zombies                ||= []
    -** Processing line: ~      state.killed_zombies         ||= []~
    +
    +** Processing line: ~  # Solids are added to args.outputs.solids~
     - Inside source: true
     *** True Line Result
    -      state.killed_zombies         ||= []
    +  # Solids are added to args.outputs.solids
    +** Processing line: ~  # Borders are added to args.outputs.borders~
    +- Inside source: true
    +*** True Line Result
    +  # Borders are added to args.outputs.borders
    +** Processing line: ~  # Sprites are added to args.outputs.sprites~
    +- Inside source: true
    +*** True Line Result
    +  # Sprites are added to args.outputs.sprites
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Declares player as a new entity and sets its properties.~
    +** Processing line: ~  # The tick method runs 60 frames every second.~
     - Inside source: true
     *** True Line Result
    -      # Declares player as a new entity and sets its properties.
    -** Processing line: ~      # The player begins the game in the center of the screen, not moving in any direction.~
    +  # The tick method runs 60 frames every second.
    +** Processing line: ~  # Your game is going to happen under this one function.~
     - Inside source: true
     *** True Line Result
    -      # The player begins the game in the center of the screen, not moving in any direction.
    -** Processing line: ~      state.player ||= state.new_entity(:player, { x: 640,~
    +  # Your game is going to happen under this one function.
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      state.player ||= state.new_entity(:player, { x: 640,
    -** Processing line: ~                                                 y: 360,~
    +  def tick args
    +** Processing line: ~    border_as_solid_and_solid_as_border args~
     - Inside source: true
     *** True Line Result
    -                                                 y: 360,
    -** Processing line: ~                                                 attack_angle: 0,~
    +    border_as_solid_and_solid_as_border args
    +** Processing line: ~    sprite_as_border_or_solids args~
     - Inside source: true
     *** True Line Result
    -                                                 attack_angle: 0,
    -** Processing line: ~                                                 dx: 0,~
    +    sprite_as_border_or_solids args
    +** Processing line: ~    collection_of_borders_and_solids args~
     - Inside source: true
     *** True Line Result
    -                                                 dx: 0,
    -** Processing line: ~                                                 dy: 0 })~
    +    collection_of_borders_and_solids args
    +** Processing line: ~    collection_of_sprites args~
     - Inside source: true
     *** True Line Result
    -                                                 dy: 0 })
    -** Processing line: ~    end~
    +    collection_of_sprites args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs a gray background.~
    +** Processing line: ~  # Shows a border being output onto the screen as a border and a solid~
     - Inside source: true
     *** True Line Result
    -    # Outputs a gray background.
    -** Processing line: ~    # Calls the methods needed to output the player, zombies, etc onto the screen.~
    +  # Shows a border being output onto the screen as a border and a solid
    +** Processing line: ~  # Also shows how colors can be set~
     - Inside source: true
     *** True Line Result
    -    # Calls the methods needed to output the player, zombies, etc onto the screen.
    -** Processing line: ~    def render~
    +  # Also shows how colors can be set
    +** Processing line: ~  def border_as_solid_and_solid_as_border args~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      outputs.solids << [grid.rect, 100, 100, 100]~
    +  def border_as_solid_and_solid_as_border args
    +** Processing line: ~    border = [0, 0, 50, 50]~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [grid.rect, 100, 100, 100]
    -** Processing line: ~      render_zombies~
    +    border = [0, 0, 50, 50]
    +** Processing line: ~    args.outputs.borders << border~
     - Inside source: true
     *** True Line Result
    -      render_zombies
    -** Processing line: ~      render_killed_zombies~
    +    args.outputs.borders << border
    +** Processing line: ~    args.outputs.solids  << border~
     - Inside source: true
     *** True Line Result
    -      render_killed_zombies
    -** Processing line: ~      render_player~
    +    args.outputs.solids  << border
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      render_player
    -** Processing line: ~      render_flash~
    +
    +** Processing line: ~    # Red, green, blue saturations (last three parameters) can be any number between 0 and 255~
     - Inside source: true
     *** True Line Result
    -      render_flash
    -** Processing line: ~    end~
    +    # Red, green, blue saturations (last three parameters) can be any number between 0 and 255
    +** Processing line: ~    border_with_color = [0, 100, 50, 50, 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    end
    +    border_with_color = [0, 100, 50, 50, 255, 0, 0]
    +** Processing line: ~    args.outputs.borders << border_with_color~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.borders << border_with_color
    +** Processing line: ~    args.outputs.solids  << border_with_color~
    +- Inside source: true
    +*** True Line Result
    +    args.outputs.solids  << border_with_color
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.~
    +** Processing line: ~    border_with_nested_color = [0, 200, 50, 50, [0, 255, 0]] # nested color~
     - Inside source: true
     *** True Line Result
    -    # Outputs the zombies on the screen and sets values for the sprites, such as the position, width, height, and animation.
    -** Processing line: ~    def render_zombies~
    +    border_with_nested_color = [0, 200, 50, 50, [0, 255, 0]] # nested color
    +** Processing line: ~    args.outputs.borders << border_with_nested_color~
     - Inside source: true
     *** True Line Result
    -    def render_zombies
    -** Processing line: ~      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection~
    +    args.outputs.borders << border_with_nested_color
    +** Processing line: ~    args.outputs.solids  << border_with_nested_color~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << state.zombies.map do |z| # performs action on all zombies in the collection
    -** Processing line: ~        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method~
    +    args.outputs.solids  << border_with_nested_color
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        z.sprite = [z.x, z.y, 4 * 3, 8 * 3, animation_sprite(z)].sprite # sets definition for sprite, calls animation_sprite method
    -** Processing line: ~        z.sprite~
    +
    +** Processing line: ~    border_with_nested_rect = [[0, 300, 50, 50], 0, 0, 255] # nested rect~
     - Inside source: true
     *** True Line Result
    -        z.sprite
    -** Processing line: ~      end~
    +    border_with_nested_rect = [[0, 300, 50, 50], 0, 0, 255] # nested rect
    +** Processing line: ~    args.outputs.borders << border_with_nested_rect~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    args.outputs.borders << border_with_nested_rect
    +** Processing line: ~    args.outputs.solids  << border_with_nested_rect~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.outputs.solids  << border_with_nested_rect
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.~
    -- Inside source: true
    -*** True Line Result
    -    # Outputs sprites of killed zombies, and displays a slash image to show that a zombie has been killed.
    -** Processing line: ~    def render_killed_zombies~
    +** Processing line: ~    border_with_nested_color_and_rect = [[0, 400, 50, 50], [255, 0, 255]] # nested rect and color~
     - Inside source: true
     *** True Line Result
    -    def render_killed_zombies
    -** Processing line: ~      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection~
    +    border_with_nested_color_and_rect = [[0, 400, 50, 50], [255, 0, 255]] # nested rect and color
    +** Processing line: ~    args.outputs.borders << border_with_nested_color_and_rect~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << state.killed_zombies.map do |z| # performs action on all killed zombies in collection
    -** Processing line: ~        z.sprite = [z.x,~
    +    args.outputs.borders << border_with_nested_color_and_rect
    +** Processing line: ~    args.outputs.solids  << border_with_nested_color_and_rect~
     - Inside source: true
     *** True Line Result
    -        z.sprite = [z.x,
    -** Processing line: ~                    z.y,~
    +    args.outputs.solids  << border_with_nested_color_and_rect
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                    z.y,
    -** Processing line: ~                    4 * 3,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                    4 * 3,
    -** Processing line: ~                    8 * 3,~
    +
    +** Processing line: ~  # Shows a sprite output onto the screen as a sprite, border, and solid~
     - Inside source: true
     *** True Line Result
    -                    8 * 3,
    -** Processing line: ~                    animation_sprite(z, z.death_at), # calls animation_sprite method~
    +  # Shows a sprite output onto the screen as a sprite, border, and solid
    +** Processing line: ~  # Demonstrates that all three outputs appear differently on screen~
     - Inside source: true
     *** True Line Result
    -                    animation_sprite(z, z.death_at), # calls animation_sprite method
    -** Processing line: ~                    0, # angle~
    +  # Demonstrates that all three outputs appear differently on screen
    +** Processing line: ~  def sprite_as_border_or_solids args~
     - Inside source: true
     *** True Line Result
    -                    0, # angle
    -** Processing line: ~                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die~
    +  def sprite_as_border_or_solids args
    +** Processing line: ~    sprite = [100, 0, 50, 50, 'sprites/ship.png']~
     - Inside source: true
     *** True Line Result
    -                    255 * z.death_at.ease(30, :flip)].sprite # transparency of a zombie changes when they die
    -** Processing line: ~                    # change the value of 30 and see what happens when a zombie is killed~
    +    sprite = [100, 0, 50, 50, 'sprites/ship.png']
    +** Processing line: ~    args.outputs.sprites << sprite~
     - Inside source: true
     *** True Line Result
    -                    # change the value of 30 and see what happens when a zombie is killed
    +    args.outputs.sprites << sprite
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # Sets values to output the slash over the zombie's sprite when a zombie is killed.~
    +** Processing line: ~    # Sprite_as_border variable has same parameters (excluding position) as above object,~
     - Inside source: true
     *** True Line Result
    -        # Sets values to output the slash over the zombie's sprite when a zombie is killed.
    -** Processing line: ~        # The slash is tilted 45 degrees from the angle of the player's attack.~
    +    # Sprite_as_border variable has same parameters (excluding position) as above object,
    +** Processing line: ~    # but will appear differently on screen because it is added to args.outputs.borders~
     - Inside source: true
     *** True Line Result
    -        # The slash is tilted 45 degrees from the angle of the player's attack.
    -** Processing line: ~        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions~
    +    # but will appear differently on screen because it is added to args.outputs.borders
    +** Processing line: ~    sprite_as_border = [100, 100, 50, 50, 'sprites/ship.png']~
     - Inside source: true
     *** True Line Result
    -        # Change the 3 inside scale_rect to 30 and the slash will be HUGE! Scale_rect positions
    -** Processing line: ~        # the slash over the killed zombie's sprite.~
    +    sprite_as_border = [100, 100, 50, 50, 'sprites/ship.png']
    +** Processing line: ~    args.outputs.borders << sprite_as_border~
     - Inside source: true
     *** True Line Result
    -        # the slash over the killed zombie's sprite.
    -** Processing line: ~        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]~
    +    args.outputs.borders << sprite_as_border
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        [z.sprite, [z.sprite.rect, 'sprites/slash.png', 45 + state.player.attack_angle_on_click, z.sprite.a].scale_rect(3, 0.5, 0.5)]
    -** Processing line: ~      end~
    +
    +** Processing line: ~    # Sprite_as_solid variable has same parameters (excluding position) as above object,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    # Sprite_as_solid variable has same parameters (excluding position) as above object,
    +** Processing line: ~    # but will appear differently on screen because it is added to args.outputs.solids~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    # but will appear differently on screen because it is added to args.outputs.solids
    +** Processing line: ~    sprite_as_solid = [100, 200, 50, 50, 'sprites/ship.png']~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Outputs the player sprite using the images in the sprites folder.~
    +    sprite_as_solid = [100, 200, 50, 50, 'sprites/ship.png']
    +** Processing line: ~    args.outputs.solids << sprite_as_solid~
     - Inside source: true
     *** True Line Result
    -    # Outputs the player sprite using the images in the sprites folder.
    -** Processing line: ~    def render_player~
    +    args.outputs.solids << sprite_as_solid
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    def render_player
    -** Processing line: ~      state.player_sprite = [state.player.x,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.player_sprite = [state.player.x,
    -** Processing line: ~                             state.player.y,~
    +
    +** Processing line: ~  # Holds and outputs a collection of borders and a collection of solids~
     - Inside source: true
     *** True Line Result
    -                             state.player.y,
    -** Processing line: ~                            4 * 3,~
    +  # Holds and outputs a collection of borders and a collection of solids
    +** Processing line: ~  # Collections are created by using arrays to hold parameters of each individual object~
     - Inside source: true
     *** True Line Result
    -                            4 * 3,
    -** Processing line: ~                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation~
    +  # Collections are created by using arrays to hold parameters of each individual object
    +** Processing line: ~  def collection_of_borders_and_solids args~
     - Inside source: true
     *** True Line Result
    -                            8 * 3, "sprites/player-#{animation_index(state.player.created_at_elapsed)}.png"] # string interpolation
    -** Processing line: ~      outputs.sprites << state.player_sprite~
    +  def collection_of_borders_and_solids args
    +** Processing line: ~    collection_borders = [~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << state.player_sprite
    -** Processing line: ~~
    +    collection_borders = [
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Outputs a small red square that previews the angles that the player can attack in.~
    +      [
    +** Processing line: ~        [200,  0, 50, 50],                    # black border~
     - Inside source: true
     *** True Line Result
    -      # Outputs a small red square that previews the angles that the player can attack in.
    -** Processing line: ~      # It can be moved in a perfect circle around the player to show possible movements.~
    +        [200,  0, 50, 50],                    # black border
    +** Processing line: ~        [200,  100, 50, 50, 255, 0, 0],       # red border~
     - Inside source: true
     *** True Line Result
    -      # It can be moved in a perfect circle around the player to show possible movements.
    -** Processing line: ~      # Change the 60 in the parenthesis and see what happens to the movement of the red square.~
    +        [200,  100, 50, 50, 255, 0, 0],       # red border
    +** Processing line: ~        [200,  200, 50, 50, [0, 255, 0]],     # nested color~
     - Inside source: true
     *** True Line Result
    -      # Change the 60 in the parenthesis and see what happens to the movement of the red square.
    -** Processing line: ~      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),~
    +        [200,  200, 50, 50, [0, 255, 0]],     # nested color
    +** Processing line: ~      ],~
     - Inside source: true
     *** True Line Result
    -      outputs.solids <<  [state.player.x + state.player.attack_angle.vector_x(60),
    -** Processing line: ~                          state.player.y + state.player.attack_angle.vector_y(60),~
    +      ],
    +** Processing line: ~      [[200, 300, 50, 50], 0, 0, 255],        # nested rect~
     - Inside source: true
     *** True Line Result
    -                          state.player.y + state.player.attack_angle.vector_y(60),
    -** Processing line: ~                          3, 3, 255, 0, 0]~
    +      [[200, 300, 50, 50], 0, 0, 255],        # nested rect
    +** Processing line: ~      [[200, 400, 50, 50], [255, 0, 255]]     # nested rect and nested color~
     - Inside source: true
     *** True Line Result
    -                          3, 3, 255, 0, 0]
    -** Processing line: ~    end~
    +      [[200, 400, 50, 50], [255, 0, 255]]     # nested rect and nested color
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -    end
    +    ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.~
    +** Processing line: ~    args.outputs.borders << collection_borders~
     - Inside source: true
     *** True Line Result
    -    # Renders flash as a solid. The screen turns white for 10 frames when a zombie is killed.
    -** Processing line: ~    def render_flash~
    +    args.outputs.borders << collection_borders
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def render_flash
    -** Processing line: ~      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.~
    +
    +** Processing line: ~    collection_solids = [~
     - Inside source: true
     *** True Line Result
    -      return if state.flash_at.elapsed_time > 10 # return if more than 10 frames have passed since flash.
    -** Processing line: ~      # Transparency gradually changes (or eases) during the 10 frames of flash.~
    +    collection_solids = [
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -      # Transparency gradually changes (or eases) during the 10 frames of flash.
    -** Processing line: ~      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid~
    +      [
    +** Processing line: ~        [[300, 300, 50, 50], 0, 0, 255],      # nested rect~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << [grid.rect, 255, 255, 255, 255 * state.flash_at.ease(10, :flip)].solid
    -** Processing line: ~    end~
    +        [[300, 300, 50, 50], 0, 0, 255],      # nested rect
    +** Processing line: ~        [[300, 400, 50, 50], [255, 0, 255]]   # nested rect and nested color~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        [[300, 400, 50, 50], [255, 0, 255]]   # nested rect and nested color
    +** Processing line: ~      ],~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls all methods necessary for performing calculations.~
    +      ],
    +** Processing line: ~      [300,  0, 50, 50],~
     - Inside source: true
     *** True Line Result
    -    # Calls all methods necessary for performing calculations.
    -** Processing line: ~    def calc~
    +      [300,  0, 50, 50],
    +** Processing line: ~      [300,  100, 50, 50, 255, 0, 0],~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      calc_spawn_zombie~
    +      [300,  100, 50, 50, 255, 0, 0],
    +** Processing line: ~      [300,  200, 50, 50, [0, 255, 0]],       # nested color~
     - Inside source: true
     *** True Line Result
    -      calc_spawn_zombie
    -** Processing line: ~      calc_move_zombies~
    +      [300,  200, 50, 50, [0, 255, 0]],       # nested color
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -      calc_move_zombies
    -** Processing line: ~      calc_player~
    +    ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc_player
    -** Processing line: ~      calc_kill_zombie~
    +
    +** Processing line: ~    args.outputs.solids << collection_solids~
     - Inside source: true
     *** True Line Result
    -      calc_kill_zombie
    -** Processing line: ~    end~
    +    args.outputs.solids << collection_solids
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.~
    +** Processing line: ~  # Holds and outputs a collection of sprites by adding it to args.outputs.sprites~
     - Inside source: true
     *** True Line Result
    -    # Decreases the zombie spawn countdown by 1 if it has a value greater than 0.
    -** Processing line: ~    def calc_spawn_zombie~
    +  # Holds and outputs a collection of sprites by adding it to args.outputs.sprites
    +** Processing line: ~  # Also outputs a collection with same parameters (excluding position) by adding~
     - Inside source: true
     *** True Line Result
    -    def calc_spawn_zombie
    -** Processing line: ~      if state.zombie_spawn_countdown > 0~
    +  # Also outputs a collection with same parameters (excluding position) by adding
    +** Processing line: ~  # it to args.outputs.solids and another to args.outputs.borders~
     - Inside source: true
     *** True Line Result
    -      if state.zombie_spawn_countdown > 0
    -** Processing line: ~        state.zombie_spawn_countdown -= 1~
    +  # it to args.outputs.solids and another to args.outputs.borders
    +** Processing line: ~  def collection_of_sprites args~
     - Inside source: true
     *** True Line Result
    -        state.zombie_spawn_countdown -= 1
    -** Processing line: ~        return~
    +  def collection_of_sprites args
    +** Processing line: ~    sprites_collection = [~
     - Inside source: true
     *** True Line Result
    -        return
    -** Processing line: ~      end~
    +    sprites_collection = [
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      [
    +** Processing line: ~        [400, 0, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # New zombies are created, positioned on the screen, and added to the zombies collection.~
    +        [400, 0, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~        [400, 100, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -      # New zombies are created, positioned on the screen, and added to the zombies collection.
    -** Processing line: ~      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity~
    +        [400, 100, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~      ],~
     - Inside source: true
     *** True Line Result
    -      state.zombies << state.new_entity(:zombie) do |z| # each zombie is declared a new entity
    -** Processing line: ~        if rand > 0.5~
    +      ],
    +** Processing line: ~      [400, 200, 50, 50, 'sprites/ship.png']~
     - Inside source: true
     *** True Line Result
    -        if rand > 0.5
    -** Processing line: ~          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)~
    +      [400, 200, 50, 50, 'sprites/ship.png']
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -          z.x = grid.rect.w.randomize(:ratio) # random x position on screen (within grid scope)
    -** Processing line: ~          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)~
    +    ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          z.y = [-10, 730].sample # y position is set to either -10 or 730 (randomly chosen)
    -** Processing line: ~          # the possible values exceed the screen's scope so zombies appear to be coming from far away~
    +
    +** Processing line: ~    args.outputs.sprites << sprites_collection~
     - Inside source: true
     *** True Line Result
    -          # the possible values exceed the screen's scope so zombies appear to be coming from far away
    -** Processing line: ~        else~
    +    args.outputs.sprites << sprites_collection
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)~
    +
    +** Processing line: ~    args.outputs.solids << [~
     - Inside source: true
     *** True Line Result
    -          z.x = [-10, 1290].sample # x position is set to either -10 or 1290 (randomly chosen)
    -** Processing line: ~          z.y = grid.rect.w.randomize(:ratio) # random y position on screen~
    +    args.outputs.solids << [
    +** Processing line: ~      [500, 0, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -          z.y = grid.rect.w.randomize(:ratio) # random y position on screen
    -** Processing line: ~        end~
    +      [500, 0, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~      [500, 100, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +      [500, 100, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~      [[[500, 200, 50, 50, 'sprites/ship.png']]]~
     - Inside source: true
     *** True Line Result
    -      end
    +      [[[500, 200, 50, 50, 'sprites/ship.png']]]
    +** Processing line: ~    ]~
    +- Inside source: true
    +*** True Line Result
    +    ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Calls random_spawn_countdown method (determines how fast new zombies appear)~
    +** Processing line: ~    args.outputs.borders << [~
     - Inside source: true
     *** True Line Result
    -      # Calls random_spawn_countdown method (determines how fast new zombies appear)
    -** Processing line: ~      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate~
    +    args.outputs.borders << [
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -      state.zombie_spawn_countdown = random_spawn_countdown state.zombie_min_spawn_rate
    -** Processing line: ~      state.zombie_min_spawn_rate -= 1~
    +      [
    +** Processing line: ~        [600, 0, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -      state.zombie_min_spawn_rate -= 1
    -** Processing line: ~      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater~
    +        [600, 0, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~        [600, 100, 50, 50, 'sprites/ship.png'],~
     - Inside source: true
     *** True Line Result
    -      # set to either the current zombie_min_spawn_rate or 0, depending on which value is greater
    -** Processing line: ~      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)~
    +        [600, 100, 50, 50, 'sprites/ship.png'],
    +** Processing line: ~      ],~
     - Inside source: true
     *** True Line Result
    -      state.zombie_min_spawn_rate  = state.zombie_min_spawn_rate.greater(0)
    -** Processing line: ~    end~
    +      ],
    +** Processing line: ~      [600, 200, 50, 50, 'sprites/ship.png']~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      [600, 200, 50, 50, 'sprites/ship.png']
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Moves all zombies towards the center of the screen.~
    +    ]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # Moves all zombies towards the center of the screen.
    -** Processing line: ~    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # All zombies that reach the center (640, 360) are rejected from the zombies collection and disappear.
    -** Processing line: ~    def calc_move_zombies~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    def calc_move_zombies
    -** Processing line: ~      state.zombies.each do |z| # for each zombie in the collection~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -      state.zombies.each do |z| # for each zombie in the collection
    -** Processing line: ~        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Rendering - Render Primitives As Hash - main.rb~
    +- Header detected.
     *** True Line Result
    -        z.y = z.y.towards(360, 0.1) # move the zombie towards the center (640, 360) at a rate of 0.1
    -** Processing line: ~        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center~
    -- Inside source: true
    +
     *** True Line Result
    -        z.x = z.x.towards(640, 0.1) # change 0.1 to 1.1 and see how much faster the zombies move to the center
    -** Processing line: ~      end~
    -- Inside source: true
    +*** Advanced Rendering - Render Primitives As Hash - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -      end
    -** Processing line: ~      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/07_advanced_rendering/05_render_primitives_as_hash/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      state.zombies = state.zombies.reject { |z| z.y == 360 && z.x == 640 } # remove zombies that are in center
    -** Processing line: ~    end~
    +  # ./samples/07_advanced_rendering/05_render_primitives_as_hash/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -    end
    +  =begin
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Calculates the position and movement of the player on the screen.~
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -    # Calculates the position and movement of the player on the screen.
    -** Processing line: ~    def calc_player~
    +   Reminders:
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def calc_player
    -** Processing line: ~      state.player.x += state.player.dx # changes x based on dx (change in x)~
    +
    +** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
     - Inside source: true
     *** True Line Result
    -      state.player.x += state.player.dx # changes x based on dx (change in x)
    -** Processing line: ~      state.player.y += state.player.dy # changes y based on dy (change in y)~
    +   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    +** Processing line: ~     using their keys.~
     - Inside source: true
     *** True Line Result
    -      state.player.y += state.player.dy # changes y based on dy (change in y)
    +     using their keys.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.player.dx *= 0.9 # scales dx down~
    +** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
     - Inside source: true
     *** True Line Result
    -      state.player.dx *= 0.9 # scales dx down
    -** Processing line: ~      state.player.dy *= 0.9 # scales dy down~
    +     For example, if we have a "numbers" hash that stores numbers in English as the
    +** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
     - Inside source: true
     *** True Line Result
    -      state.player.dy *= 0.9 # scales dy down
    -** Processing line: ~~
    +     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    +** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.~
    +     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    +** Processing line: ~     and on it goes.~
     - Inside source: true
     *** True Line Result
    -      # Compares player's x to 1280 to find lesser value, then compares result to 0 to find greater value.
    -** Processing line: ~      # This ensures that the player remains within the screen's scope.~
    +     and on it goes.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # This ensures that the player remains within the screen's scope.
    -** Processing line: ~      state.player.x = state.player.x.lesser(1280).greater(0)~
    +
    +** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
     - Inside source: true
     *** True Line Result
    -      state.player.x = state.player.x.lesser(1280).greater(0)
    -** Processing line: ~      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y~
    +     Now if we wanted to find the corresponding value of the "one" key, we could say
    +** Processing line: ~     puts numbers["one"]~
     - Inside source: true
     *** True Line Result
    -      state.player.y = state.player.y.lesser(720).greater(0) # same with player's y
    -** Processing line: ~    end~
    +     puts numbers["one"]
    +** Processing line: ~     which would print "uno" to the console.~
     - Inside source: true
     *** True Line Result
    -    end
    +     which would print "uno" to the console.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection~
    +** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
     - Inside source: true
     *** True Line Result
    -    # Finds all zombies that intersect with the player's sprite. These zombies are removed from the zombies collection
    -** Processing line: ~    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.~
    +   - args.outputs.sprites: An array. The values generate a sprite.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -    # and added to the killed_zombies collection since any zombie that intersects with the player is killed.
    -** Processing line: ~    def calc_kill_zombie~
    +     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
     - Inside source: true
     *** True Line Result
    -    def calc_kill_zombie
    +     For more information about sprites, go to mygame/documentation/05-sprites.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Find all zombies that intersect with the player. They are considered killed.~
    -- Inside source: true
    -*** True Line Result
    -      # Find all zombies that intersect with the player. They are considered killed.
    -** Processing line: ~      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }~
    +** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
     - Inside source: true
     *** True Line Result
    -      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
    -** Processing line: ~      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection~
    +   - args.outputs.labels: An array. The values generate a label.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
    -** Processing line: ~      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies~
    +     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -      state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
    +     For more information about labels, go to mygame/documentation/02-labels.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame~
    -- Inside source: true
    -*** True Line Result
    -      if killed_this_frame.length > 0 # if atleast one zombie was killed in the frame
    -** Processing line: ~        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed~
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -        state.flash_at = state.tick_count # flash_at set to the frame when the zombie was killed
    -** Processing line: ~      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)~
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
     - Inside source: true
     *** True Line Result
    -      # Don't forget, the rendered flash lasts for 10 frames after the zombie is killed (look at render_flash method)
    -** Processing line: ~      end~
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    +** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -      end
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.~
    +** Processing line: ~   - args.outputs.borders: An array. The values generate a border.~
     - Inside source: true
     *** True Line Result
    -      # Sets the tick_count (passage of time) as the value of the death_at variable for each killed zombie.
    -** Processing line: ~      # Death_at stores the frame a zombie was killed.~
    +   - args.outputs.borders: An array. The values generate a border.
    +** Processing line: ~     The parameters are the same as a solid.~
     - Inside source: true
     *** True Line Result
    -      # Death_at stores the frame a zombie was killed.
    -** Processing line: ~      killed_this_frame.each do |z|~
    +     The parameters are the same as a solid.
    +** Processing line: ~     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -      killed_this_frame.each do |z|
    -** Processing line: ~        z.death_at = state.tick_count~
    +     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        z.death_at = state.tick_count
    -** Processing line: ~      end~
    +
    +** Processing line: ~   - args.outputs.lines: An array. The values generate a line.~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +   - args.outputs.lines: An array. The values generate a line.
    +** Processing line: ~     The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Zombies are rejected from the killed_zombies collection depending on when they were killed.~
    +     The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -      # Zombies are rejected from the killed_zombies collection depending on when they were killed.
    -** Processing line: ~      # They are rejected if more than 30 frames have passed since their death.~
    +     For more information about labels, go to mygame/documentation/02-labels.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # They are rejected if more than 30 frames have passed since their death.
    -** Processing line: ~      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      state.killed_zombies = state.killed_zombies.reject { |z| state.tick_count - z.death_at > 30 }
    -** Processing line: ~    end~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    +
    +** Processing line: ~  # This sample app demonstrates how hashes can be used to output different kinds of objects.~
    +- Inside source: true
    +*** True Line Result
    +  # This sample app demonstrates how hashes can be used to output different kinds of objects.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Uses input from the user to move the player around the screen.~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    # Uses input from the user to move the player around the screen.
    -** Processing line: ~    def input~
    +  def tick args
    +** Processing line: ~    args.state.angle ||= 0 # initializes angle to 0~
     - Inside source: true
     *** True Line Result
    -    def input
    -** Processing line: ~~
    +    args.state.angle ||= 0 # initializes angle to 0
    +** Processing line: ~    args.state.angle  += 1 # increments angle by 1 every frame (60 times a second)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # If the "a" key or left key is pressed, the x position of the player decreases.~
    +    args.state.angle  += 1 # increments angle by 1 every frame (60 times a second)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # If the "a" key or left key is pressed, the x position of the player decreases.
    -** Processing line: ~      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.~
    +
    +** Processing line: ~    # Outputs sprite using a hash~
     - Inside source: true
     *** True Line Result
    -      # Otherwise, if the "d" key or right key is pressed, the x position of the player increases.
    -** Processing line: ~      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left~
    +    # Outputs sprite using a hash
    +** Processing line: ~    args.outputs.sprites << {~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.a || inputs.keyboard.key_held.left
    -** Processing line: ~        state.player.x -= 5~
    +    args.outputs.sprites << {
    +** Processing line: ~      x: 30,                          # sprite position~
     - Inside source: true
     *** True Line Result
    -        state.player.x -= 5
    -** Processing line: ~      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right~
    +      x: 30,                          # sprite position
    +** Processing line: ~      y: 550,~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.d || inputs.keyboard.key_held.right
    -** Processing line: ~        state.player.x += 5~
    +      y: 550,
    +** Processing line: ~      w: 128,                         # sprite size~
     - Inside source: true
     *** True Line Result
    -        state.player.x += 5
    -** Processing line: ~      end~
    +      w: 128,                         # sprite size
    +** Processing line: ~      h: 101,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      h: 101,
    +** Processing line: ~      path: "dragonruby.png",         # image path~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # If the "w" or up key is pressed, the y position of the player increases.~
    +      path: "dragonruby.png",         # image path
    +** Processing line: ~      angle: args.state.angle,        # angle~
     - Inside source: true
     *** True Line Result
    -      # If the "w" or up key is pressed, the y position of the player increases.
    -** Processing line: ~      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.~
    +      angle: args.state.angle,        # angle
    +** Processing line: ~      a: 255,                         # alpha (transparency)~
     - Inside source: true
     *** True Line Result
    -      # Otherwise, if the "s" or down key is pressed, the y position of the player decreases.
    -** Processing line: ~      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up~
    +      a: 255,                         # alpha (transparency)
    +** Processing line: ~      r: 255,                         # color saturation~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.w || inputs.keyboard.key_held.up
    -** Processing line: ~        state.player.y += 5~
    +      r: 255,                         # color saturation
    +** Processing line: ~      g: 255,~
     - Inside source: true
     *** True Line Result
    -        state.player.y += 5
    -** Processing line: ~      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down~
    +      g: 255,
    +** Processing line: ~      b: 255,~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.s || inputs.keyboard.key_held.down
    -** Processing line: ~        state.player.y -= 5~
    +      b: 255,
    +** Processing line: ~      tile_x:  0,                     # sprite sub division/tile~
     - Inside source: true
     *** True Line Result
    -        state.player.y -= 5
    -** Processing line: ~      end~
    +      tile_x:  0,                     # sprite sub division/tile
    +** Processing line: ~      tile_y:  0,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      tile_y:  0,
    +** Processing line: ~      tile_w: -1,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.~
    +      tile_w: -1,
    +** Processing line: ~      tile_h: -1,~
     - Inside source: true
     *** True Line Result
    -      # Sets the attack angle so the player can move and attack in the precise direction it wants to go.
    -** Processing line: ~      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).~
    +      tile_h: -1,
    +** Processing line: ~      flip_vertically: false,         # don't flip sprite~
     - Inside source: true
     *** True Line Result
    -      # If the mouse is moved, the attack angle is changed (based on the player's position and mouse position).
    -** Processing line: ~      # Attack angle also contributes to the position of red square.~
    +      flip_vertically: false,         # don't flip sprite
    +** Processing line: ~      flip_horizontally: false,~
     - Inside source: true
     *** True Line Result
    -      # Attack angle also contributes to the position of red square.
    -** Processing line: ~      if inputs.mouse.moved~
    +      flip_horizontally: false,
    +** Processing line: ~      angle_anchor_x: 0.5,            # rotation center set to middle~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.moved
    -** Processing line: ~        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]~
    +      angle_anchor_x: 0.5,            # rotation center set to middle
    +** Processing line: ~      angle_anchor_y: 0.5~
     - Inside source: true
     *** True Line Result
    -        state.player.attack_angle = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -** Processing line: ~      end~
    +      angle_anchor_y: 0.5
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -      end
    +    }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5~
    +** Processing line: ~    # Outputs label using a hash~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.click && state.player.dx < 0.5 && state.player.dy < 0.5
    -** Processing line: ~        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]~
    +    # Outputs label using a hash
    +** Processing line: ~    args.outputs.labels << {~
     - Inside source: true
     *** True Line Result
    -        state.player.attack_angle_on_click = inputs.mouse.position.angle_from [state.player.x, state.player.y]
    -** Processing line: ~        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set~
    +    args.outputs.labels << {
    +** Processing line: ~      x:              200,                 # label position~
     - Inside source: true
     *** True Line Result
    -        state.player.attack_angle = state.player.attack_angle_on_click # player's attack angle is set
    -** Processing line: ~        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position~
    +      x:              200,                 # label position
    +** Processing line: ~      y:              550,~
     - Inside source: true
     *** True Line Result
    -        state.player.dx = state.player.attack_angle.vector_x(25) # change in player's position
    -** Processing line: ~        state.player.dy = state.player.attack_angle.vector_y(25)~
    +      y:              550,
    +** Processing line: ~      text:           "dragonruby",        # label text~
     - Inside source: true
     *** True Line Result
    -        state.player.dy = state.player.attack_angle.vector_y(25)
    -** Processing line: ~      end~
    +      text:           "dragonruby",        # label text
    +** Processing line: ~      size_enum:      2,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      size_enum:      2,
    +** Processing line: ~      alignment_enum: 1,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      alignment_enum: 1,
    +** Processing line: ~      r:              155,                 # color saturation~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Sets the zombie spawn's countdown to a random number.~
    +      r:              155,                 # color saturation
    +** Processing line: ~      g:              50,~
     - Inside source: true
     *** True Line Result
    -    # Sets the zombie spawn's countdown to a random number.
    -** Processing line: ~    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)~
    +      g:              50,
    +** Processing line: ~      b:              50,~
     - Inside source: true
     *** True Line Result
    -    # How fast zombies appear (change the 60 to 6 and too many zombies will appear at once!)
    -** Processing line: ~    def random_spawn_countdown minimum~
    +      b:              50,
    +** Processing line: ~      a:              255,                 # transparency~
     - Inside source: true
     *** True Line Result
    -    def random_spawn_countdown minimum
    -** Processing line: ~      10.randomize(:ratio, :sign).to_i + 60~
    +      a:              255,                 # transparency
    +** Processing line: ~      font:           "fonts/manaspc.ttf"  # font style; without mentioned file, label won't output correctly~
     - Inside source: true
     *** True Line Result
    -      10.randomize(:ratio, :sign).to_i + 60
    -** Processing line: ~    end~
    +      font:           "fonts/manaspc.ttf"  # font style; without mentioned file, label won't output correctly
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -    end
    +    }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Helps to iterate through the images in the sprites folder by setting the animation index.~
    -- Inside source: true
    -*** True Line Result
    -    # Helps to iterate through the images in the sprites folder by setting the animation index.
    -** Processing line: ~    # 3 frames is how long to show an image, and 6 is how many images to flip through.~
    +** Processing line: ~    # Outputs solid using a hash~
     - Inside source: true
     *** True Line Result
    -    # 3 frames is how long to show an image, and 6 is how many images to flip through.
    -** Processing line: ~    def animation_index at~
    +    # Outputs solid using a hash
    +** Processing line: ~    # [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
     - Inside source: true
     *** True Line Result
    -    def animation_index at
    -** Processing line: ~      at.idiv(3).mod(6)~
    +    # [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    +** Processing line: ~    args.outputs.solids << {~
     - Inside source: true
     *** True Line Result
    -      at.idiv(3).mod(6)
    -** Processing line: ~    end~
    +    args.outputs.solids << {
    +** Processing line: ~      x: 400,                         # position~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      x: 400,                         # position
    +** Processing line: ~      y: 550,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Animates the zombies by using the animation index to go through the images in the sprites folder.~
    +      y: 550,
    +** Processing line: ~      w: 160,                         # size~
     - Inside source: true
     *** True Line Result
    -    # Animates the zombies by using the animation index to go through the images in the sprites folder.
    -** Processing line: ~    def animation_sprite zombie, at = nil~
    +      w: 160,                         # size
    +** Processing line: ~      h:  90,~
     - Inside source: true
     *** True Line Result
    -    def animation_sprite zombie, at = nil
    -** Processing line: ~      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created~
    +      h:  90,
    +** Processing line: ~      r: 120,                         # color saturation~
     - Inside source: true
     *** True Line Result
    -      at ||= zombie.created_at_elapsed # how long it is has been since a zombie was created
    -** Processing line: ~      index = animation_index at~
    +      r: 120,                         # color saturation
    +** Processing line: ~      g:  50,~
     - Inside source: true
     *** True Line Result
    -      index = animation_index at
    -** Processing line: ~      "sprites/zombie-#{index}.png" # string interpolation to iterate through images~
    +      g:  50,
    +** Processing line: ~      b:  50,~
     - Inside source: true
     *** True Line Result
    -      "sprites/zombie-#{index}.png" # string interpolation to iterate through images
    -** Processing line: ~    end~
    +      b:  50,
    +** Processing line: ~      a: 255                          # transparency~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      a: 255                          # transparency
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -  end
    +    }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new~
    +** Processing line: ~    # Outputs border using a hash~
     - Inside source: true
     *** True Line Result
    -  $protect_the_puppies_from_the_zombies = ProtectThePuppiesFromTheZombies.new
    -** Processing line: ~~
    +    # Outputs border using a hash
    +** Processing line: ~    # Same parameters as a solid~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +    # Same parameters as a solid
    +** Processing line: ~    args.outputs.borders << {~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $protect_the_puppies_from_the_zombies.grid    = args.grid~
    +    args.outputs.borders << {
    +** Processing line: ~      x: 600,~
     - Inside source: true
     *** True Line Result
    -    $protect_the_puppies_from_the_zombies.grid    = args.grid
    -** Processing line: ~    $protect_the_puppies_from_the_zombies.inputs  = args.inputs~
    +      x: 600,
    +** Processing line: ~      y: 550,~
     - Inside source: true
     *** True Line Result
    -    $protect_the_puppies_from_the_zombies.inputs  = args.inputs
    -** Processing line: ~    $protect_the_puppies_from_the_zombies.state    = args.state~
    +      y: 550,
    +** Processing line: ~      w: 160,~
     - Inside source: true
     *** True Line Result
    -    $protect_the_puppies_from_the_zombies.state    = args.state
    -** Processing line: ~    $protect_the_puppies_from_the_zombies.outputs = args.outputs~
    +      w: 160,
    +** Processing line: ~      h:  90,~
     - Inside source: true
     *** True Line Result
    -    $protect_the_puppies_from_the_zombies.outputs = args.outputs
    -** Processing line: ~    $protect_the_puppies_from_the_zombies.tick~
    +      h:  90,
    +** Processing line: ~      r: 120,~
     - Inside source: true
     *** True Line Result
    -    $protect_the_puppies_from_the_zombies.tick
    -** Processing line: ~    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."~
    +      r: 120,
    +** Processing line: ~      g:  50,~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "How to get the mouse position and translate it to an x, y position using .vector_x and .vector_y. CLICK to play."
    -** Processing line: ~  end~
    +      g:  50,
    +** Processing line: ~      b:  50,~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      b:  50,
    +** Processing line: ~      a: 255~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +      a: 255
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +
    +** Processing line: ~    # Outputs line using a hash~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +    # Outputs line using a hash
    +** Processing line: ~    args.outputs.lines << {~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +    args.outputs.lines << {
    +** Processing line: ~      x:  900,                        # starting position~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      x:  900,                        # starting position
    +** Processing line: ~      y:  550,~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +      y:  550,
    +** Processing line: ~      x2: 1200,                       # ending position~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +      x2: 1200,                       # ending position
    +** Processing line: ~      y2: 550,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      y2: 550,
    +** Processing line: ~      r:  120,                        # color saturation~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +      r:  120,                        # color saturation
    +** Processing line: ~      g:   50,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +      g:   50,
    +** Processing line: ~      b:   50,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      b:   50,
    +** Processing line: ~      a:  255                         # transparency~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      a:  255                         # transparency
    +** Processing line: ~    }~
     - 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: ~*** Mouse - Mouse Move Paint App - main.rb~
    -- Header detected.
    +** Processing line: ~    # Outputs sprite as a primitive using a hash~
    +- Inside source: true
     *** True Line Result
    -
    +    # Outputs sprite as a primitive using a hash
    +** Processing line: ~    args.outputs.primitives << {~
    +- Inside source: true
     *** True Line Result
    -*** Mouse - Mouse Move Paint App - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    args.outputs.primitives << {
    +** Processing line: ~      x: 30,                          # position~
    +- Inside source: true
     *** True Line Result
    -
    +      x: 30,                          # position
    +** Processing line: ~      y: 200,~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb~
    +      y: 200,
    +** Processing line: ~      w: 128,                         # size~
     - Inside source: true
     *** True Line Result
    -  # ./samples/05_mouse/03_mouse_move_paint_app/app/main.rb
    -** Processing line: ~  =begin~
    +      w: 128,                         # size
    +** Processing line: ~      h: 101,~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      h: 101,
    +** Processing line: ~      path: "dragonruby.png",         # image path~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      path: "dragonruby.png",         # image path
    +** Processing line: ~      angle: args.state.angle,        # angle~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    -** Processing line: ~~
    +      angle: args.state.angle,        # angle
    +** Processing line: ~      a: 255,                         # transparency~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.~
    +      a: 255,                         # transparency
    +** Processing line: ~      r: 255,                         # color saturation~
     - Inside source: true
     *** True Line Result
    -   - Floor: Method that returns an integer number smaller than or equal to the original with no decimal.
    -** Processing line: ~~
    +      r: 255,                         # color saturation
    +** Processing line: ~      g: 255,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...~
    +      g: 255,
    +** Processing line: ~      b: 255,~
     - Inside source: true
     *** True Line Result
    -     For example, if we have a variable, a = 13.7, and we called floor on it, it would look like this...
    -** Processing line: ~     puts a.floor()~
    +      b: 255,
    +** Processing line: ~      tile_x:  0,                     # sprite sub division/tile~
     - Inside source: true
     *** True Line Result
    -     puts a.floor()
    -** Processing line: ~     which would print out 13.~
    +      tile_x:  0,                     # sprite sub division/tile
    +** Processing line: ~      tile_y:  0,~
     - Inside source: true
     *** True Line Result
    -     which would print out 13.
    -** Processing line: ~     (There is also a ceil method, which returns an integer number greater than or equal to the original~
    +      tile_y:  0,
    +** Processing line: ~      tile_w: -1,~
     - Inside source: true
     *** True Line Result
    -     (There is also a ceil method, which returns an integer number greater than or equal to the original
    -** Processing line: ~     with no decimal. If we had called ceil on the variable a, the result would have been 14.)~
    +      tile_w: -1,
    +** Processing line: ~      tile_h: -1,~
     - Inside source: true
     *** True Line Result
    -     with no decimal. If we had called ceil on the variable a, the result would have been 14.)
    -** Processing line: ~~
    +      tile_h: -1,
    +** Processing line: ~      flip_vertically: false,         # don't flip~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +      flip_vertically: false,         # don't flip
    +** Processing line: ~      flip_horizontally: false,~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +      flip_horizontally: false,
    +** Processing line: ~      angle_anchor_x: 0.5,            # rotation center set to middle~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
    +      angle_anchor_x: 0.5,            # rotation center set to middle
    +** Processing line: ~      angle_anchor_y: 0.5~
     - Inside source: true
     *** True Line Result
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -** Processing line: ~     using their keys.~
    +      angle_anchor_y: 0.5
    +** Processing line: ~    }.sprite!~
     - Inside source: true
     *** True Line Result
    -     using their keys.
    +    }.sprite!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
    -- Inside source: true
    -*** True Line Result
    -     For example, if we have a "numbers" hash that stores numbers in English as the
    -** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
    +** Processing line: ~    # Outputs label as primitive using a hash~
     - Inside source: true
     *** True Line Result
    -     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
    +    # Outputs label as primitive using a hash
    +** Processing line: ~    args.outputs.primitives << {~
     - Inside source: true
     *** True Line Result
    -     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -** Processing line: ~     and on it goes.~
    +    args.outputs.primitives << {
    +** Processing line: ~      x:         200,                 # position~
     - Inside source: true
     *** True Line Result
    -     and on it goes.
    -** Processing line: ~~
    +      x:         200,                 # position
    +** Processing line: ~      y:         200,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
    +      y:         200,
    +** Processing line: ~      text:      "dragonruby",        # text~
     - Inside source: true
     *** True Line Result
    -     Now if we wanted to find the corresponding value of the "one" key, we could say
    -** Processing line: ~     puts numbers["one"]~
    +      text:      "dragonruby",        # text
    +** Processing line: ~      size:      2,~
     - Inside source: true
     *** True Line Result
    -     puts numbers["one"]
    -** Processing line: ~     which would print "uno" to the console.~
    +      size:      2,
    +** Processing line: ~      alignment: 1,~
     - Inside source: true
     *** True Line Result
    -     which would print "uno" to the console.
    -** Processing line: ~~
    +      alignment: 1,
    +** Processing line: ~      r:         155,                 # color saturation~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
    +      r:         155,                 # color saturation
    +** Processing line: ~      g:         50,~
     - Inside source: true
     *** True Line Result
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -** Processing line: ~     In this sample app, new_entity is used to create a new button that clears the grid.~
    +      g:         50,
    +** Processing line: ~      b:         50,~
     - Inside source: true
     *** True Line Result
    -     In this sample app, new_entity is used to create a new button that clears the grid.
    -** Processing line: ~     (Remember, you can use state to define ANY property and it will be retained across frames.)~
    +      b:         50,
    +** Processing line: ~      a:         255,                 # transparency~
     - Inside source: true
     *** True Line Result
    -     (Remember, you can use state to define ANY property and it will be retained across frames.)
    -** Processing line: ~~
    +      a:         255,                 # transparency
    +** Processing line: ~      font:      "fonts/manaspc.ttf"  # font style~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
    +      font:      "fonts/manaspc.ttf"  # font style
    +** Processing line: ~    }.label!~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    +    }.label!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.~
    +** Processing line: ~    # Outputs solid as primitive using a hash~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click.point.created_at: The frame the mouse click occurred in.
    -** Processing line: ~~
    +    # Outputs solid as primitive using a hash
    +** Processing line: ~    args.outputs.primitives << {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.labels: An array. The values in the array generate a label.~
    +    args.outputs.primitives << {
    +** Processing line: ~      x: 400,                         # position~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. The values in the array generate a label.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +      x: 400,                         # position
    +** Processing line: ~      y: 200,~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +      y: 200,
    +** Processing line: ~      w: 160,                         # size~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    -** Processing line: ~~
    +      w: 160,                         # size
    +** Processing line: ~      h:  90,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.~
    +      h:  90,
    +** Processing line: ~      r: 120,                         # color saturation~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#inside_rect?: Returns true or false depending on if the point is inside the rect.
    -** Processing line: ~~
    +      r: 120,                         # color saturation
    +** Processing line: ~      g:  50,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +      g:  50,
    +** Processing line: ~      b:  50,~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      b:  50,
    +** Processing line: ~      a: 255                          # transparency~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app shows an empty grid that the user can paint on.~
    +      a: 255                          # transparency
    +** Processing line: ~    }.solid!~
     - Inside source: true
     *** True Line Result
    -  # This sample app shows an empty grid that the user can paint on.
    -** Processing line: ~  # To paint, the user must keep their mouse presssed and drag it around the grid.~
    +    }.solid!
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # To paint, the user must keep their mouse presssed and drag it around the grid.
    -** Processing line: ~  # The "clear" button allows users to clear the grid so they can start over.~
    +
    +** Processing line: ~    # Outputs border as primitive using a hash~
     - Inside source: true
     *** True Line Result
    -  # The "clear" button allows users to clear the grid so they can start over.
    -** Processing line: ~~
    +    # Outputs border as primitive using a hash
    +** Processing line: ~    # Same parameters as solid~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  class PaintApp~
    +    # Same parameters as solid
    +** Processing line: ~    args.outputs.primitives << {~
     - Inside source: true
     *** True Line Result
    -  class PaintApp
    -** Processing line: ~    attr_accessor :inputs, :state, :outputs, :grid, :args~
    +    args.outputs.primitives << {
    +** Processing line: ~      x: 600,                         # position~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :inputs, :state, :outputs, :grid, :args
    -** Processing line: ~~
    +      x: 600,                         # position
    +** Processing line: ~      y: 200,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Runs methods necessary for the game to function properly.~
    +      y: 200,
    +** Processing line: ~      w: 160,                         # size~
     - Inside source: true
     *** True Line Result
    -    # Runs methods necessary for the game to function properly.
    -** Processing line: ~    def tick~
    +      w: 160,                         # size
    +** Processing line: ~      h:  90,~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      print_title~
    +      h:  90,
    +** Processing line: ~      r: 120,                         # color saturation~
     - Inside source: true
     *** True Line Result
    -      print_title
    -** Processing line: ~      add_grid~
    +      r: 120,                         # color saturation
    +** Processing line: ~      g:  50,~
     - Inside source: true
     *** True Line Result
    -      add_grid
    -** Processing line: ~      check_click~
    +      g:  50,
    +** Processing line: ~      b:  50,~
     - Inside source: true
     *** True Line Result
    -      check_click
    -** Processing line: ~      draw_buttons~
    +      b:  50,
    +** Processing line: ~      a: 255                          # transparency~
     - Inside source: true
     *** True Line Result
    -      draw_buttons
    -** Processing line: ~    end~
    +      a: 255                          # transparency
    +** Processing line: ~    }.border!~
     - Inside source: true
     *** True Line Result
    -    end
    +    }.border!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Prints the title onto the screen by using a label.~
    +** Processing line: ~    # Outputs line as primitive using a hash~
     - Inside source: true
     *** True Line Result
    -    # Prints the title onto the screen by using a label.
    -** Processing line: ~    # Also separates the title from the grid with a line as a horizontal separator.~
    +    # Outputs line as primitive using a hash
    +** Processing line: ~    args.outputs.primitives << {~
     - Inside source: true
     *** True Line Result
    -    # Also separates the title from the grid with a line as a horizontal separator.
    -** Processing line: ~    def print_title~
    +    args.outputs.primitives << {
    +** Processing line: ~      x:  900,                        # starting position~
     - Inside source: true
     *** True Line Result
    -    def print_title
    -** Processing line: ~      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]~
    +      x:  900,                        # starting position
    +** Processing line: ~      y:  200,~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [ 640, 700, 'Paint!', 0, 1 ]
    -** Processing line: ~      outputs.lines << horizontal_separator(660, 0, 1280)~
    +      y:  200,
    +** Processing line: ~      x2: 1200,                       # ending position~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_separator(660, 0, 1280)
    -** Processing line: ~    end~
    +      x2: 1200,                       # ending position
    +** Processing line: ~      y2: 200,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      y2: 200,
    +** Processing line: ~      r:  120,                        # color saturation~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Sets the starting position, ending position, and color for the horizontal separator.~
    +      r:  120,                        # color saturation
    +** Processing line: ~      g:   50,~
     - Inside source: true
     *** True Line Result
    -    # Sets the starting position, ending position, and color for the horizontal separator.
    -** Processing line: ~    # The starting and ending positions have the same y values.~
    +      g:   50,
    +** Processing line: ~      b:   50,~
     - Inside source: true
     *** True Line Result
    -    # The starting and ending positions have the same y values.
    -** Processing line: ~    def horizontal_separator y, x, x2~
    +      b:   50,
    +** Processing line: ~      a:  255                         # transparency~
     - Inside source: true
     *** True Line Result
    -    def horizontal_separator y, x, x2
    -** Processing line: ~      [x, y, x2, y, 150, 150, 150]~
    +      a:  255                         # transparency
    +** Processing line: ~    }.line!~
     - Inside source: true
     *** True Line Result
    -      [x, y, x2, y, 150, 150, 150]
    -** Processing line: ~    end~
    +    }.line!
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the starting position, ending position, and color for the vertical separator.~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    # Sets the starting position, ending position, and color for the vertical separator.
    -** Processing line: ~    # The starting and ending positions have the same x values.~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -    # The starting and ending positions have the same x values.
    -** Processing line: ~    def vertical_separator x, y, y2~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Rendering - Pixel Arrays - main.rb~
    +- Header detected.
     *** True Line Result
    -    def vertical_separator x, y, y2
    -** Processing line: ~      [x, y, x, y2, 150, 150, 150]~
    +
    +*** True Line Result
    +*** Advanced Rendering - Pixel Arrays - 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/06_pixel_arrays/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      [x, y, x, y2, 150, 150, 150]
    -** Processing line: ~    end~
    +  # ./samples/07_advanced_rendering/06_pixel_arrays/app/main.rb
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -    end
    +  $gtk.reset
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs a border and a grid containing empty squares onto the screen.~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    # Outputs a border and a grid containing empty squares onto the screen.
    -** Processing line: ~    def add_grid~
    +  def tick args
    +** Processing line: ~    args.state.posinc ||= 1~
     - Inside source: true
     *** True Line Result
    -    def add_grid
    +    args.state.posinc ||= 1
    +** Processing line: ~    args.state.pos ||= 0~
    +- Inside source: true
    +*** True Line Result
    +    args.state.pos ||= 0
    +** Processing line: ~    args.state.rotation ||= 0~
    +- Inside source: true
    +*** True Line Result
    +    args.state.rotation ||= 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets the x, y, height, and width of the grid.~
    +** Processing line: ~    dimension = 10  # keep it small and let the GPU scale it when rendering the sprite.~
     - Inside source: true
     *** True Line Result
    -      # Sets the x, y, height, and width of the grid.
    -** Processing line: ~      # There are 31 horizontal lines and 31 vertical lines in the grid.~
    +    dimension = 10  # keep it small and let the GPU scale it when rendering the sprite.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # There are 31 horizontal lines and 31 vertical lines in the grid.
    -** Processing line: ~      # Feel free to count them yourself before continuing!~
    +
    +** Processing line: ~    # Set up our "scanner" pixel array and fill it with black pixels.~
     - Inside source: true
     *** True Line Result
    -      # Feel free to count them yourself before continuing!
    -** Processing line: ~      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center~
    +    # Set up our "scanner" pixel array and fill it with black pixels.
    +** Processing line: ~    args.pixel_array(:scanner).width = dimension~
     - Inside source: true
     *** True Line Result
    -      x, y, h, w = 640 - 500/2, 640 - 500, 500, 500 # calculations done so the grid appears in screen's center
    -** Processing line: ~      lines_h = 31~
    +    args.pixel_array(:scanner).width = dimension
    +** Processing line: ~    args.pixel_array(:scanner).height = dimension~
     - Inside source: true
     *** True Line Result
    -      lines_h = 31
    -** Processing line: ~      lines_v = 31~
    +    args.pixel_array(:scanner).height = dimension
    +** Processing line: ~    args.pixel_array(:scanner).pixels.fill(0xFF000000, 0, dimension * dimension)  # black, full alpha~
     - Inside source: true
     *** True Line Result
    -      lines_v = 31
    +    args.pixel_array(:scanner).pixels.fill(0xFF000000, 0, dimension * dimension)  # black, full alpha
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Sets values for the grid's border, grid lines, and filled squares.~
    +** Processing line: ~    # Draw a green line that bounces up and down the sprite.~
     - Inside source: true
     *** True Line Result
    -      # Sets values for the grid's border, grid lines, and filled squares.
    -** Processing line: ~      # The filled_squares variable is initially set to an empty array.~
    +    # Draw a green line that bounces up and down the sprite.
    +** Processing line: ~    args.pixel_array(:scanner).pixels.fill(0xFF00FF00, dimension * args.state.pos, dimension)  # green, full alpha~
     - Inside source: true
     *** True Line Result
    -      # The filled_squares variable is initially set to an empty array.
    -** Processing line: ~      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border~
    +    args.pixel_array(:scanner).pixels.fill(0xFF00FF00, dimension * args.state.pos, dimension)  # green, full alpha
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.grid_border ||= [ x, y, h, w ] # definition of grid's outer border
    -** Processing line: ~      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method~
    +
    +** Processing line: ~    # Adjust position for next frame.~
     - Inside source: true
     *** True Line Result
    -      state.grid_lines ||= draw_grid(x, y, h, w, lines_h, lines_v) # calls draw_grid method
    -** Processing line: ~      state.filled_squares ||= [] # there are no filled squares until the user fills them in~
    +    # Adjust position for next frame.
    +** Processing line: ~    args.state.pos += args.state.posinc~
     - Inside source: true
     *** True Line Result
    -      state.filled_squares ||= [] # there are no filled squares until the user fills them in
    -** Processing line: ~~
    +    args.state.pos += args.state.posinc
    +** Processing line: ~    if args.state.posinc > 0 && args.state.pos >= dimension~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Outputs the grid lines, border, and filled squares onto the screen.~
    +    if args.state.posinc > 0 && args.state.pos >= dimension
    +** Processing line: ~      args.state.posinc = -1~
     - Inside source: true
     *** True Line Result
    -      # Outputs the grid lines, border, and filled squares onto the screen.
    -** Processing line: ~      outputs.lines.concat state.grid_lines~
    +      args.state.posinc = -1
    +** Processing line: ~      args.state.pos = dimension - 1~
     - Inside source: true
     *** True Line Result
    -      outputs.lines.concat state.grid_lines
    -** Processing line: ~      outputs.borders << state.grid_border~
    +      args.state.pos = dimension - 1
    +** Processing line: ~    elsif args.state.posinc < 0 && args.state.pos < 0~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.grid_border
    -** Processing line: ~      outputs.solids << state.filled_squares~
    +    elsif args.state.posinc < 0 && args.state.pos < 0
    +** Processing line: ~      args.state.posinc = 1~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << state.filled_squares
    +      args.state.posinc = 1
    +** Processing line: ~      args.state.pos = 1~
    +- Inside source: true
    +*** True Line Result
    +      args.state.pos = 1
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -42884,338 +51127,330 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Draws the grid by adding in vertical and horizontal separators.~
    +** Processing line: ~    # New/changed pixel arrays get uploaded to the GPU before we render~
     - Inside source: true
     *** True Line Result
    -    # Draws the grid by adding in vertical and horizontal separators.
    -** Processing line: ~    def draw_grid x, y, h, w, lines_h, lines_v~
    +    # New/changed pixel arrays get uploaded to the GPU before we render
    +** Processing line: ~    #  anything. At that point, they can be scaled, rotated, and otherwise~
     - Inside source: true
     *** True Line Result
    -    def draw_grid x, y, h, w, lines_h, lines_v
    -** Processing line: ~~
    +    #  anything. At that point, they can be scaled, rotated, and otherwise
    +** Processing line: ~    #  used like any other sprite.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The grid starts off empty.~
    +    #  used like any other sprite.
    +** Processing line: ~    w = 100~
     - Inside source: true
     *** True Line Result
    -      # The grid starts off empty.
    -** Processing line: ~      grid = []~
    +    w = 100
    +** Processing line: ~    h = 100~
     - Inside source: true
     *** True Line Result
    -      grid = []
    -** Processing line: ~~
    +    h = 100
    +** Processing line: ~    x = (1280 - w) / 2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Calculates the placement and adds horizontal lines or separators into the grid.~
    +    x = (1280 - w) / 2
    +** Processing line: ~    y = (720 - h) / 2~
     - Inside source: true
     *** True Line Result
    -      # Calculates the placement and adds horizontal lines or separators into the grid.
    -** Processing line: ~      curr_y = y # start at the bottom of the box~
    +    y = (720 - h) / 2
    +** Processing line: ~    args.outputs.background_color = [64, 0, 128]~
     - Inside source: true
     *** True Line Result
    -      curr_y = y # start at the bottom of the box
    -** Processing line: ~      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid~
    +    args.outputs.background_color = [64, 0, 128]
    +** Processing line: ~    args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite~
     - Inside source: true
     *** True Line Result
    -      dist_y = h / (lines_h + 1) # finds distance to place horizontal lines evenly throughout 500 height of grid
    -** Processing line: ~      lines_h.times do~
    +    args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite
    +** Processing line: ~    args.state.rotation += 1~
     - Inside source: true
     *** True Line Result
    -      lines_h.times do
    -** Processing line: ~        curr_y += dist_y # increment curr_y by the distance between the horizontal lines~
    +    args.state.rotation += 1
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        curr_y += dist_y # increment curr_y by the distance between the horizontal lines
    -** Processing line: ~        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid~
    +
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -        grid << horizontal_separator(curr_y, x, x + w - 1) # add a separator into the grid
    -** Processing line: ~      end~
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Calculates the placement and adds vertical lines or separators into the grid.~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      # Calculates the placement and adds vertical lines or separators into the grid.
    -** Processing line: ~      curr_x = x # now start at the left of the box~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      curr_x = x # now start at the left of the box
    -** Processing line: ~      dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -      dist_x = w / (lines_v + 1) # finds distance to place vertical lines evenly throughout 500 width of grid
    -** Processing line: ~      lines_v.times do~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Rendering - Simple Camera - main.rb~
    +- Header detected.
     *** True Line Result
    -      lines_v.times do
    -** Processing line: ~        curr_x += dist_x # increment curr_x by the distance between the vertical lines~
    -- Inside source: true
    +
     *** True Line Result
    -        curr_x += dist_x # increment curr_x by the distance between the vertical lines
    -** Processing line: ~        grid << vertical_separator(curr_x, y + 1, y  + h) # add separator~
    -- Inside source: true
    +*** Advanced Rendering - Simple Camera - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -        grid << vertical_separator(curr_x, y + 1, y  + h) # add separator
    -** Processing line: ~      end~
    -- Inside source: true
    +
     *** True Line Result
    -      end
    -** Processing line: ~~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/07_advanced_rendering/07_simple_camera/app/main.rb~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # paint_grid uses a hash to assign values to keys.~
    +  # ./samples/07_advanced_rendering/07_simple_camera/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      # paint_grid uses a hash to assign values to keys.
    -** Processing line: ~      state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,~
    +  def tick args
    +** Processing line: ~    # variables you can play around with~
     - Inside source: true
     *** True Line Result
    -      state.paint_grid ||= {"x" => x, "y" => y, "h" => h, "w" => w, "lines_h" => lines_h,
    -** Processing line: ~                            "lines_v" => lines_v, "dist_x" => dist_x,~
    +    # variables you can play around with
    +** Processing line: ~    args.state.world.w      ||= 1280~
     - Inside source: true
     *** True Line Result
    -                            "lines_v" => lines_v, "dist_x" => dist_x,
    -** Processing line: ~                            "dist_y" => dist_y }~
    +    args.state.world.w      ||= 1280
    +** Processing line: ~    args.state.world.h      ||= 720~
     - Inside source: true
     *** True Line Result
    -                            "dist_y" => dist_y }
    +    args.state.world.h      ||= 720
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      return grid~
    +** Processing line: ~    args.state.player.x     ||= 0~
     - Inside source: true
     *** True Line Result
    -      return grid
    -** Processing line: ~    end~
    +    args.state.player.x     ||= 0
    +** Processing line: ~    args.state.player.y     ||= 0~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.player.y     ||= 0
    +** Processing line: ~    args.state.player.size  ||= 32~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.~
    +    args.state.player.size  ||= 32
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Checks if the user is keeping the mouse pressed down and sets the mouse_hold variable accordingly using boolean values.
    -** Processing line: ~    # If the mouse is up, the user cannot drag the mouse.~
    +
    +** Processing line: ~    args.state.enemy.x      ||= 700~
     - Inside source: true
     *** True Line Result
    -    # If the mouse is up, the user cannot drag the mouse.
    -** Processing line: ~    def check_click~
    +    args.state.enemy.x      ||= 700
    +** Processing line: ~    args.state.enemy.y      ||= 700~
     - Inside source: true
     *** True Line Result
    -    def check_click
    -** Processing line: ~      if inputs.mouse.down #is mouse up or down?~
    +    args.state.enemy.y      ||= 700
    +** Processing line: ~    args.state.enemy.size   ||= 16~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.down #is mouse up or down?
    -** Processing line: ~        state.mouse_held = true # mouse is being held down~
    +    args.state.enemy.size   ||= 16
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.mouse_held = true # mouse is being held down
    -** Processing line: ~      elsif inputs.mouse.up # if mouse is up~
    +
    +** Processing line: ~    args.state.camera.x                ||= 640~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.mouse.up # if mouse is up
    -** Processing line: ~      state.mouse_held = false # mouse is not being held down or dragged~
    +    args.state.camera.x                ||= 640
    +** Processing line: ~    args.state.camera.y                ||= 300~
     - Inside source: true
     *** True Line Result
    -      state.mouse_held = false # mouse is not being held down or dragged
    -** Processing line: ~        state.mouse_dragging = false~
    +    args.state.camera.y                ||= 300
    +** Processing line: ~    args.state.camera.scale            ||= 1.0~
     - Inside source: true
     *** True Line Result
    -        state.mouse_dragging = false
    -** Processing line: ~      end~
    +    args.state.camera.scale            ||= 1.0
    +** Processing line: ~    args.state.camera.show_empty_space ||= :yes~
     - Inside source: true
     *** True Line Result
    -      end
    +    args.state.camera.show_empty_space ||= :yes
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if state.mouse_held &&    # mouse needs to be down~
    +** Processing line: ~    # instructions~
     - Inside source: true
     *** True Line Result
    -      if state.mouse_held &&    # mouse needs to be down
    -** Processing line: ~        !inputs.mouse.click &&     # must not be first click~
    +    # instructions
    +** Processing line: ~    args.outputs.primitives << { x: 0, y:  80.from_top, w: 360, h: 80, r: 0, g: 0, b: 0, a: 128 }.solid!~
     - Inside source: true
     *** True Line Result
    -        !inputs.mouse.click &&     # must not be first click
    -** Processing line: ~        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"~
    +    args.outputs.primitives << { x: 0, y:  80.from_top, w: 360, h: 80, r: 0, g: 0, b: 0, a: 128 }.solid!
    +** Processing line: ~    args.outputs.primitives << { x: 10, y: 10.from_top, text: "arrow keys to move around", r: 255, g: 255, b: 255}.label!~
     - Inside source: true
     *** True Line Result
    -        ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15) # Need to move 15 pixels before "drag"
    -** Processing line: ~        state.mouse_dragging = true~
    +    args.outputs.primitives << { x: 10, y: 10.from_top, text: "arrow keys to move around", r: 255, g: 255, b: 255}.label!
    +** Processing line: ~    args.outputs.primitives << { x: 10, y: 30.from_top, text: "+/- to change zoom of camera", r: 255, g: 255, b: 255}.label!~
     - Inside source: true
     *** True Line Result
    -        state.mouse_dragging = true
    -** Processing line: ~      end~
    +    args.outputs.primitives << { x: 10, y: 30.from_top, text: "+/- to change zoom of camera", r: 255, g: 255, b: 255}.label!
    +** Processing line: ~    args.outputs.primitives << { x: 10, y: 50.from_top, text: "tab to change camera edge behavior", r: 255, g: 255, b: 255}.label!~
     - Inside source: true
     *** True Line Result
    -      end
    +    args.outputs.primitives << { x: 10, y: 50.from_top, text: "tab to change camera edge behavior", r: 255, g: 255, b: 255}.label!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.~
    +** Processing line: ~    # render scene~
     - Inside source: true
     *** True Line Result
    -      # If the user clicks their mouse inside the grid, the search_lines method is called with a click input type.
    -** Processing line: ~      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))~
    +    # render scene
    +** Processing line: ~    args.outputs[:scene].w = args.state.world.w~
     - Inside source: true
     *** True Line Result
    -      if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))
    -** Processing line: ~        search_lines(inputs.mouse.click.point, :click)~
    +    args.outputs[:scene].w = args.state.world.w
    +** Processing line: ~    args.outputs[:scene].h = args.state.world.h~
     - Inside source: true
     *** True Line Result
    -        search_lines(inputs.mouse.click.point, :click)
    +    args.outputs[:scene].h = args.state.world.h
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.~
    +** Processing line: ~    args.outputs[:scene].solids << { x: 0, y: 0, w: args.state.world.w, h: args.state.world.h, r: 20, g: 60, b: 80 }~
     - Inside source: true
     *** True Line Result
    -      # If the user drags their mouse inside the grid, the search_lines method is called with a drag input type.
    -** Processing line: ~      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))~
    +    args.outputs[:scene].solids << { x: 0, y: 0, w: args.state.world.w, h: args.state.world.h, r: 20, g: 60, b: 80 }
    +** Processing line: ~    args.outputs[:scene].solids << { x: args.state.player.x, y: args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -      elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))
    -** Processing line: ~        search_lines(inputs.mouse.position, :drag)~
    +    args.outputs[:scene].solids << { x: args.state.player.x, y: args.state.player.y,
    +** Processing line: ~                                     w: args.state.player.size, h: args.state.player.size, r: 80, g: 155, b: 80 }~
     - Inside source: true
     *** True Line Result
    -        search_lines(inputs.mouse.position, :drag)
    -** Processing line: ~      end~
    +                                     w: args.state.player.size, h: args.state.player.size, r: 80, g: 155, b: 80 }
    +** Processing line: ~    args.outputs[:scene].solids << { x: args.state.enemy.x, y: args.state.enemy.y,~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    args.outputs[:scene].solids << { x: args.state.enemy.x, y: args.state.enemy.y,
    +** Processing line: ~                                     w: args.state.enemy.size, h: args.state.enemy.size, r: 155, g: 80, b: 80 }~
     - Inside source: true
     *** True Line Result
    -    end
    +                                     w: args.state.enemy.size, h: args.state.enemy.size, r: 155, g: 80, b: 80 }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.~
    -- Inside source: true
    -*** True Line Result
    -    # Sets the definition of a grid box and handles user input to fill in or clear grid boxes.
    -** Processing line: ~    def search_lines (point, input_type)~
    +** Processing line: ~    # render camera~
     - Inside source: true
     *** True Line Result
    -    def search_lines (point, input_type)
    -** Processing line: ~      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash~
    +    # render camera
    +** Processing line: ~    scene_position = calc_scene_position args~
     - Inside source: true
     *** True Line Result
    -      point.x -= state.paint_grid["x"] # subtracts the value assigned to the "x" key in the paint_grid hash
    -** Processing line: ~      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash~
    +    scene_position = calc_scene_position args
    +** Processing line: ~    args.outputs.sprites << { x: scene_position.x,~
     - Inside source: true
     *** True Line Result
    -      point.y -= state.paint_grid["y"] # subtracts the value assigned to the "y" key in the paint_grid hash
    -** Processing line: ~~
    +    args.outputs.sprites << { x: scene_position.x,
    +** Processing line: ~                              y: scene_position.y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Remove code following the .floor and see what happens when you try to fill in grid squares~
    +                              y: scene_position.y,
    +** Processing line: ~                              w: scene_position.w,~
     - Inside source: true
     *** True Line Result
    -      # Remove code following the .floor and see what happens when you try to fill in grid squares
    -** Processing line: ~      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]~
    +                              w: scene_position.w,
    +** Processing line: ~                              h: scene_position.h,~
     - Inside source: true
     *** True Line Result
    -      point.x = (point.x / state.paint_grid["dist_x"]).floor * state.paint_grid["dist_x"]
    -** Processing line: ~      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]~
    +                              h: scene_position.h,
    +** Processing line: ~                              path: :scene }~
     - Inside source: true
     *** True Line Result
    -      point.y = (point.y / state.paint_grid["dist_y"]).floor * state.paint_grid["dist_y"]
    +                              path: :scene }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      point.x += state.paint_grid["x"]~
    +** Processing line: ~    # move player~
     - Inside source: true
     *** True Line Result
    -      point.x += state.paint_grid["x"]
    -** Processing line: ~      point.y += state.paint_grid["y"]~
    +    # move player
    +** Processing line: ~    if args.inputs.directional_angle~
     - Inside source: true
     *** True Line Result
    -      point.y += state.paint_grid["y"]
    -** Processing line: ~~
    +    if args.inputs.directional_angle
    +** Processing line: ~      args.state.player.x += args.inputs.directional_angle.vector_x * 5~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Sets definition of a grid box, meaning its x, y, width, and height.~
    +      args.state.player.x += args.inputs.directional_angle.vector_x * 5
    +** Processing line: ~      args.state.player.y += args.inputs.directional_angle.vector_y * 5~
     - Inside source: true
     *** True Line Result
    -      # Sets definition of a grid box, meaning its x, y, width, and height.
    -** Processing line: ~      # Floor is called on the point.x and point.y variables.~
    +      args.state.player.y += args.inputs.directional_angle.vector_y * 5
    +** Processing line: ~      args.state.player.x  = args.state.player.x.clamp(0, args.state.world.w - args.state.player.size)~
     - Inside source: true
     *** True Line Result
    -      # Floor is called on the point.x and point.y variables.
    -** Processing line: ~      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.~
    +      args.state.player.x  = args.state.player.x.clamp(0, args.state.world.w - args.state.player.size)
    +** Processing line: ~      args.state.player.y  = args.state.player.y.clamp(0, args.state.world.h - args.state.player.size)~
     - Inside source: true
     *** True Line Result
    -      # Ceil method is called on values of the distance hash keys, setting the width and height of a box.
    -** Processing line: ~      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]~
    +      args.state.player.y  = args.state.player.y.clamp(0, args.state.world.h - args.state.player.size)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      grid_box = [ point.x.floor, point.y.floor, state.paint_grid["dist_x"].ceil, state.paint_grid["dist_y"].ceil ]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if input_type == :click # if user clicks their mouse~
    +** Processing line: ~    # +/- to zoom in and out~
     - Inside source: true
     *** True Line Result
    -      if input_type == :click # if user clicks their mouse
    -** Processing line: ~        if state.filled_squares.include? grid_box # if grid box is already filled in~
    +    # +/- to zoom in and out
    +** Processing line: ~    if args.inputs.keyboard.plus && args.state.tick_count.zmod?(3)~
     - Inside source: true
     *** True Line Result
    -        if state.filled_squares.include? grid_box # if grid box is already filled in
    -** Processing line: ~          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares~
    +    if args.inputs.keyboard.plus && args.state.tick_count.zmod?(3)
    +** Processing line: ~      args.state.camera.scale += 0.05~
     - Inside source: true
     *** True Line Result
    -          state.filled_squares.delete grid_box # box is cleared and removed from filled_squares
    -** Processing line: ~        else~
    +      args.state.camera.scale += 0.05
    +** Processing line: ~    elsif args.inputs.keyboard.hyphen && args.state.tick_count.zmod?(3)~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares~
    +    elsif args.inputs.keyboard.hyphen && args.state.tick_count.zmod?(3)
    +** Processing line: ~      args.state.camera.scale -= 0.05~
     - Inside source: true
     *** True Line Result
    -          state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares
    -** Processing line: ~        end~
    +      args.state.camera.scale -= 0.05
    +** Processing line: ~    elsif args.inputs.keyboard.key_down.tab~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      elsif input_type == :drag # if user drags mouse~
    +    elsif args.inputs.keyboard.key_down.tab
    +** Processing line: ~      if args.state.camera.show_empty_space == :yes~
     - Inside source: true
     *** True Line Result
    -      elsif input_type == :drag # if user drags mouse
    -** Processing line: ~        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in~
    +      if args.state.camera.show_empty_space == :yes
    +** Processing line: ~        args.state.camera.show_empty_space = :no~
     - Inside source: true
     *** True Line Result
    -        unless state.filled_squares.include? grid_box # unless the grid box dragged over is already filled in
    -** Processing line: ~          state.filled_squares << grid_box # the box is filled in and added to filled_squares~
    +        args.state.camera.show_empty_space = :no
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -          state.filled_squares << grid_box # the box is filled in and added to filled_squares
    -** Processing line: ~        end~
    +      else
    +** Processing line: ~        args.state.camera.show_empty_space = :yes~
     - Inside source: true
     *** True Line Result
    -        end
    +        args.state.camera.show_empty_space = :yes
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -43228,122 +51463,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Creates and outputs a "Clear" button on the screen using a label and a border.~
    -- Inside source: true
    -*** True Line Result
    -    # Creates and outputs a "Clear" button on the screen using a label and a border.
    -** Processing line: ~    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.~
    +** Processing line: ~    args.state.camera.scale = args.state.camera.scale.greater(0.1)~
     - Inside source: true
     *** True Line Result
    -    # If the button is clicked, the filled squares are cleared, making the filled_squares collection empty.
    -** Processing line: ~    def draw_buttons~
    +    args.state.camera.scale = args.state.camera.scale.greater(0.1)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    def draw_buttons
    -** Processing line: ~      x, y, w, h = 390, 50, 240, 50~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      x, y, w, h = 390, 50, 240, 50
    -** Processing line: ~      state.clear_button        ||= state.new_entity(:button_with_fade)~
    +
    +** Processing line: ~  def calc_scene_position args~
     - Inside source: true
     *** True Line Result
    -      state.clear_button        ||= state.new_entity(:button_with_fade)
    -** Processing line: ~~
    +  def calc_scene_position args
    +** Processing line: ~    result = { x: args.state.camera.x - (args.state.player.x * args.state.camera.scale),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The x and y positions are set to display the label in the center of the button.~
    +    result = { x: args.state.camera.x - (args.state.player.x * args.state.camera.scale),
    +** Processing line: ~               y: args.state.camera.y - (args.state.player.y * args.state.camera.scale),~
     - Inside source: true
     *** True Line Result
    -      # The x and y positions are set to display the label in the center of the button.
    -** Processing line: ~      # Try changing the first two parameters to simply x, y and see what happens to the text placement!~
    +               y: args.state.camera.y - (args.state.player.y * args.state.camera.scale),
    +** Processing line: ~               w: args.state.world.w * args.state.camera.scale,~
     - Inside source: true
     *** True Line Result
    -      # Try changing the first two parameters to simply x, y and see what happens to the text placement!
    -** Processing line: ~      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border~
    +               w: args.state.world.w * args.state.camera.scale,
    +** Processing line: ~               h: args.state.world.h * args.state.camera.scale,~
     - Inside source: true
     *** True Line Result
    -      state.clear_button.label  ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] # placed in center of border
    -** Processing line: ~      state.clear_button.border ||= [x, y, w, h]~
    +               h: args.state.world.h * args.state.camera.scale,
    +** Processing line: ~               scale: args.state.camera.scale }~
     - Inside source: true
     *** True Line Result
    -      state.clear_button.border ||= [x, y, w, h]
    +               scale: args.state.camera.scale }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # If the mouse is clicked inside the borders of the clear button,~
    -- Inside source: true
    -*** True Line Result
    -      # If the mouse is clicked inside the borders of the clear button,
    -** Processing line: ~      # the filled_squares collection is emptied and the squares are cleared.~
    +** Processing line: ~    return result if args.state.camera.show_empty_space == :yes~
     - Inside source: true
     *** True Line Result
    -      # the filled_squares collection is emptied and the squares are cleared.
    -** Processing line: ~      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)~
    +    return result if args.state.camera.show_empty_space == :yes
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)
    -** Processing line: ~        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred~
    +
    +** Processing line: ~    if result.w < args.grid.w~
     - Inside source: true
     *** True Line Result
    -        state.clear_button.clicked_at = inputs.mouse.click.created_at # time (frame) the click occurred
    -** Processing line: ~        state.filled_squares.clear~
    +    if result.w < args.grid.w
    +** Processing line: ~      result.merge!(x: (args.grid.w - result.w).half)~
     - Inside source: true
     *** True Line Result
    -        state.filled_squares.clear
    -** Processing line: ~        inputs.mouse.previous_click = nil~
    +      result.merge!(x: (args.grid.w - result.w).half)
    +** Processing line: ~    elsif (args.state.player.x * result.scale) < args.grid.w.half~
     - Inside source: true
     *** True Line Result
    -        inputs.mouse.previous_click = nil
    -** Processing line: ~      end~
    +    elsif (args.state.player.x * result.scale) < args.grid.w.half
    +** Processing line: ~      result.merge!(x: 10)~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      result.merge!(x: 10)
    +** Processing line: ~    elsif (result.x + result.w) < args.grid.w~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << state.clear_button.label~
    +    elsif (result.x + result.w) < args.grid.w
    +** Processing line: ~      result.merge!(x: - result.w + (args.grid.w - 10))~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << state.clear_button.label
    -** Processing line: ~      outputs.borders << state.clear_button.border~
    +      result.merge!(x: - result.w + (args.grid.w - 10))
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.clear_button.border
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # When the clear button is clicked, the color of the button changes~
    +** Processing line: ~    if result.h < args.grid.h~
     - Inside source: true
     *** True Line Result
    -      # When the clear button is clicked, the color of the button changes
    -** Processing line: ~      # and the transparency changes, as well. If you change the time from~
    +    if result.h < args.grid.h
    +** Processing line: ~      result.merge!(y: (args.grid.h - result.h).half)~
     - Inside source: true
     *** True Line Result
    -      # and the transparency changes, as well. If you change the time from
    -** Processing line: ~      # 0.25.seconds to 1.25.seconds or more, the change will last longer.~
    +      result.merge!(y: (args.grid.h - result.h).half)
    +** Processing line: ~    elsif (result.y) > 10~
     - Inside source: true
     *** True Line Result
    -      # 0.25.seconds to 1.25.seconds or more, the change will last longer.
    -** Processing line: ~      if state.clear_button.clicked_at~
    +    elsif (result.y) > 10
    +** Processing line: ~      result.merge!(y: 10)~
     - Inside source: true
     *** True Line Result
    -      if state.clear_button.clicked_at
    -** Processing line: ~        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]~
    +      result.merge!(y: 10)
    +** Processing line: ~    elsif (result.y + result.h) < args.grid.h~
     - Inside source: true
     *** True Line Result
    -        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]
    -** Processing line: ~      end~
    +    elsif (result.y + result.h) < args.grid.h
    +** Processing line: ~      result.merge!(y: - result.h + (args.grid.h - 10))~
     - Inside source: true
     *** True Line Result
    -      end
    +      result.merge!(y: - result.h + (args.grid.h - 10))
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    result~
    +- Inside source: true
    +*** True Line Result
    +    result
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -43352,82 +51587,90 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $paint_app = PaintApp.new~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  $paint_app = PaintApp.new
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~*** Advanced Rendering - Splitscreen Camera - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Rendering - Splitscreen Camera - 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/08_splitscreen_camera/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $paint_app.inputs = args.inputs~
    +  # ./samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb
    +** Processing line: ~  class CameraMovement~
     - Inside source: true
     *** True Line Result
    -    $paint_app.inputs = args.inputs
    -** Processing line: ~    $paint_app.state = args.state~
    +  class CameraMovement
    +** Processing line: ~    attr_accessor :state, :inputs, :outputs, :grid~
     - Inside source: true
     *** True Line Result
    -    $paint_app.state = args.state
    -** Processing line: ~    $paint_app.grid = args.grid~
    +    attr_accessor :state, :inputs, :outputs, :grid
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    $paint_app.grid = args.grid
    -** Processing line: ~    $paint_app.args = args~
    +
    +** Processing line: ~    #==============================================================================================~
     - Inside source: true
     *** True Line Result
    -    $paint_app.args = args
    -** Processing line: ~    $paint_app.outputs = args.outputs~
    +    #==============================================================================================
    +** Processing line: ~    #Serialize~
     - Inside source: true
     *** True Line Result
    -    $paint_app.outputs = args.outputs
    -** Processing line: ~    $paint_app.tick~
    +    #Serialize
    +** Processing line: ~    def serialize~
     - Inside source: true
     *** True Line Result
    -    $paint_app.tick
    -** Processing line: ~    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."~
    +    def serialize
    +** Processing line: ~      {state: state, inputs: inputs, outputs: outputs, grid: grid }~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "How to create a simple paint app. CLICK and HOLD to draw."
    -** Processing line: ~  end~
    +      {state: state, inputs: inputs, outputs: outputs, grid: grid }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    -- Inside source: true
    -*** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +** Processing line: ~    def inspect~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +    def inspect
    +** Processing line: ~      serialize.to_s~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      serialize.to_s
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +
    +** Processing line: ~    def to_s~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +    def to_s
    +** Processing line: ~      serialize.to_s~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +      serialize.to_s
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -43436,298 +51679,330 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~    #==============================================================================================~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +    #==============================================================================================
    +** Processing line: ~    #Tick~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +    #Tick
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      defaults
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +      calc
    +** Processing line: ~      render~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    +      render
    +** Processing line: ~      input~
    +- Inside source: true
    +*** True Line Result
    +      input
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Mouse - Coordinate Systems - main.rb~
    -- Header detected.
    +** Processing line: ~    #==============================================================================================~
    +- Inside source: true
     *** True Line Result
    -
    +    #==============================================================================================
    +** Processing line: ~    #Default functions~
    +- Inside source: true
     *** True Line Result
    -*** Mouse - Coordinate Systems - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    #Default functions
    +** Processing line: ~    def defaults~
    +- Inside source: true
     *** True Line Result
    -
    +    def defaults
    +** Processing line: ~      outputs[:scene].background_color = [0,0,0]~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/05_mouse/04_coordinate_systems/app/main.rb~
    +      outputs[:scene].background_color = [0,0,0]
    +** Processing line: ~      state.trauma ||= 0.0~
     - Inside source: true
     *** True Line Result
    -  # ./samples/05_mouse/04_coordinate_systems/app/main.rb
    -** Processing line: ~  =begin~
    +      state.trauma ||= 0.0
    +** Processing line: ~      state.trauma_power ||= 2~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      state.trauma_power ||= 2
    +** Processing line: ~      state.player_cyan ||= new_player_cyan~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      state.player_cyan ||= new_player_cyan
    +** Processing line: ~      state.player_magenta ||= new_player_magenta~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    -** Processing line: ~~
    +      state.player_magenta ||= new_player_magenta
    +** Processing line: ~      state.camera_magenta ||= new_camera_magenta~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.~
    +      state.camera_magenta ||= new_camera_magenta
    +** Processing line: ~      state.camera_cyan ||= new_camera_cyan~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen.
    -** Processing line: ~     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for~
    +      state.camera_cyan ||= new_camera_cyan
    +** Processing line: ~      state.camera_center ||= new_camera_center~
     - Inside source: true
     *** True Line Result
    -     Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for
    -** Processing line: ~     position to know the mouse's coordinates.~
    +      state.camera_center ||= new_camera_center
    +** Processing line: ~      state.room ||= new_room~
     - Inside source: true
     *** True Line Result
    -     position to know the mouse's coordinates.
    -** Processing line: ~     For more information about the mouse, go to mygame/documentation/07-mouse.md.~
    +      state.room ||= new_room
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     For more information about the mouse, go to mygame/documentation/07-mouse.md.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~    def default_player x, y, w, h, sprite_path~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +    def default_player x, y, w, h, sprite_path
    +** Processing line: ~      state.new_entity(:player,~
    +- Inside source: true
    +*** True Line Result
    +      state.new_entity(:player,
    +** Processing line: ~                       { x: x,~
    +- Inside source: true
    +*** True Line Result
    +                       { x: x,
    +** Processing line: ~                         y: y,~
    +- Inside source: true
    +*** True Line Result
    +                         y: y,
    +** Processing line: ~                         dy: 0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
    +                         dy: 0,
    +** Processing line: ~                         dx: 0,~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -** Processing line: ~~
    +                         dx: 0,
    +** Processing line: ~                         w: w,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.~
    +                         w: w,
    +** Processing line: ~                         h: h,~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click.point.(x|y): The x and y location of the mouse.
    -** Processing line: ~~
    +                         h: h,
    +** Processing line: ~                         damage: 0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
    +                         damage: 0,
    +** Processing line: ~                         dead: false,~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +                         dead: false,
    +** Processing line: ~                         orientation: "down",~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    -** Processing line: ~~
    +                         orientation: "down",
    +** Processing line: ~                         max_alpha: 255,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     In this sample app, string interpolation is used to show the current position of the mouse~
    +                         max_alpha: 255,
    +** Processing line: ~                         sprite_path: sprite_path})~
     - Inside source: true
     *** True Line Result
    -     In this sample app, string interpolation is used to show the current position of the mouse
    -** Processing line: ~     in a label.~
    +                         sprite_path: sprite_path})
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     in a label.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.labels: An array that generates a label.~
    +** Processing line: ~    def default_floor_tile x, y, w, h, sprite_path~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array that generates a label.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +    def default_floor_tile x, y, w, h, sprite_path
    +** Processing line: ~      state.new_entity(:room,~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +      state.new_entity(:room,
    +** Processing line: ~                       { x: x,~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    -** Processing line: ~~
    +                       { x: x,
    +** Processing line: ~                         y: y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.solids: An array that generates a solid.~
    +                         y: y,
    +** Processing line: ~                         w: w,~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array that generates a solid.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
    +                         w: w,
    +** Processing line: ~                         h: h,~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    -** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +                         h: h,
    +** Processing line: ~                         sprite_path: sprite_path})~
     - Inside source: true
     *** True Line Result
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +                         sprite_path: sprite_path})
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.lines: An array that generates a line.~
    +** Processing line: ~    def default_camera x, y, w, h~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.lines: An array that generates a line.
    -** Processing line: ~     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]~
    +    def default_camera x, y, w, h
    +** Processing line: ~      state.new_entity(:camera,~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, X2, Y2, RED, GREEN, BLUE, ALPHA]
    -** Processing line: ~     For more information about lines, go to mygame/documentation/04-lines.md.~
    +      state.new_entity(:camera,
    +** Processing line: ~                       { x: x,~
     - Inside source: true
     *** True Line Result
    -     For more information about lines, go to mygame/documentation/04-lines.md.
    -** Processing line: ~~
    +                       { x: x,
    +** Processing line: ~                         y: y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +                         y: y,
    +** Processing line: ~                         dx: 0,~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +                         dx: 0,
    +** Processing line: ~                         dy: 0,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the~
    +                         dy: 0,
    +** Processing line: ~                         w: w,~
     - Inside source: true
     *** True Line Result
    -  # This sample app shows a coordinate system or grid. The user can move their mouse around the screen and the
    -** Processing line: ~  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or~
    +                         w: w,
    +** Processing line: ~                         h: h})~
     - Inside source: true
     *** True Line Result
    -  # coordinates of their position on the screen will be displayed. Users can choose to view one quadrant or
    -** Processing line: ~  # four quadrants by pressing the button.~
    +                         h: h})
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # four quadrants by pressing the button.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~    def new_player_cyan~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~~
    +    def new_player_cyan
    +** Processing line: ~      default_player(0, 0, 64, 64,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # The addition and subtraction in the first two parameters of the label and solid~
    +      default_player(0, 0, 64, 64,
    +** Processing line: ~                     "sprites/player/player_#{state.player_cyan.orientation}_standing.png")~
     - Inside source: true
     *** True Line Result
    -    # The addition and subtraction in the first two parameters of the label and solid
    -** Processing line: ~    # ensure that the outputs don't overlap each other. Try removing them and see what happens.~
    +                     "sprites/player/player_#{state.player_cyan.orientation}_standing.png")
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    # ensure that the outputs don't overlap each other. Try removing them and see what happens.
    -** Processing line: ~    pos = args.inputs.mouse.position # stores coordinates of mouse's position~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    pos = args.inputs.mouse.position # stores coordinates of mouse's position
    -** Processing line: ~    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates~
    +
    +** Processing line: ~    def new_player_magenta~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates
    -** Processing line: ~    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering~
    +    def new_player_magenta
    +** Processing line: ~      default_player(64, 0, 64, 64,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [pos.x -  2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering
    -** Processing line: ~~
    +      default_player(64, 0, 64, 64,
    +** Processing line: ~                     "sprites/player/player_#{state.player_magenta.orientation}_standing.png")~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    button = [0, 0, 370, 50] # sets definition of toggle button~
    +                     "sprites/player/player_#{state.player_magenta.orientation}_standing.png")
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    button = [0, 0, 370, 50] # sets definition of toggle button
    -** Processing line: ~    args.outputs.borders << button # outputs button as border (not filled in)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << button # outputs button as border (not filled in)
    -** Processing line: ~    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button~
    +
    +** Processing line: ~    def new_camera_magenta~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [10, 35, "click here toggle coordinate system"] # label of button
    -** Processing line: ~    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants~
    +    def new_camera_magenta
    +** Processing line: ~      default_camera(0,0,720,720)~
     - Inside source: true
     *** True Line Result
    -    args.outputs.lines << [    0, -720,    0, 720] # vertical line dividing quadrants
    -** Processing line: ~    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants~
    +      default_camera(0,0,720,720)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.lines << [-1280,    0, 1280,   0] # horizontal line dividing quadrants
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.inputs.mouse.click # if the user clicks the mouse~
    +** Processing line: ~    def new_camera_cyan~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click # if the user clicks the mouse
    -** Processing line: ~      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)~
    +    def new_camera_cyan
    +** Processing line: ~      default_camera(0,0,720,720)~
     - Inside source: true
     *** True Line Result
    -      pos = args.inputs.mouse.click.point # pos's value is point where user clicked (coordinates)
    -** Processing line: ~      if pos.inside_rect? button # if the click occurred inside the button~
    +      default_camera(0,0,720,720)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if pos.inside_rect? button # if the click occurred inside the button
    -** Processing line: ~        if args.grid.name == :bottom_left # if the grid shows bottom left as origin~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        if args.grid.name == :bottom_left # if the grid shows bottom left as origin
    -** Processing line: ~          args.grid.origin_center! # origin will be shown in center~
    +
    +** Processing line: ~    def new_camera_center~
     - Inside source: true
     *** True Line Result
    -          args.grid.origin_center! # origin will be shown in center
    -** Processing line: ~        else~
    +    def new_camera_center
    +** Processing line: ~      default_camera(0,0,1280,720)~
     - Inside source: true
     *** True Line Result
    -        else
    -** Processing line: ~          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin~
    +      default_camera(0,0,1280,720)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -          args.grid.origin_bottom_left! # otherwise, the view will change to show bottom left as origin
    -** Processing line: ~        end~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~    def new_room~
     - Inside source: true
     *** True Line Result
    -      end
    +    def new_room
    +** Processing line: ~      default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')~
    +- Inside source: true
    +*** True Line Result
    +      default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -43736,46 +52011,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."~
    -- Inside source: true
    -*** True Line Result
    -    tick_instructions args, "Sample app shows the two supported coordinate systems in Game Toolkit."
    -** Processing line: ~  end~
    +** Processing line: ~    #==============================================================================================~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    #==============================================================================================
    +** Processing line: ~    #Calculation functions~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +    #Calculation functions
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    def calc
    +** Processing line: ~      calc_camera_magenta~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +      calc_camera_magenta
    +** Processing line: ~      calc_camera_cyan~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +      calc_camera_cyan
    +** Processing line: ~      calc_camera_center~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      calc_camera_center
    +** Processing line: ~      calc_player_cyan~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      calc_player_cyan
    +** Processing line: ~      calc_player_magenta~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +      calc_player_magenta
    +** Processing line: ~      calc_trauma_decay~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +      calc_trauma_decay
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -43784,282 +52055,262 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +** Processing line: ~    def center_camera_tolerance~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +    def center_camera_tolerance
    +** Processing line: ~      return Math.sqrt(((state.player_magenta.x - state.player_cyan.x) ** 2) +~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      return Math.sqrt(((state.player_magenta.x - state.player_cyan.x) ** 2) +
    +** Processing line: ~                ((state.player_magenta.y - state.player_cyan.y) ** 2)) > 640~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +                ((state.player_magenta.y - state.player_cyan.y) ** 2)) > 640
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Save Load - Save Load Game - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Save Load - Save Load Game - 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/06_save_load/01_save_load_game/app/main.rb~
    +** Processing line: ~    def calc_player_cyan~
     - Inside source: true
     *** True Line Result
    -  # ./samples/06_save_load/01_save_load_game/app/main.rb
    -** Processing line: ~  =begin~
    +    def calc_player_cyan
    +** Processing line: ~      state.player_cyan.x += state.player_cyan.dx~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      state.player_cyan.x += state.player_cyan.dx
    +** Processing line: ~      state.player_cyan.y += state.player_cyan.dy~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      state.player_cyan.y += state.player_cyan.dy
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful~
    +** Processing line: ~    def calc_player_magenta~
     - Inside source: true
     *** True Line Result
    -   - Symbol (:): Ruby object with a name and an internal ID. Symbols are useful
    -** Processing line: ~     because with a given symbol name, you can refer to the same object throughout~
    +    def calc_player_magenta
    +** Processing line: ~      state.player_magenta.x += state.player_magenta.dx~
     - Inside source: true
     *** True Line Result
    -     because with a given symbol name, you can refer to the same object throughout
    -** Processing line: ~     a Ruby program.~
    +      state.player_magenta.x += state.player_magenta.dx
    +** Processing line: ~      state.player_magenta.y += state.player_magenta.dy~
     - Inside source: true
     *** True Line Result
    -     a Ruby program.
    +      state.player_magenta.y += state.player_magenta.dy
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     In this sample app, we're using symbols for our buttons. We have buttons that~
    +** Processing line: ~    def calc_camera_center~
     - Inside source: true
     *** True Line Result
    -     In this sample app, we're using symbols for our buttons. We have buttons that
    -** Processing line: ~     light fires, save, load, etc. Each of these buttons has a distinct symbol like~
    +    def calc_camera_center
    +** Processing line: ~      timeScale = 1~
     - Inside source: true
     *** True Line Result
    -     light fires, save, load, etc. Each of these buttons has a distinct symbol like
    -** Processing line: ~     :light_fire, :save_game, :load_game, etc.~
    +      timeScale = 1
    +** Processing line: ~      midX = (state.player_magenta.x + state.player_cyan.x)/2~
     - Inside source: true
     *** True Line Result
    -     :light_fire, :save_game, :load_game, etc.
    -** Processing line: ~~
    +      midX = (state.player_magenta.x + state.player_cyan.x)/2
    +** Processing line: ~      midY = (state.player_magenta.y + state.player_cyan.y)/2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - to_sym: Returns the symbol corresponding to the given string; creates the symbol~
    +      midY = (state.player_magenta.y + state.player_cyan.y)/2
    +** Processing line: ~      targetX = midX - state.camera_center.w/2~
     - Inside source: true
     *** True Line Result
    -   - to_sym: Returns the symbol corresponding to the given string; creates the symbol
    -** Processing line: ~     if it does not already exist.~
    +      targetX = midX - state.camera_center.w/2
    +** Processing line: ~      targetY = midY - state.camera_center.h/2~
     - Inside source: true
     *** True Line Result
    -     if it does not already exist.
    -** Processing line: ~     For example,~
    +      targetY = midY - state.camera_center.h/2
    +** Processing line: ~      state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -     For example,
    -** Processing line: ~     'car'.to_sym~
    +      state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale
    +** Processing line: ~      state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -     'car'.to_sym
    -** Processing line: ~     would return the symbol :car.~
    +      state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     would return the symbol :car.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - last: Returns the last element of an array.~
    -- Inside source: true
    -*** True Line Result
    -   - last: Returns the last element of an array.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~    def calc_camera_magenta~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +    def calc_camera_magenta
    +** Processing line: ~      timeScale = 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - num1.lesser(num2): finds the lower value of the given options.~
    +      timeScale = 1
    +** Processing line: ~      targetX = state.player_magenta.x + state.player_magenta.w - state.camera_magenta.w/2~
     - Inside source: true
     *** True Line Result
    -   - num1.lesser(num2): finds the lower value of the given options.
    -** Processing line: ~     For example, in the statement~
    +      targetX = state.player_magenta.x + state.player_magenta.w - state.camera_magenta.w/2
    +** Processing line: ~      targetY = state.player_magenta.y + state.player_magenta.h - state.camera_magenta.h/2~
     - Inside source: true
     *** True Line Result
    -     For example, in the statement
    -** Processing line: ~     a = 4.lesser(3)~
    +      targetY = state.player_magenta.y + state.player_magenta.h - state.camera_magenta.h/2
    +** Processing line: ~      state.camera_magenta.x += (targetX - state.camera_magenta.x) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -     a = 4.lesser(3)
    -** Processing line: ~     3 has a lower value than 4, which means that the value of a would be set to 3,~
    +      state.camera_magenta.x += (targetX - state.camera_magenta.x) * 0.1 * timeScale
    +** Processing line: ~      state.camera_magenta.y += (targetY - state.camera_magenta.y) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -     3 has a lower value than 4, which means that the value of a would be set to 3,
    -** Processing line: ~     but if the statement had been~
    +      state.camera_magenta.y += (targetY - state.camera_magenta.y) * 0.1 * timeScale
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     but if the statement had been
    -** Processing line: ~     a = 4.lesser(5)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     a = 4.lesser(5)
    -** Processing line: ~     4 has a lower value than 5, which means that the value of a would be set to 4.~
    +
    +** Processing line: ~    def calc_camera_cyan~
     - Inside source: true
     *** True Line Result
    -     4 has a lower value than 5, which means that the value of a would be set to 4.
    -** Processing line: ~~
    +    def calc_camera_cyan
    +** Processing line: ~      timeScale = 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.~
    +      timeScale = 1
    +** Processing line: ~      targetX = state.player_cyan.x + state.player_cyan.w - state.camera_cyan.w/2~
     - Inside source: true
     *** True Line Result
    -   - num1.fdiv(num2): returns the float division (will have a decimal) of the two given numbers.
    -** Processing line: ~     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0~
    +      targetX = state.player_cyan.x + state.player_cyan.w - state.camera_cyan.w/2
    +** Processing line: ~      targetY = state.player_cyan.y + state.player_cyan.h - state.camera_cyan.h/2~
     - Inside source: true
     *** True Line Result
    -     For example, 5.fdiv(2) = 2.5 and 5.fdiv(5) = 1.0
    -** Processing line: ~~
    +      targetY = state.player_cyan.y + state.player_cyan.h - state.camera_cyan.h/2
    +** Processing line: ~      state.camera_cyan.x += (targetX - state.camera_cyan.x) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated~
    +      state.camera_cyan.x += (targetX - state.camera_cyan.x) * 0.1 * timeScale
    +** Processing line: ~      state.camera_cyan.y += (targetY - state.camera_cyan.y) * 0.1 * timeScale~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +      state.camera_cyan.y += (targetY - state.camera_cyan.y) * 0.1 * timeScale
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.labels: An array. Values generate a label.~
    -- Inside source: true
    -*** True Line Result
    -   - args.outputs.labels: An array. Values generate a label.
    -** Processing line: ~     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +** Processing line: ~    def calc_player_quadrant angle~
     - Inside source: true
     *** True Line Result
    -     Parameters are [X, Y, TEXT, SIZE, ALIGN, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information, go to mygame/documentation/02-labels.md.~
    +    def calc_player_quadrant angle
    +** Processing line: ~      if angle < 45 and angle > -45 and state.player_cyan.x < state.player_magenta.x~
     - Inside source: true
     *** True Line Result
    -     For more information, go to mygame/documentation/02-labels.md.
    -** Processing line: ~~
    +      if angle < 45 and angle > -45 and state.player_cyan.x < state.player_magenta.x
    +** Processing line: ~        return 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
    +        return 1
    +** Processing line: ~      elsif angle < 45 and angle > -45 and state.player_cyan.x > state.player_magenta.x~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -** Processing line: ~     with at least four values is considered a rect. The inside_rect? function returns true~
    +      elsif angle < 45 and angle > -45 and state.player_cyan.x > state.player_magenta.x
    +** Processing line: ~        return 3~
     - Inside source: true
     *** True Line Result
    -     with at least four values is considered a rect. The inside_rect? function returns true
    -** Processing line: ~     or false depending on if the point is inside the rect.~
    +        return 3
    +** Processing line: ~      elsif (angle > 45 or angle < -45) and state.player_cyan.y < state.player_magenta.y~
     - Inside source: true
     *** True Line Result
    -     or false depending on if the point is inside the rect.
    -** Processing line: ~~
    +      elsif (angle > 45 or angle < -45) and state.player_cyan.y < state.player_magenta.y
    +** Processing line: ~        return 2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  =end~
    +        return 2
    +** Processing line: ~      elsif (angle > 45 or angle < -45) and state.player_cyan.y > state.player_magenta.y~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +      elsif (angle > 45 or angle < -45) and state.player_cyan.y > state.player_magenta.y
    +** Processing line: ~        return 4~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This code allows users to perform different tasks, such as saving and loading the game.~
    +        return 4
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  # This code allows users to perform different tasks, such as saving and loading the game.
    -** Processing line: ~  # Users also have options to reset the game and light a fire.~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  # Users also have options to reset the game and light a fire.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class TextedBasedGame~
    +** Processing line: ~    def calc_camera_shake~
     - Inside source: true
     *** True Line Result
    -  class TextedBasedGame
    -** Processing line: ~~
    +    def calc_camera_shake
    +** Processing line: ~      state.trauma~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Contains methods needed for game to run properly.~
    +      state.trauma
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    # Contains methods needed for game to run properly.
    -** Processing line: ~    # Increments tick count by 1 each time it runs (60 times in a single second)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Increments tick count by 1 each time it runs (60 times in a single second)
    -** Processing line: ~    def tick~
    +
    +** Processing line: ~    def calc_trauma_decay~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      default~
    +    def calc_trauma_decay
    +** Processing line: ~      state.trauma = state.trauma * 0.9~
     - Inside source: true
     *** True Line Result
    -      default
    -** Processing line: ~      show_intro~
    +      state.trauma = state.trauma * 0.9
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      show_intro
    -** Processing line: ~      state.engine_tick_count += 1~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.engine_tick_count += 1
    -** Processing line: ~      tick_fire~
    +
    +** Processing line: ~    def calc_random_float_range(min, max)~
     - Inside source: true
     *** True Line Result
    -      tick_fire
    +    def calc_random_float_range(min, max)
    +** Processing line: ~      rand * (max-min) + min~
    +- Inside source: true
    +*** True Line Result
    +      rand * (max-min) + min
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44068,46 +52319,50 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets default values.~
    +** Processing line: ~    #==============================================================================================~
     - Inside source: true
     *** True Line Result
    -    # Sets default values.
    -** Processing line: ~    # The ||= ensures that a variable's value is only set to the value following the = sign~
    +    #==============================================================================================
    +** Processing line: ~    #Render Functions~
     - Inside source: true
     *** True Line Result
    -    # The ||= ensures that a variable's value is only set to the value following the = sign
    -** Processing line: ~    # if the value has not already been set before. Intialization happens only in the first frame.~
    +    #Render Functions
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -    # if the value has not already been set before. Intialization happens only in the first frame.
    -** Processing line: ~    def default~
    +    def render
    +** Processing line: ~      render_floor~
     - Inside source: true
     *** True Line Result
    -    def default
    -** Processing line: ~      state.engine_tick_count ||= 0~
    +      render_floor
    +** Processing line: ~      render_player_cyan~
     - Inside source: true
     *** True Line Result
    -      state.engine_tick_count ||= 0
    -** Processing line: ~      state.active_module     ||= :room~
    +      render_player_cyan
    +** Processing line: ~      render_player_magenta~
     - Inside source: true
     *** True Line Result
    -      state.active_module     ||= :room
    -** Processing line: ~      state.fire_progress     ||= 0~
    +      render_player_magenta
    +** Processing line: ~      if center_camera_tolerance~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress     ||= 0
    -** Processing line: ~      state.fire_ready_in     ||= 10~
    +      if center_camera_tolerance
    +** Processing line: ~        render_split_camera_scene~
     - Inside source: true
     *** True Line Result
    -      state.fire_ready_in     ||= 10
    -** Processing line: ~      state.previous_fire     ||= :dead~
    +        render_split_camera_scene
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -      state.previous_fire     ||= :dead
    -** Processing line: ~      state.fire              ||= :dead~
    +      else
    +** Processing line: ~        render_camera_center_scene~
     - Inside source: true
     *** True Line Result
    -      state.fire              ||= :dead
    +        render_camera_center_scene
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44116,42 +52371,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def show_intro~
    +** Processing line: ~    def render_player_cyan~
     - Inside source: true
     *** True Line Result
    -    def show_intro
    -** Processing line: ~      return unless state.engine_tick_count == 0 # return unless the game just started~
    +    def render_player_cyan
    +** Processing line: ~      outputs[:scene].sprites << {x: state.player_cyan.x,~
     - Inside source: true
     *** True Line Result
    -      return unless state.engine_tick_count == 0 # return unless the game just started
    -** Processing line: ~      set_story_line "awake." # calls set_story_line method, sets to "awake"~
    +      outputs[:scene].sprites << {x: state.player_cyan.x,
    +** Processing line: ~                                  y: state.player_cyan.y,~
     - Inside source: true
     *** True Line Result
    -      set_story_line "awake." # calls set_story_line method, sets to "awake"
    -** Processing line: ~    end~
    +                                  y: state.player_cyan.y,
    +** Processing line: ~                                  w: state.player_cyan.w,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                                  w: state.player_cyan.w,
    +** Processing line: ~                                  h: state.player_cyan.h,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Sets story line.~
    +                                  h: state.player_cyan.h,
    +** Processing line: ~                                  path: "sprites/player/player_#{state.player_cyan.orientation}_standing.png",~
     - Inside source: true
     *** True Line Result
    -    # Sets story line.
    -** Processing line: ~    def set_story_line story_line~
    +                                  path: "sprites/player/player_#{state.player_cyan.orientation}_standing.png",
    +** Processing line: ~                                  r: 0,~
     - Inside source: true
     *** True Line Result
    -    def set_story_line story_line
    -** Processing line: ~      state.story_line    = story_line # story line set to value of parameter~
    +                                  r: 0,
    +** Processing line: ~                                  g: 255,~
     - Inside source: true
     *** True Line Result
    -      state.story_line    = story_line # story line set to value of parameter
    -** Processing line: ~      state.active_module = :alert # active module set to alert~
    +                                  g: 255,
    +** Processing line: ~                                  b: 255}~
     - Inside source: true
     *** True Line Result
    -      state.active_module = :alert # active module set to alert
    +                                  b: 255}
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44160,54 +52415,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Clears story line.~
    -- Inside source: true
    -*** True Line Result
    -    # Clears story line.
    -** Processing line: ~    def clear_storyline~
    -- Inside source: true
    -*** True Line Result
    -    def clear_storyline
    -** Processing line: ~      state.active_module = :none # active module set to none~
    -- Inside source: true
    -*** True Line Result
    -      state.active_module = :none # active module set to none
    -** Processing line: ~      state.story_line = nil # story line is cleared, set to nil (or empty)~
    +** Processing line: ~    def render_player_magenta~
     - Inside source: true
     *** True Line Result
    -      state.story_line = nil # story line is cleared, set to nil (or empty)
    -** Processing line: ~    end~
    +    def render_player_magenta
    +** Processing line: ~      outputs[:scene].sprites << {x: state.player_magenta.x,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      outputs[:scene].sprites << {x: state.player_magenta.x,
    +** Processing line: ~                                  y: state.player_magenta.y,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Determines fire progress (how close the fire is to being ready to light).~
    +                                  y: state.player_magenta.y,
    +** Processing line: ~                                  w: state.player_magenta.w,~
     - Inside source: true
     *** True Line Result
    -    # Determines fire progress (how close the fire is to being ready to light).
    -** Processing line: ~    def tick_fire~
    +                                  w: state.player_magenta.w,
    +** Processing line: ~                                  h: state.player_magenta.h,~
     - Inside source: true
     *** True Line Result
    -    def tick_fire
    -** Processing line: ~      return if state.active_module == :alert # return if active module is alert~
    +                                  h: state.player_magenta.h,
    +** Processing line: ~                                  path: "sprites/player/player_#{state.player_magenta.orientation}_standing.png",~
     - Inside source: true
     *** True Line Result
    -      return if state.active_module == :alert # return if active module is alert
    -** Processing line: ~      state.fire_progress += 1 # increment fire progress~
    +                                  path: "sprites/player/player_#{state.player_magenta.orientation}_standing.png",
    +** Processing line: ~                                  r: 255,~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress += 1 # increment fire progress
    -** Processing line: ~      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.~
    +                                  r: 255,
    +** Processing line: ~                                  g: 0,~
     - Inside source: true
     *** True Line Result
    -      # fire_ready_in is 10. The fire_progress is either the current value or 10, whichever has a lower value.
    -** Processing line: ~      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)~
    +                                  g: 0,
    +** Processing line: ~                                  b: 255}~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress = state.fire_progress.lesser(state.fire_ready_in)
    +                                  b: 255}
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44216,114 +52459,110 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the value of fire (whether it is dead or roaring), and the story line~
    +** Processing line: ~    def render_floor~
     - Inside source: true
     *** True Line Result
    -    # Sets the value of fire (whether it is dead or roaring), and the story line
    -** Processing line: ~    def light_fire~
    +    def render_floor
    +** Processing line: ~      outputs[:scene].sprites << [state.room.x, state.room.y,~
     - Inside source: true
     *** True Line Result
    -    def light_fire
    -** Processing line: ~      return unless fire_ready? # returns unless the fire is ready to be lit~
    +      outputs[:scene].sprites << [state.room.x, state.room.y,
    +** Processing line: ~                                  state.room.w, state.room.h,~
     - Inside source: true
     *** True Line Result
    -      return unless fire_ready? # returns unless the fire is ready to be lit
    -** Processing line: ~      state.fire = :roaring # fire is lit, set to roaring~
    +                                  state.room.w, state.room.h,
    +** Processing line: ~                                  state.room.sprite_path]~
     - Inside source: true
     *** True Line Result
    -      state.fire = :roaring # fire is lit, set to roaring
    -** Processing line: ~      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit~
    +                                  state.room.sprite_path]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress = 0 # the fire progress returns to 0, since the fire has been lit
    -** Processing line: ~      if state.fire != state.previous_fire~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if state.fire != state.previous_fire
    -** Processing line: ~        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation~
    +
    +** Processing line: ~    def render_camera_center_scene~
     - Inside source: true
     *** True Line Result
    -        set_story_line "the fire is #{state.fire}." # the story line is set using string interpolation
    -** Processing line: ~        state.previous_fire = state.fire~
    +    def render_camera_center_scene
    +** Processing line: ~      zoomFactor = 1~
     - Inside source: true
     *** True Line Result
    -        state.previous_fire = state.fire
    -** Processing line: ~      end~
    +      zoomFactor = 1
    +** Processing line: ~      outputs[:scene].width = state.room.w~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      outputs[:scene].width = state.room.w
    +** Processing line: ~      outputs[:scene].height = state.room.h~
     - Inside source: true
     *** True Line Result
    -    end
    +      outputs[:scene].height = state.room.h
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Checks if the fire is ready to be lit. Returns a boolean value.~
    -- Inside source: true
    -*** True Line Result
    -    # Checks if the fire is ready to be lit. Returns a boolean value.
    -** Processing line: ~    def fire_ready?~
    +** Processing line: ~      maxAngle = 10.0~
     - Inside source: true
     *** True Line Result
    -    def fire_ready?
    -** Processing line: ~      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),~
    +      maxAngle = 10.0
    +** Processing line: ~      maxOffset = 20.0~
     - Inside source: true
     *** True Line Result
    -      # If fire_progress (value between 0 and 10) is equal to fire_ready_in (value of 10),
    -** Processing line: ~      # the fire is ready to be lit.~
    +      maxOffset = 20.0
    +** Processing line: ~      angle = maxAngle * calc_camera_shake * calc_random_float_range(-1,1)~
     - Inside source: true
     *** True Line Result
    -      # the fire is ready to be lit.
    -** Processing line: ~      state.fire_progress == state.fire_ready_in~
    +      angle = maxAngle * calc_camera_shake * calc_random_float_range(-1,1)
    +** Processing line: ~      offsetX = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress == state.fire_ready_in
    -** Processing line: ~    end~
    +      offsetX = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))
    +** Processing line: ~      offsetY = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))~
     - Inside source: true
     *** True Line Result
    -    end
    +      offsetY = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Divides the value of the fire_progress variable by 10 to determine how close the user is to~
    +** Processing line: ~      outputs.sprites << {x: (-state.camera_center.x - offsetX)/zoomFactor,~
     - Inside source: true
     *** True Line Result
    -    # Divides the value of the fire_progress variable by 10 to determine how close the user is to
    -** Processing line: ~    # being able to light a fire.~
    +      outputs.sprites << {x: (-state.camera_center.x - offsetX)/zoomFactor,
    +** Processing line: ~                          y: (-state.camera_center.y - offsetY)/zoomFactor,~
     - Inside source: true
     *** True Line Result
    -    # being able to light a fire.
    -** Processing line: ~    def light_fire_progress~
    +                          y: (-state.camera_center.y - offsetY)/zoomFactor,
    +** Processing line: ~                          w: outputs[:scene].width/zoomFactor,~
     - Inside source: true
     *** True Line Result
    -    def light_fire_progress
    -** Processing line: ~      state.fire_progress.fdiv(10) # float division~
    +                          w: outputs[:scene].width/zoomFactor,
    +** Processing line: ~                          h: outputs[:scene].height/zoomFactor,~
     - Inside source: true
     *** True Line Result
    -      state.fire_progress.fdiv(10) # float division
    -** Processing line: ~    end~
    +                          h: outputs[:scene].height/zoomFactor,
    +** Processing line: ~                          path: :scene,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                          path: :scene,
    +** Processing line: ~                          angle: angle,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Defines fire as the state.fire variable.~
    +                          angle: angle,
    +** Processing line: ~                          source_w: -1,~
     - Inside source: true
     *** True Line Result
    -    # Defines fire as the state.fire variable.
    -** Processing line: ~    def fire~
    +                          source_w: -1,
    +** Processing line: ~                          source_h: -1}~
     - Inside source: true
     *** True Line Result
    -    def fire
    -** Processing line: ~      state.fire~
    +                          source_h: -1}
    +** Processing line: ~      outputs.labels << [128,64,"#{state.trauma.round(1)}",8,2,255,0,255,255]~
     - Inside source: true
     *** True Line Result
    -      state.fire
    +      outputs.labels << [128,64,"#{state.trauma.round(1)}",8,2,255,0,255,255]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44332,42 +52571,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the title of the room.~
    +** Processing line: ~    def render_split_camera_scene~
     - Inside source: true
     *** True Line Result
    -    # Sets the title of the room.
    -** Processing line: ~    def room_title~
    +    def render_split_camera_scene
    +** Processing line: ~       outputs[:scene].width = state.room.w~
     - Inside source: true
     *** True Line Result
    -    def room_title
    -** Processing line: ~      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead~
    +       outputs[:scene].width = state.room.w
    +** Processing line: ~       outputs[:scene].height = state.room.h~
     - Inside source: true
     *** True Line Result
    -      return "a room that is dark" if state.fire == :dead # room is dark if the fire is dead
    -** Processing line: ~      return "a room that is lit" # room is lit if the fire is not dead~
    +       outputs[:scene].height = state.room.h
    +** Processing line: ~       render_camera_magenta_scene~
     - Inside source: true
     *** True Line Result
    -      return "a room that is lit" # room is lit if the fire is not dead
    -** Processing line: ~    end~
    +       render_camera_magenta_scene
    +** Processing line: ~       render_camera_cyan_scene~
     - Inside source: true
     *** True Line Result
    -    end
    +       render_camera_cyan_scene
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the active_module to room.~
    +** Processing line: ~       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI~
     - Inside source: true
     *** True Line Result
    -    # Sets the active_module to room.
    -** Processing line: ~    def go_to_room~
    +       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI
    +** Processing line: ~       output_split_camera angle~
     - Inside source: true
     *** True Line Result
    -    def go_to_room
    -** Processing line: ~      state.active_module = :room~
    +       output_split_camera angle
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.active_module = :room
    +
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44376,58 +52615,50 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Defines active_module as the state.active_module variable.~
    +** Processing line: ~    def render_camera_magenta_scene~
     - Inside source: true
     *** True Line Result
    -    # Defines active_module as the state.active_module variable.
    -** Processing line: ~    def active_module~
    +    def render_camera_magenta_scene
    +** Processing line: ~       zoomFactor = 1~
     - Inside source: true
     *** True Line Result
    -    def active_module
    -** Processing line: ~      state.active_module~
    +       zoomFactor = 1
    +** Processing line: ~       offsetX = 32~
     - Inside source: true
     *** True Line Result
    -      state.active_module
    -** Processing line: ~    end~
    +       offsetX = 32
    +** Processing line: ~       offsetY = 32~
     - Inside source: true
     *** True Line Result
    -    end
    +       offsetY = 32
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Defines story_line as the state.story_line variable.~
    -- Inside source: true
    -*** True Line Result
    -    # Defines story_line as the state.story_line variable.
    -** Processing line: ~    def story_line~
    -- Inside source: true
    -*** True Line Result
    -    def story_line
    -** Processing line: ~      state.story_line~
    +** Processing line: ~       outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2),~
     - Inside source: true
     *** True Line Result
    -      state.story_line
    -** Processing line: ~    end~
    +       outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2),
    +** Processing line: ~                                           y: (-state.camera_magenta.y),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                                           y: (-state.camera_magenta.y),
    +** Processing line: ~                                           w: outputs[:scene].width*2,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Update every 60 frames (or every second)~
    +                                           w: outputs[:scene].width*2,
    +** Processing line: ~                                           h: outputs[:scene].height,~
     - Inside source: true
     *** True Line Result
    -    # Update every 60 frames (or every second)
    -** Processing line: ~    def should_tick?~
    +                                           h: outputs[:scene].height,
    +** Processing line: ~                                           path: :scene}~
     - Inside source: true
     *** True Line Result
    -    def should_tick?
    -** Processing line: ~      state.tick_count.mod_zero?(60)~
    +                                           path: :scene}
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.tick_count.mod_zero?(60)
    +
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44436,42 +52667,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets the value of the game state provider.~
    +** Processing line: ~    def render_camera_cyan_scene~
     - Inside source: true
     *** True Line Result
    -    # Sets the value of the game state provider.
    -** Processing line: ~    def initialize game_state_provider~
    +    def render_camera_cyan_scene
    +** Processing line: ~      zoomFactor = 1~
     - Inside source: true
     *** True Line Result
    -    def initialize game_state_provider
    -** Processing line: ~      @game_state_provider = game_state_provider~
    +      zoomFactor = 1
    +** Processing line: ~      offsetX = 32~
     - Inside source: true
     *** True Line Result
    -      @game_state_provider = game_state_provider
    -** Processing line: ~    end~
    +      offsetX = 32
    +** Processing line: ~      offsetY = 32~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      offsetY = 32
    +** Processing line: ~      outputs[:scene_cyan].sprites << {x: (-state.camera_cyan.x*2),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Defines the game state.~
    +      outputs[:scene_cyan].sprites << {x: (-state.camera_cyan.x*2),
    +** Processing line: ~                                       y: (-state.camera_cyan.y),~
     - Inside source: true
     *** True Line Result
    -    # Defines the game state.
    -** Processing line: ~    # Any variable prefixed with an @ symbol is an instance variable.~
    +                                       y: (-state.camera_cyan.y),
    +** Processing line: ~                                       w: outputs[:scene].width*2,~
     - Inside source: true
     *** True Line Result
    -    # Any variable prefixed with an @ symbol is an instance variable.
    -** Processing line: ~    def state~
    +                                       w: outputs[:scene].width*2,
    +** Processing line: ~                                       h: outputs[:scene].height,~
     - Inside source: true
     *** True Line Result
    -    def state
    -** Processing line: ~      @game_state_provider.state~
    +                                       h: outputs[:scene].height,
    +** Processing line: ~                                       path: :scene}~
     - Inside source: true
     *** True Line Result
    -      @game_state_provider.state
    +                                       path: :scene}
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44480,58 +52711,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Saves the state of the game in a text file called game_state.txt.~
    +** Processing line: ~    def output_split_camera angle~
     - Inside source: true
     *** True Line Result
    -    # Saves the state of the game in a text file called game_state.txt.
    -** Processing line: ~    def save~
    +    def output_split_camera angle
    +** Processing line: ~      #TODO: Clean this up!~
     - Inside source: true
     *** True Line Result
    -    def save
    -** Processing line: ~      $gtk.serialize_state('game_state.txt', state)~
    +      #TODO: Clean this up!
    +** Processing line: ~      quadrant = calc_player_quadrant angle~
     - Inside source: true
     *** True Line Result
    -      $gtk.serialize_state('game_state.txt', state)
    -** Processing line: ~    end~
    +      quadrant = calc_player_quadrant angle
    +** Processing line: ~      outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255]~
     - Inside source: true
     *** True Line Result
    -    end
    +      outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255]
    +** Processing line: ~      if quadrant == 1~
    +- Inside source: true
    +*** True Line Result
    +      if quadrant == 1
    +** Processing line: ~        set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0)~
    +- Inside source: true
    +*** True Line Result
    +        set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Loads the game state from the game_state.txt text file.~
    +** Processing line: ~      elsif quadrant == 2~
     - Inside source: true
     *** True Line Result
    -    # Loads the game state from the game_state.txt text file.
    -** Processing line: ~    # If the load is unsuccessful, the user is informed since the story line indicates the failure.~
    +      elsif quadrant == 2
    +** Processing line: ~        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0)~
     - Inside source: true
     *** True Line Result
    -    # If the load is unsuccessful, the user is informed since the story line indicates the failure.
    -** Processing line: ~    def load~
    +        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    def load
    -** Processing line: ~      parsed_state = $gtk.deserialize_state('game_state.txt')~
    +
    +** Processing line: ~      elsif quadrant == 3~
     - Inside source: true
     *** True Line Result
    -      parsed_state = $gtk.deserialize_state('game_state.txt')
    -** Processing line: ~      if !parsed_state~
    +      elsif quadrant == 3
    +** Processing line: ~        set_camera_attributes(w: 640, h: 720, m_x: 0, m_y: 0, c_x: 640, c_y: 0)~
     - Inside source: true
     *** True Line Result
    -      if !parsed_state
    -** Processing line: ~        set_story_line "no game to load. press save first."~
    +        set_camera_attributes(w: 640, h: 720, m_x: 0, m_y: 0, c_x: 640, c_y: 0)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        set_story_line "no game to load. press save first."
    -** Processing line: ~      else~
    +
    +** Processing line: ~      elsif quadrant == 4~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        $gtk.args.state = parsed_state~
    +      elsif quadrant == 4
    +** Processing line: ~        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 0, c_x: 0, c_y: 360)~
     - Inside source: true
     *** True Line Result
    -        $gtk.args.state = parsed_state
    +        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 0, c_x: 0, c_y: 360)
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -44544,102 +52787,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Resets the game.~
    +** Processing line: ~    def set_camera_attributes(w: 0, h: 0, m_x: 0, m_y: 0, c_x: 0, c_y: 0)~
     - Inside source: true
     *** True Line Result
    -    # Resets the game.
    -** Processing line: ~    def reset~
    +    def set_camera_attributes(w: 0, h: 0, m_x: 0, m_y: 0, c_x: 0, c_y: 0)
    +** Processing line: ~      state.camera_cyan.w = w + 64~
     - Inside source: true
     *** True Line Result
    -    def reset
    -** Processing line: ~      $gtk.reset~
    +      state.camera_cyan.w = w + 64
    +** Processing line: ~      state.camera_cyan.h = h + 64~
     - Inside source: true
     *** True Line Result
    -      $gtk.reset
    -** Processing line: ~    end~
    +      state.camera_cyan.h = h + 64
    +** Processing line: ~      outputs[:scene_cyan].width = (w) * 2~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +      outputs[:scene_cyan].width = (w) * 2
    +** Processing line: ~      outputs[:scene_cyan].height = h~
     - Inside source: true
     *** True Line Result
    -  end
    +      outputs[:scene_cyan].height = h
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  class TextedBasedGamePresenter~
    +** Processing line: ~      state.camera_magenta.w = w + 64~
     - Inside source: true
     *** True Line Result
    -  class TextedBasedGamePresenter
    -** Processing line: ~    attr_accessor :state, :outputs, :inputs~
    +      state.camera_magenta.w = w + 64
    +** Processing line: ~      state.camera_magenta.h = h + 64~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :state, :outputs, :inputs
    -** Processing line: ~~
    +      state.camera_magenta.h = h + 64
    +** Processing line: ~      outputs[:scene_magenta].width = (w) * 2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Creates empty collection called highlights.~
    +      outputs[:scene_magenta].width = (w) * 2
    +** Processing line: ~      outputs[:scene_magenta].height = h~
     - Inside source: true
     *** True Line Result
    -    # Creates empty collection called highlights.
    -** Processing line: ~    # Calls methods necessary to run the game.~
    +      outputs[:scene_magenta].height = h
    +** Processing line: ~      outputs.sprites << {x: m_x,~
     - Inside source: true
     *** True Line Result
    -    # Calls methods necessary to run the game.
    -** Processing line: ~    def tick~
    +      outputs.sprites << {x: m_x,
    +** Processing line: ~                          y: m_y,~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      state.layout.highlights ||= []~
    +                          y: m_y,
    +** Processing line: ~                          w: w,~
     - Inside source: true
     *** True Line Result
    -      state.layout.highlights ||= []
    -** Processing line: ~      game.tick if game.should_tick?~
    +                          w: w,
    +** Processing line: ~                          h: h,~
     - Inside source: true
     *** True Line Result
    -      game.tick if game.should_tick?
    -** Processing line: ~      render~
    +                          h: h,
    +** Processing line: ~                          path: :scene_magenta}~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      process_input~
    +                          path: :scene_magenta}
    +** Processing line: ~      outputs.sprites << {x: c_x,~
     - Inside source: true
     *** True Line Result
    -      process_input
    -** Processing line: ~    end~
    +      outputs.sprites << {x: c_x,
    +** Processing line: ~                          y: c_y,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +                          y: c_y,
    +** Processing line: ~                          w: w,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Outputs a label of the tick count (passage of time) and calls all render methods.~
    +                          w: w,
    +** Processing line: ~                          h: h,~
     - Inside source: true
     *** True Line Result
    -    # Outputs a label of the tick count (passage of time) and calls all render methods.
    -** Processing line: ~    def render~
    +                          h: h,
    +** Processing line: ~                          path: :scene_cyan}~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      outputs.labels << [10, 30, state.tick_count]~
    +                          path: :scene_cyan}
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [10, 30, state.tick_count]
    -** Processing line: ~      render_alert~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      render_alert
    -** Processing line: ~      render_room~
    +
    +** Processing line: ~    def add_trauma amount~
     - Inside source: true
     *** True Line Result
    -      render_room
    -** Processing line: ~      render_highlights~
    +    def add_trauma amount
    +** Processing line: ~      state.trauma = [state.trauma + amount, 1.0].min~
     - Inside source: true
     *** True Line Result
    -      render_highlights
    +      state.trauma = [state.trauma + amount, 1.0].min
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44648,150 +52891,158 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.~
    +** Processing line: ~    def remove_trauma amount~
     - Inside source: true
     *** True Line Result
    -    # Outputs a label onto the screen that shows the story line, and also outputs a "close" button.
    -** Processing line: ~    def render_alert~
    +    def remove_trauma amount
    +** Processing line: ~      state.trauma = [state.trauma - amount, 0.0].max~
     - Inside source: true
     *** True Line Result
    -    def render_alert
    -** Processing line: ~      return unless game.active_module == :alert~
    +      state.trauma = [state.trauma - amount, 0.0].max
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      return unless game.active_module == :alert
    -** Processing line: ~~
    +    end
    +** Processing line: ~    #==============================================================================================~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label~
    +    #==============================================================================================
    +** Processing line: ~    #Input functions~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [640, 480, game.story_line, 5, 1]  # outputs story line label
    -** Processing line: ~      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line~
    +    #Input functions
    +** Processing line: ~    def input~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << button(:alert_dismiss, 490, 380, "close")  # positions "close" button under story line
    -** Processing line: ~    end~
    +    def input
    +** Processing line: ~      input_move_cyan~
     - Inside source: true
     *** True Line Result
    -    end
    +      input_move_cyan
    +** Processing line: ~      input_move_magenta~
    +- Inside source: true
    +*** True Line Result
    +      input_move_magenta
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_room~
    +** Processing line: ~      if inputs.keyboard.key_down.t~
     - Inside source: true
     *** True Line Result
    -    def render_room
    -** Processing line: ~      return unless game.active_module == :room~
    +      if inputs.keyboard.key_down.t
    +** Processing line: ~        add_trauma(0.5)~
     - Inside source: true
     *** True Line Result
    -      return unless game.active_module == :room
    -** Processing line: ~      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen~
    +        add_trauma(0.5)
    +** Processing line: ~      elsif inputs.keyboard.key_down.y~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [640, 700, game.room_title, 4, 1] # outputs room title label at top of screen
    -** Processing line: ~~
    +      elsif inputs.keyboard.key_down.y
    +** Processing line: ~        remove_trauma(0.1)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value~
    +        remove_trauma(0.1)
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      # The parameters for these outputs are (symbol, x, y, text, value/percentage) and each has a y value
    -** Processing line: ~      # that positions it 60 pixels lower than the previous output.~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      # that positions it 60 pixels lower than the previous output.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)~
    +** Processing line: ~    def input_move_cyan~
     - Inside source: true
     *** True Line Result
    -      # outputs the light_fire_progress bar, uses light_fire_progress for its percentage (which changes bar's appearance)
    -** Processing line: ~      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)~
    +    def input_move_cyan
    +** Processing line: ~      if inputs.keyboard.key_held.up~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << progress_bar(:light_fire, 490, 600, "light fire", game.light_fire_progress)
    -** Processing line: ~      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button~
    +      if inputs.keyboard.key_held.up
    +** Processing line: ~        state.player_cyan.dy = 5~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << button(       :save_game, 490, 540, "save") # outputs save button
    -** Processing line: ~      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button~
    +        state.player_cyan.dy = 5
    +** Processing line: ~        state.player_cyan.orientation = "up"~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << button(       :load_game, 490, 480, "load") # outputs load button
    -** Processing line: ~      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button~
    +        state.player_cyan.orientation = "up"
    +** Processing line: ~      elsif inputs.keyboard.key_held.down~
     - Inside source: true
     *** True Line Result
    -      outputs.primitives << button(      :reset_game, 490, 420, "reset") # outputs reset button
    -** Processing line: ~      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen~
    +      elsif inputs.keyboard.key_held.down
    +** Processing line: ~        state.player_cyan.dy = -5~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [640, 30, "the fire is #{game.fire}", 0, 1] # outputs fire label at bottom of screen
    -** Processing line: ~    end~
    +        state.player_cyan.dy = -5
    +** Processing line: ~        state.player_cyan.orientation = "down"~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        state.player_cyan.orientation = "down"
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.~
    +      else
    +** Processing line: ~        state.player_cyan.dy *= 0.8~
     - Inside source: true
     *** True Line Result
    -    # Outputs a collection of highlights using an array to set their values, and also rejects certain values from the collection.
    -** Processing line: ~    def render_highlights~
    +        state.player_cyan.dy *= 0.8
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    def render_highlights
    -** Processing line: ~      state.layout.highlights.each do |h| # for each highlight in the collection~
    +      end
    +** Processing line: ~      if inputs.keyboard.key_held.left~
     - Inside source: true
     *** True Line Result
    -      state.layout.highlights.each do |h| # for each highlight in the collection
    -** Processing line: ~          h.lifetime -= 1 # decrease the value of its lifetime~
    +      if inputs.keyboard.key_held.left
    +** Processing line: ~        state.player_cyan.dx = -5~
     - Inside source: true
     *** True Line Result
    -          h.lifetime -= 1 # decrease the value of its lifetime
    -** Processing line: ~        end~
    +        state.player_cyan.dx = -5
    +** Processing line: ~        state.player_cyan.orientation = "left"~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~~
    +        state.player_cyan.orientation = "left"
    +** Processing line: ~      elsif inputs.keyboard.key_held.right~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection~
    +      elsif inputs.keyboard.key_held.right
    +** Processing line: ~        state.player_cyan.dx = 5~
     - Inside source: true
     *** True Line Result
    -        outputs.solids << state.layout.highlights.map do |h| # outputs highlights collection
    -** Processing line: ~          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight~
    +        state.player_cyan.dx = 5
    +** Processing line: ~        state.player_cyan.orientation = "right"~
     - Inside source: true
     *** True Line Result
    -          [h.x, h.y, h.w, h.h, h.color, 255 * h.lifetime / h.max_lifetime] # sets definition for each highlight
    -** Processing line: ~          # transparency changes; divide lifetime by max_lifetime, multiply result by 255~
    +        state.player_cyan.orientation = "right"
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -          # transparency changes; divide lifetime by max_lifetime, multiply result by 255
    -** Processing line: ~        end~
    +      else
    +** Processing line: ~        state.player_cyan.dx *= 0.8~
     - Inside source: true
     *** True Line Result
    -        end
    +        state.player_cyan.dx *= 0.8
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~        # reject highlights from collection that have no remaining lifetime~
    +** Processing line: ~      outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255]~
     - Inside source: true
     *** True Line Result
    -        # reject highlights from collection that have no remaining lifetime
    -** Processing line: ~        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }~
    +      outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255]
    +** Processing line: ~      outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255]~
     - Inside source: true
     *** True Line Result
    -        state.layout.highlights = state.layout.highlights.reject { |h| h.lifetime <= 0 }
    +      outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -44800,246 +53051,274 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Checks whether or not a button was clicked.~
    +** Processing line: ~    def input_move_magenta~
     - Inside source: true
     *** True Line Result
    -    # Checks whether or not a button was clicked.
    -** Processing line: ~    # Returns a boolean value.~
    +    def input_move_magenta
    +** Processing line: ~      if inputs.keyboard.key_held.w~
     - Inside source: true
     *** True Line Result
    -    # Returns a boolean value.
    -** Processing line: ~    def process_input~
    +      if inputs.keyboard.key_held.w
    +** Processing line: ~        state.player_magenta.dy = 5~
     - Inside source: true
     *** True Line Result
    -    def process_input
    -** Processing line: ~      button = button_clicked? # calls button_clicked? method~
    +        state.player_magenta.dy = 5
    +** Processing line: ~        state.player_magenta.orientation = "up"~
     - Inside source: true
     *** True Line Result
    -      button = button_clicked? # calls button_clicked? method
    -** Processing line: ~    end~
    +        state.player_magenta.orientation = "up"
    +** Processing line: ~      elsif inputs.keyboard.key_held.s~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      elsif inputs.keyboard.key_held.s
    +** Processing line: ~        state.player_magenta.dy = -5~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Returns a boolean value.~
    +        state.player_magenta.dy = -5
    +** Processing line: ~        state.player_magenta.orientation = "down"~
     - Inside source: true
     *** True Line Result
    -    # Returns a boolean value.
    -** Processing line: ~    # Finds the button that was clicked from the button list and determines what method to call.~
    +        state.player_magenta.orientation = "down"
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -    # Finds the button that was clicked from the button list and determines what method to call.
    -** Processing line: ~    # Adds a highlight to the highlights collection.~
    +      else
    +** Processing line: ~        state.player_magenta.dy *= 0.8~
     - Inside source: true
     *** True Line Result
    -    # Adds a highlight to the highlights collection.
    -** Processing line: ~    def button_clicked?~
    +        state.player_magenta.dy *= 0.8
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    def button_clicked?
    -** Processing line: ~      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click~
    +      end
    +** Processing line: ~      if inputs.keyboard.key_held.a~
     - Inside source: true
     *** True Line Result
    -      return nil unless click_pos # return nil unless click_pos holds coordinates of mouse click
    -** Processing line: ~        button = @button_list.find do |k, v| # goes through button_list to find button clicked~
    +      if inputs.keyboard.key_held.a
    +** Processing line: ~        state.player_magenta.dx = -5~
     - Inside source: true
     *** True Line Result
    -        button = @button_list.find do |k, v| # goes through button_list to find button clicked
    -** Processing line: ~          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?~
    +        state.player_magenta.dx = -5
    +** Processing line: ~        state.player_magenta.orientation = "left"~
     - Inside source: true
     *** True Line Result
    -          click_pos.inside_rect? v[:primitives].last.rect # was the mouse clicked inside the rect of button?
    -** Processing line: ~        end~
    +        state.player_magenta.orientation = "left"
    +** Processing line: ~      elsif inputs.keyboard.key_held.d~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~        return unless button # return unless a button was clicked~
    +      elsif inputs.keyboard.key_held.d
    +** Processing line: ~        state.player_magenta.dx = 5~
     - Inside source: true
     *** True Line Result
    -        return unless button # return unless a button was clicked
    -** Processing line: ~        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)~
    +        state.player_magenta.dx = 5
    +** Processing line: ~        state.player_magenta.orientation = "right"~
     - Inside source: true
     *** True Line Result
    -        method_to_call = "#{button[0]}_clicked".to_sym # sets method_to_call to symbol (like :save_game or :load_game)
    -** Processing line: ~        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)~
    +        state.player_magenta.orientation = "right"
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -        if self.respond_to? method_to_call # returns true if self responds to the given method (method actually exists)
    -** Processing line: ~          border = button[1][:primitives].last # sets border definition using value of last key in button list hash~
    +      else
    +** Processing line: ~        state.player_magenta.dx *= 0.8~
     - Inside source: true
     *** True Line Result
    -          border = button[1][:primitives].last # sets border definition using value of last key in button list hash
    +        state.player_magenta.dx *= 0.8
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~          # declares each highlight as a new entity, sets properties~
    +** Processing line: ~      outputs.labels << [128,360,"#{state.player_magenta.x.round()}",8,2,255,0,255,255]~
     - Inside source: true
     *** True Line Result
    -          # declares each highlight as a new entity, sets properties
    -** Processing line: ~          state.layout.highlights << state.new_entity(:highlight) do |h|~
    +      outputs.labels << [128,360,"#{state.player_magenta.x.round()}",8,2,255,0,255,255]
    +** Processing line: ~      outputs.labels << [128,328,"#{state.player_magenta.y.round()}",8,2,255,0,255,255]~
     - Inside source: true
     *** True Line Result
    -          state.layout.highlights << state.new_entity(:highlight) do |h|
    -** Processing line: ~              h.x = border.x~
    +      outputs.labels << [128,328,"#{state.player_magenta.y.round()}",8,2,255,0,255,255]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -              h.x = border.x
    -** Processing line: ~              h.y = border.y~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -              h.y = border.y
    -** Processing line: ~              h.w = border.w~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              h.w = border.w
    -** Processing line: ~              h.h = border.h~
    +
    +** Processing line: ~  $camera_movement = CameraMovement.new~
     - Inside source: true
     *** True Line Result
    -              h.h = border.h
    -** Processing line: ~              h.max_lifetime = 10~
    +  $camera_movement = CameraMovement.new
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              h.max_lifetime = 10
    -** Processing line: ~              h.lifetime = h.max_lifetime~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -              h.lifetime = h.max_lifetime
    -** Processing line: ~              h.color = [120, 120, 180] # sets color to shade of purple~
    +  def tick args
    +** Processing line: ~    args.outputs.background_color = [0,0,0]~
     - Inside source: true
     *** True Line Result
    -              h.color = [120, 120, 180] # sets color to shade of purple
    -** Processing line: ~            end~
    +    args.outputs.background_color = [0,0,0]
    +** Processing line: ~    $camera_movement.inputs  = args.inputs~
     - Inside source: true
     *** True Line Result
    -            end
    -** Processing line: ~~
    +    $camera_movement.inputs  = args.inputs
    +** Processing line: ~    $camera_movement.outputs = args.outputs~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~            self.send method_to_call # invoke method identified by symbol~
    +    $camera_movement.outputs = args.outputs
    +** Processing line: ~    $camera_movement.state   = args.state~
     - Inside source: true
     *** True Line Result
    -            self.send method_to_call # invoke method identified by symbol
    -** Processing line: ~          else # otherwise, if self doesn't respond to given method~
    +    $camera_movement.state   = args.state
    +** Processing line: ~    $camera_movement.grid    = args.grid~
     - Inside source: true
     *** True Line Result
    -          else # otherwise, if self doesn't respond to given method
    -** Processing line: ~            border = button[1][:primitives].last # sets border definition using value of last key in hash~
    +    $camera_movement.grid    = args.grid
    +** Processing line: ~    $camera_movement.tick~
     - Inside source: true
     *** True Line Result
    -            border = button[1][:primitives].last # sets border definition using value of last key in hash
    +    $camera_movement.tick
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            # declares each highlight as a new entity, sets properties~
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Advanced Rendering - Z Targeting Camera - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Rendering - Z Targeting Camera - 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/09_z_targeting_camera/app/main.rb~
     - Inside source: true
     *** True Line Result
    -            # declares each highlight as a new entity, sets properties
    -** Processing line: ~            state.layout.highlights << state.new_entity(:highlight) do |h|~
    +  # ./samples/07_advanced_rendering/09_z_targeting_camera/app/main.rb
    +** Processing line: ~  class Game~
     - Inside source: true
     *** True Line Result
    -            state.layout.highlights << state.new_entity(:highlight) do |h|
    -** Processing line: ~              h.x = border.x~
    +  class Game
    +** Processing line: ~    attr_gtk~
     - Inside source: true
     *** True Line Result
    -              h.x = border.x
    -** Processing line: ~              h.y = border.y~
    +    attr_gtk
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -              h.y = border.y
    -** Processing line: ~              h.w = border.w~
    +
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -              h.w = border.w
    -** Processing line: ~              h.h = border.h~
    +    def tick
    +** Processing line: ~      defaults~
     - Inside source: true
     *** True Line Result
    -              h.h = border.h
    -** Processing line: ~              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true~
    +      defaults
    +** Processing line: ~      render~
     - Inside source: true
     *** True Line Result
    -              h.max_lifetime = 4 # different max_lifetime than the one set if respond_to? had been true
    -** Processing line: ~              h.lifetime = h.max_lifetime~
    +      render
    +** Processing line: ~      input~
     - Inside source: true
     *** True Line Result
    -              h.lifetime = h.max_lifetime
    -** Processing line: ~              h.color = [120, 80, 80] # sets color to dark color~
    +      input
    +** Processing line: ~      calc~
     - Inside source: true
     *** True Line Result
    -              h.color = [120, 80, 80] # sets color to dark color
    -** Processing line: ~            end~
    +      calc
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~            # instructions for users on how to add the missing method_to_call to the code~
    +** Processing line: ~    def defaults~
     - Inside source: true
     *** True Line Result
    -            # instructions for users on how to add the missing method_to_call to the code
    -** Processing line: ~            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"~
    +    def defaults
    +** Processing line: ~      outputs.background_color = [219, 208, 191]~
     - Inside source: true
     *** True Line Result
    -            puts "It looks like #{method_to_call} doesn't exists on TextedBasedGamePresenter. Please add this method:"
    -** Processing line: ~            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."~
    +      outputs.background_color = [219, 208, 191]
    +** Processing line: ~      player.x        ||= 634~
     - Inside source: true
     *** True Line Result
    -            puts "Just copy the code below and put it in the #{TextedBasedGamePresenter} class definition."
    -** Processing line: ~            puts ""~
    +      player.x        ||= 634
    +** Processing line: ~      player.y        ||= 153~
     - Inside source: true
     *** True Line Result
    -            puts ""
    -** Processing line: ~            puts "```"~
    +      player.y        ||= 153
    +** Processing line: ~      player.angle    ||= 90~
     - Inside source: true
     *** True Line Result
    -            puts "```"
    -** Processing line: ~            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"~
    +      player.angle    ||= 90
    +** Processing line: ~      player.distance ||= arena_radius~
     - Inside source: true
     *** True Line Result
    -            puts "class TextedBasedGamePresenter <--- find this class and put the method below in it"
    -** Processing line: ~            puts ""~
    +      player.distance ||= arena_radius
    +** Processing line: ~      target.x        ||= 634~
     - Inside source: true
     *** True Line Result
    -            puts ""
    -** Processing line: ~            puts "  def #{method_to_call}"~
    +      target.x        ||= 634
    +** Processing line: ~      target.y        ||= 359~
     - Inside source: true
     *** True Line Result
    -            puts "  def #{method_to_call}"
    -** Processing line: ~            puts "    puts 'Yay that worked!'"~
    +      target.y        ||= 359
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -            puts "    puts 'Yay that worked!'"
    -** Processing line: ~            puts "  end"~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            puts "  end"
    -** Processing line: ~            puts ""~
    +
    +** Processing line: ~    def render~
     - Inside source: true
     *** True Line Result
    -            puts ""
    -** Processing line: ~            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."~
    +    def render
    +** Processing line: ~      outputs[:scene].sprites << ([0, 0, 933, 700, 'sprites/arena.png'].center_inside_rect grid.rect)~
     - Inside source: true
     *** True Line Result
    -            puts "end <-- make sure to put the #{method_to_call} method in between the `class` word and the final `end` statement."
    -** Processing line: ~            puts "```"~
    +      outputs[:scene].sprites << ([0, 0, 933, 700, 'sprites/arena.png'].center_inside_rect grid.rect)
    +** Processing line: ~      outputs[:scene].sprites << target_sprite~
     - Inside source: true
     *** True Line Result
    -            puts "```"
    -** Processing line: ~            puts ""~
    +      outputs[:scene].sprites << target_sprite
    +** Processing line: ~      outputs[:scene].sprites << player_sprite~
     - Inside source: true
     *** True Line Result
    -            puts ""
    -** Processing line: ~        end~
    +      outputs[:scene].sprites << player_sprite
    +** Processing line: ~      outputs.sprites << scene~
     - Inside source: true
     *** True Line Result
    -        end
    +      outputs.sprites << scene
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45048,22 +53327,30 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Returns the position of the mouse when it is clicked.~
    +** Processing line: ~    def target_sprite~
     - Inside source: true
     *** True Line Result
    -    # Returns the position of the mouse when it is clicked.
    -** Processing line: ~    def click_pos~
    +    def target_sprite
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -    def click_pos
    -** Processing line: ~      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked~
    +      {
    +** Processing line: ~        x: target.x, y: target.y,~
     - Inside source: true
     *** True Line Result
    -      return nil unless inputs.mouse.click # returns nil unless the mouse was clicked
    -** Processing line: ~      return inputs.mouse.click.point # returns location of mouse click (coordinates)~
    +        x: target.x, y: target.y,
    +** Processing line: ~        w: 10, h: 10,~
     - Inside source: true
     *** True Line Result
    -      return inputs.mouse.click.point # returns location of mouse click (coordinates)
    +        w: 10, h: 10,
    +** Processing line: ~        path: 'sprites/square/black.png'~
    +- Inside source: true
    +*** True Line Result
    +        path: 'sprites/square/black.png'
    +** Processing line: ~      }.anchor_rect 0.5, 0.5~
    +- Inside source: true
    +*** True Line Result
    +      }.anchor_rect 0.5, 0.5
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45072,54 +53359,58 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)~
    -- Inside source: true
    -*** True Line Result
    -    # Creates buttons for the button_list and sets their values using a hash (uses symbols as keys)
    -** Processing line: ~    def button id, x, y, text~
    +** Processing line: ~    def input~
     - Inside source: true
     *** True Line Result
    -    def button id, x, y, text
    -** Processing line: ~      @button_list[id] ||= { # assigns values to hash keys~
    +    def input
    +** Processing line: ~      if inputs.up && player.distance > 30~
     - Inside source: true
     *** True Line Result
    -      @button_list[id] ||= { # assigns values to hash keys
    -** Processing line: ~        id: id,~
    +      if inputs.up && player.distance > 30
    +** Processing line: ~        player.distance -= 2~
     - Inside source: true
     *** True Line Result
    -        id: id,
    -** Processing line: ~        text: text,~
    +        player.distance -= 2
    +** Processing line: ~      elsif inputs.down && player.distance < 200~
     - Inside source: true
     *** True Line Result
    -        text: text,
    -** Processing line: ~        primitives: [~
    +      elsif inputs.down && player.distance < 200
    +** Processing line: ~        player.distance += 2~
     - Inside source: true
     *** True Line Result
    -        primitives: [
    -** Processing line: ~          [x + 10, y + 30, text, 2, 0].label, # positions label inside border~
    +        player.distance += 2
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -          [x + 10, y + 30, text, 2, 0].label, # positions label inside border
    -** Processing line: ~          [x, y, 300, 50].border,             # sets definition of border~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          [x, y, 300, 50].border,             # sets definition of border
    -** Processing line: ~        ]~
    +
    +** Processing line: ~      player.angle += inputs.left_right * -1~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~      }~
    +      player.angle += inputs.left_right * -1
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      }
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      @button_list[id][:primitives] # returns label and border for buttons~
    +** Processing line: ~    def calc~
     - Inside source: true
     *** True Line Result
    -      @button_list[id][:primitives] # returns label and border for buttons
    +    def calc
    +** Processing line: ~      player.x = target.x + ((player.angle *  1).vector_x player.distance)~
    +- Inside source: true
    +*** True Line Result
    +      player.x = target.x + ((player.angle *  1).vector_x player.distance)
    +** Processing line: ~      player.y = target.y + ((player.angle * -1).vector_y player.distance)~
    +- Inside source: true
    +*** True Line Result
    +      player.y = target.y + ((player.angle * -1).vector_y player.distance)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45128,70 +53419,58 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Creates a progress bar (used for lighting the fire) and sets its values.~
    -- Inside source: true
    -*** True Line Result
    -    # Creates a progress bar (used for lighting the fire) and sets its values.
    -** Processing line: ~    def progress_bar id, x, y, text, percentage~
    +** Processing line: ~    def player_sprite~
     - Inside source: true
     *** True Line Result
    -    def progress_bar id, x, y, text, percentage
    -** Processing line: ~      @button_list[id] = { # assigns values to hash keys~
    +    def player_sprite
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -      @button_list[id] = { # assigns values to hash keys
    -** Processing line: ~        id: id,~
    +      {
    +** Processing line: ~        x: player.x,~
     - Inside source: true
     *** True Line Result
    -        id: id,
    -** Processing line: ~        text: text,~
    +        x: player.x,
    +** Processing line: ~        y: player.y,~
     - Inside source: true
     *** True Line Result
    -        text: text,
    -** Processing line: ~        primitives: [~
    +        y: player.y,
    +** Processing line: ~        w: 50,~
     - Inside source: true
     *** True Line Result
    -        primitives: [
    -** Processing line: ~          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)~
    +        w: 50,
    +** Processing line: ~        h: 100,~
     - Inside source: true
     *** True Line Result
    -          [x, y, 300, 50, 100, 100, 100].solid, # sets definition for solid (which fills the bar with gray)
    -** Processing line: ~          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border~
    +        h: 100,
    +** Processing line: ~        path: 'sprites/player.png',~
     - Inside source: true
     *** True Line Result
    -          [x + 10, y + 30, text, 2, 0].label, # sets definition for label, positions inside border
    -** Processing line: ~          [x, y, 300, 50].border, # sets definition of border~
    +        path: 'sprites/player.png',
    +** Processing line: ~        angle: (player.angle * -1) + 90~
     - Inside source: true
     *** True Line Result
    -          [x, y, 300, 50].border, # sets definition of border
    -** Processing line: ~        ]~
    +        angle: (player.angle * -1) + 90
    +** Processing line: ~      }.anchor_rect 0.5, 0~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~      }~
    +      }.anchor_rect 0.5, 0
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      }
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by~
    -- Inside source: true
    -*** True Line Result
    -      # Fills progress bar based on percentage. If the fire was ready to be lit (100%) and we multiplied by
    -** Processing line: ~      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.~
    -- Inside source: true
    -*** True Line Result
    -      # 100, only 1/3 of the bar would only be filled in. 200 would cause only 2/3 to be filled in.
    -** Processing line: ~      @button_list[id][:primitives][0][2] = 300 * percentage~
    +** Processing line: ~    def center_map~
     - Inside source: true
     *** True Line Result
    -      @button_list[id][:primitives][0][2] = 300 * percentage
    -** Processing line: ~      @button_list[id][:primitives]~
    +    def center_map
    +** Processing line: ~      { x: 634, y: 359 }~
     - Inside source: true
     *** True Line Result
    -      @button_list[id][:primitives]
    +      { x: 634, y: 359 }
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45200,18 +53479,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Defines the game.~
    -- Inside source: true
    -*** True Line Result
    -    # Defines the game.
    -** Processing line: ~    def game~
    +** Processing line: ~    def zoom_factor_single~
     - Inside source: true
     *** True Line Result
    -    def game
    -** Processing line: ~      @game~
    +    def zoom_factor_single
    +** Processing line: ~      2 - ((args.geometry.distance player, center_map).fdiv arena_radius)~
     - Inside source: true
     *** True Line Result
    -      @game
    +      2 - ((args.geometry.distance player, center_map).fdiv arena_radius)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45220,22 +53495,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Initalizes the game and creates an empty list of buttons.~
    -- Inside source: true
    -*** True Line Result
    -    # Initalizes the game and creates an empty list of buttons.
    -** Processing line: ~    def initialize~
    -- Inside source: true
    -*** True Line Result
    -    def initialize
    -** Processing line: ~      @game = TextedBasedGame.new self~
    +** Processing line: ~    def zoom_factor~
     - Inside source: true
     *** True Line Result
    -      @game = TextedBasedGame.new self
    -** Processing line: ~      @button_list ||= {}~
    +    def zoom_factor
    +** Processing line: ~      zoom_factor_single ** 2~
     - Inside source: true
     *** True Line Result
    -      @button_list ||= {}
    +      zoom_factor_single ** 2
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45244,22 +53511,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Clears the storyline and takes the user to the room.~
    -- Inside source: true
    -*** True Line Result
    -    # Clears the storyline and takes the user to the room.
    -** Processing line: ~    def alert_dismiss_clicked~
    -- Inside source: true
    -*** True Line Result
    -    def alert_dismiss_clicked
    -** Processing line: ~      game.clear_storyline~
    +** Processing line: ~    def arena_radius~
     - Inside source: true
     *** True Line Result
    -      game.clear_storyline
    -** Processing line: ~      game.go_to_room~
    +    def arena_radius
    +** Processing line: ~      206~
     - Inside source: true
     *** True Line Result
    -      game.go_to_room
    +      206
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45268,38 +53527,50 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Lights the fire when the user clicks the "light fire" option.~
    +** Processing line: ~    def scene~
     - Inside source: true
     *** True Line Result
    -    # Lights the fire when the user clicks the "light fire" option.
    -** Processing line: ~    def light_fire_clicked~
    +    def scene
    +** Processing line: ~      {~
     - Inside source: true
     *** True Line Result
    -    def light_fire_clicked
    -** Processing line: ~      game.light_fire~
    +      {
    +** Processing line: ~        x:    (640 - player.x) + (640 - (640 * zoom_factor)),~
     - Inside source: true
     *** True Line Result
    -      game.light_fire
    -** Processing line: ~    end~
    +        x:    (640 - player.x) + (640 - (640 * zoom_factor)),
    +** Processing line: ~        y:    (360 - player.y - (75 * zoom_factor)) + (320 - (320 * zoom_factor)),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        y:    (360 - player.y - (75 * zoom_factor)) + (320 - (320 * zoom_factor)),
    +** Processing line: ~        w:    1280 * zoom_factor,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Saves the game when the user clicks the "save" option.~
    +        w:    1280 * zoom_factor,
    +** Processing line: ~        h:     720 * zoom_factor,~
     - Inside source: true
     *** True Line Result
    -    # Saves the game when the user clicks the "save" option.
    -** Processing line: ~    def save_game_clicked~
    +        h:     720 * zoom_factor,
    +** Processing line: ~        path: :scene,~
     - Inside source: true
     *** True Line Result
    -    def save_game_clicked
    -** Processing line: ~      game.save~
    +        path: :scene,
    +** Processing line: ~        angle: player.angle - 90,~
     - Inside source: true
     *** True Line Result
    -      game.save
    +        angle: player.angle - 90,
    +** Processing line: ~        angle_anchor_x: (player.x.fdiv 1280),~
    +- Inside source: true
    +*** True Line Result
    +        angle_anchor_x: (player.x.fdiv 1280),
    +** Processing line: ~        angle_anchor_y: (player.y.fdiv 720)~
    +- Inside source: true
    +*** True Line Result
    +        angle_anchor_y: (player.y.fdiv 720)
    +** Processing line: ~      }~
    +- Inside source: true
    +*** True Line Result
    +      }
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45308,18 +53579,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Resets the game when the user clicks the "reset" option.~
    -- Inside source: true
    -*** True Line Result
    -    # Resets the game when the user clicks the "reset" option.
    -** Processing line: ~    def reset_game_clicked~
    +** Processing line: ~    def player~
     - Inside source: true
     *** True Line Result
    -    def reset_game_clicked
    -** Processing line: ~      game.reset~
    +    def player
    +** Processing line: ~      state.player~
     - Inside source: true
     *** True Line Result
    -      game.reset
    +      state.player
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45328,18 +53595,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Loads the game when the user clicks the "load" option.~
    -- Inside source: true
    -*** True Line Result
    -    # Loads the game when the user clicks the "load" option.
    -** Processing line: ~    def load_game_clicked~
    +** Processing line: ~    def target~
     - Inside source: true
     *** True Line Result
    -    def load_game_clicked
    -** Processing line: ~      game.load~
    +    def target
    +** Processing line: ~      state.target~
     - Inside source: true
     *** True Line Result
    -      game.load
    +      state.target
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -45352,34 +53615,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $text_based_rpg = TextedBasedGamePresenter.new~
    -- Inside source: true
    -*** True Line Result
    -  $text_based_rpg = TextedBasedGamePresenter.new
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
     ** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
       def tick args
    -** Processing line: ~    $text_based_rpg.state = args.state~
    -- Inside source: true
    -*** True Line Result
    -    $text_based_rpg.state = args.state
    -** Processing line: ~    $text_based_rpg.outputs = args.outputs~
    +** Processing line: ~    $game ||= Game.new~
     - Inside source: true
     *** True Line Result
    -    $text_based_rpg.outputs = args.outputs
    -** Processing line: ~    $text_based_rpg.inputs = args.inputs~
    +    $game ||= Game.new
    +** Processing line: ~    $game.args = args~
     - Inside source: true
     *** True Line Result
    -    $text_based_rpg.inputs = args.inputs
    -** Processing line: ~    $text_based_rpg.tick~
    +    $game.args = args
    +** Processing line: ~    $game.tick~
     - Inside source: true
     *** True Line Result
    -    $text_based_rpg.tick
    +    $game.tick
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -45388,6 +53639,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~  $gtk.reset~
    +- Inside source: true
    +*** True Line Result
    +  $gtk.reset
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
     ** Processing line: ~#+end_src~
     - Line was identified as the end of a code block.
     *** True Line Result
    @@ -45396,218 +53655,214 @@ 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 - Simple Render Targets - main.rb~
    +** Processing line: ~*** Advanced Rendering - Blend Modes - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Simple Render Targets - main.rb
    +*** Advanced Rendering - Blend Modes - 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/01_simple_render_targets/app/main.rb~
    -- Inside source: true
    -*** True Line Result
    -  # ./samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
    -** Processing line: ~  def tick args~
    -- Inside source: true
    -*** True Line Result
    -  def tick args
    -** Processing line: ~    # args.outputs.render_targets are really really powerful.~
    +** Processing line: ~  # ./samples/07_advanced_rendering/10_blend_modes/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    # args.outputs.render_targets are really really powerful.
    -** Processing line: ~    # They essentially allow you to create a sprite programmatically and cache the result.~
    +  # ./samples/07_advanced_rendering/10_blend_modes/app/main.rb
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -    # They essentially allow you to create a sprite programmatically and cache the result.
    +  $gtk.reset
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Create a render_target of a :block and a :gradient on tick zero.~
    +** Processing line: ~  def draw_blendmode args, mode~
     - Inside source: true
     *** True Line Result
    -    # Create a render_target of a :block and a :gradient on tick zero.
    -** Processing line: ~    if args.state.tick_count == 0~
    +  def draw_blendmode args, mode
    +** Processing line: ~    w = 160~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count == 0
    -** Processing line: ~      args.render_target(:block).solids << [0, 0, 1280, 100]~
    +    w = 160
    +** Processing line: ~    h = w~
     - Inside source: true
     *** True Line Result
    -      args.render_target(:block).solids << [0, 0, 1280, 100]
    -** Processing line: ~~
    +    h = w
    +** Processing line: ~    args.state.x += (1280-w) / (args.state.blendmodes.length + 1)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # The gradient is actually just a collection of black solids with increasing~
    +    args.state.x += (1280-w) / (args.state.blendmodes.length + 1)
    +** Processing line: ~    x = args.state.x~
     - Inside source: true
     *** True Line Result
    -      # The gradient is actually just a collection of black solids with increasing
    -** Processing line: ~      # opacities.~
    +    x = args.state.x
    +** Processing line: ~    y = (720 - h) / 2~
     - Inside source: true
     *** True Line Result
    -      # opacities.
    -** Processing line: ~      args.render_target(:gradient).solids << 90.map_with_index do |x|~
    +    y = (720 - h) / 2
    +** Processing line: ~    s = 'sprites/blue-feathered.png'~
     - Inside source: true
     *** True Line Result
    -      args.render_target(:gradient).solids << 90.map_with_index do |x|
    -** Processing line: ~        50.map_with_index do |y|~
    +    s = 'sprites/blue-feathered.png'
    +** Processing line: ~    args.outputs.sprites << { blendmode_enum: mode.value, x: x, y: y, w: w, h: h, path: s }~
     - Inside source: true
     *** True Line Result
    -        50.map_with_index do |y|
    -** Processing line: ~          [x * 15, y * 15, 15, 15, 0, 0, 0, (x * 3).fdiv(255) * 255]~
    +    args.outputs.sprites << { blendmode_enum: mode.value, x: x, y: y, w: w, h: h, path: s }
    +** Processing line: ~    args.outputs.labels << [x + (w/2), y, mode.name.to_s, 1, 1, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -          [x * 15, y * 15, 15, 15, 0, 0, 0, (x * 3).fdiv(255) * 255]
    -** Processing line: ~        end~
    +    args.outputs.labels << [x + (w/2), y, mode.name.to_s, 1, 1, 255, 255, 255]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    end
    +  def tick args
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Take the :block render_target and present it horizontally centered.~
    +** Processing line: ~    # Different blend modes do different things, depending on what they~
     - Inside source: true
     *** True Line Result
    -    # Take the :block render_target and present it horizontally centered.
    -** Processing line: ~    # Use a subsection of the render_targetd specified by source_x,~
    +    # Different blend modes do different things, depending on what they
    +** Processing line: ~    # blend against (in this case, the pixels of the background color).~
     - Inside source: true
     *** True Line Result
    -    # Use a subsection of the render_targetd specified by source_x,
    -** Processing line: ~    # source_y, source_w, source_h.~
    +    # blend against (in this case, the pixels of the background color).
    +** Processing line: ~    args.state.bg_element ||= 1~
     - Inside source: true
     *** True Line Result
    -    # source_y, source_w, source_h.
    -** Processing line: ~    args.outputs.sprites << { x: 0,~
    +    args.state.bg_element ||= 1
    +** Processing line: ~    args.state.bg_color ||= 255~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << { x: 0,
    -** Processing line: ~                              y: 310,~
    +    args.state.bg_color ||= 255
    +** Processing line: ~    args.state.bg_color_direction ||= 1~
     - Inside source: true
     *** True Line Result
    -                              y: 310,
    -** Processing line: ~                              w: 1280,~
    +    args.state.bg_color_direction ||= 1
    +** Processing line: ~    bg_r = (args.state.bg_element == 1) ? args.state.bg_color : 0~
     - Inside source: true
     *** True Line Result
    -                              w: 1280,
    -** Processing line: ~                              h: 100,~
    +    bg_r = (args.state.bg_element == 1) ? args.state.bg_color : 0
    +** Processing line: ~    bg_g = (args.state.bg_element == 2) ? args.state.bg_color : 0~
     - Inside source: true
     *** True Line Result
    -                              h: 100,
    -** Processing line: ~                              path: :block,~
    +    bg_g = (args.state.bg_element == 2) ? args.state.bg_color : 0
    +** Processing line: ~    bg_b = (args.state.bg_element == 3) ? args.state.bg_color : 0~
     - Inside source: true
     *** True Line Result
    -                              path: :block,
    -** Processing line: ~                              source_x: 0,~
    +    bg_b = (args.state.bg_element == 3) ? args.state.bg_color : 0
    +** Processing line: ~    args.state.bg_color += args.state.bg_color_direction~
     - Inside source: true
     *** True Line Result
    -                              source_x: 0,
    -** Processing line: ~                              source_y: 0,~
    +    args.state.bg_color += args.state.bg_color_direction
    +** Processing line: ~    if (args.state.bg_color_direction > 0) && (args.state.bg_color >= 255)~
     - Inside source: true
     *** True Line Result
    -                              source_y: 0,
    -** Processing line: ~                              source_w: 1280,~
    +    if (args.state.bg_color_direction > 0) && (args.state.bg_color >= 255)
    +** Processing line: ~      args.state.bg_color_direction = -1~
     - Inside source: true
     *** True Line Result
    -                              source_w: 1280,
    -** Processing line: ~                              source_h: 100 }~
    +      args.state.bg_color_direction = -1
    +** Processing line: ~      args.state.bg_color = 255~
     - Inside source: true
     *** True Line Result
    -                              source_h: 100 }
    -** Processing line: ~~
    +      args.state.bg_color = 255
    +** Processing line: ~    elsif (args.state.bg_color_direction < 0) && (args.state.bg_color <= 0)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # After rendering :block, render gradient on top of :block.~
    +    elsif (args.state.bg_color_direction < 0) && (args.state.bg_color <= 0)
    +** Processing line: ~      args.state.bg_color_direction = 1~
     - Inside source: true
     *** True Line Result
    -    # After rendering :block, render gradient on top of :block.
    -** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, :gradient]~
    +      args.state.bg_color_direction = 1
    +** Processing line: ~      args.state.bg_color = 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [0, 0, 1280, 720, :gradient]
    -** Processing line: ~~
    +      args.state.bg_color = 0
    +** Processing line: ~      args.state.bg_element += 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.labels  << [1270, 710, args.gtk.current_framerate, 0, 2, 255, 255, 255]~
    +      args.state.bg_element += 1
    +** Processing line: ~      if args.state.bg_element >= 4~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels  << [1270, 710, args.gtk.current_framerate, 0, 2, 255, 255, 255]
    -** Processing line: ~    tick_instructions args, "Sample app shows how to use render_targets (programmatically create cached sprites)."~
    +      if args.state.bg_element >= 4
    +** Processing line: ~        args.state.bg_element = 1~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows how to use render_targets (programmatically create cached sprites)."
    -** Processing line: ~  end~
    +        args.state.bg_element = 1
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  end
    +      end
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~    args.outputs.background_color = [ bg_r, bg_g, bg_b, 255 ]~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +    args.outputs.background_color = [ bg_r, bg_g, bg_b, 255 ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +
    +** Processing line: ~    args.state.blendmodes ||= [~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +    args.state.blendmodes ||= [
    +** Processing line: ~      { name: :none,  value: 0 },~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +      { name: :none,  value: 0 },
    +** Processing line: ~      { name: :blend, value: 1 },~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +      { name: :blend, value: 1 },
    +** Processing line: ~      { name: :add,   value: 2 },~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +      { name: :add,   value: 2 },
    +** Processing line: ~      { name: :mod,   value: 3 },~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +      { name: :mod,   value: 3 },
    +** Processing line: ~      { name: :mul,   value: 4 }~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      { name: :mul,   value: 4 }
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +    ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +
    +** Processing line: ~    args.state.x = 0  # reset this, draw_blendmode will increment it.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +    args.state.x = 0  # reset this, draw_blendmode will increment it.
    +** Processing line: ~    args.state.blendmodes.each { |blendmode| draw_blendmode args, blendmode }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    args.state.blendmodes.each { |blendmode| draw_blendmode args, blendmode }
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -45616,14 +53871,6 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $gtk.reset~
    -- Inside source: true
    -*** True Line Result
    -  $gtk.reset
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
     ** Processing line: ~#+end_src~
     - Line was identified as the end of a code block.
     *** True Line Result
    @@ -45632,342 +53879,390 @@ 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 Targets With Tile Manipulation - main.rb~
    +** Processing line: ~*** Tweening Lerping Easing Functions - Easing Functions - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Render Targets With Tile Manipulation - main.rb
    +*** Tweening Lerping Easing Functions - Easing Functions - 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/02_render_targets_with_tile_manipulation/app/main.rb~
    +** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/02_render_targets_with_tile_manipulation/app/main.rb
    -** Processing line: ~  # This sample is meant to show you how to do that dripping transition thing~
    +  # ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -  # This sample is meant to show you how to do that dripping transition thing
    -** Processing line: ~  #  at the start of the original Doom. Most of this file is here to animate~
    +  def tick args
    +** Processing line: ~    # STOP! Watch the following presentation first!!!!~
     - Inside source: true
     *** True Line Result
    -  #  at the start of the original Doom. Most of this file is here to animate
    -** Processing line: ~  #  a scene to wipe away; the actual wipe effect is in the last 20 lines or~
    +    # STOP! Watch the following presentation first!!!!
    +** Processing line: ~    # Math for Game Programmers: Fast and Funky 1D Nonlinear Transformations~
     - Inside source: true
     *** True Line Result
    -  #  a scene to wipe away; the actual wipe effect is in the last 20 lines or
    -** Processing line: ~  #  so.~
    +    # Math for Game Programmers: Fast and Funky 1D Nonlinear Transformations
    +** Processing line: ~    # https://www.youtube.com/watch?v=mr5xkf6zSzk~
     - Inside source: true
     *** True Line Result
    -  #  so.
    +    # https://www.youtube.com/watch?v=mr5xkf6zSzk
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $gtk.reset   # reset all game state if reloaded.~
    +** Processing line: ~    # You've watched the talk, yes? YES???~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset   # reset all game state if reloaded.
    +    # You've watched the talk, yes? YES???
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def circle_of_blocks pass, xoffset, yoffset, angleoffset, blocksize, distance~
    +** Processing line: ~    # define starting and ending points of properties to animate~
     - Inside source: true
     *** True Line Result
    -  def circle_of_blocks pass, xoffset, yoffset, angleoffset, blocksize, distance
    -** Processing line: ~    numblocks = 10~
    +    # define starting and ending points of properties to animate
    +** Processing line: ~    args.state.target_x = 1180~
     - Inside source: true
     *** True Line Result
    -    numblocks = 10
    -** Processing line: ~~
    +    args.state.target_x = 1180
    +** Processing line: ~    args.state.target_y = 620~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    for i in 1..numblocks do~
    +    args.state.target_y = 620
    +** Processing line: ~    args.state.target_w = 100~
     - Inside source: true
     *** True Line Result
    -    for i in 1..numblocks do
    -** Processing line: ~      angle = ((360 / numblocks) * i) + angleoffset~
    +    args.state.target_w = 100
    +** Processing line: ~    args.state.target_h = 100~
     - Inside source: true
     *** True Line Result
    -      angle = ((360 / numblocks) * i) + angleoffset
    -** Processing line: ~      radians = angle * (Math::PI / 180)~
    +    args.state.target_h = 100
    +** Processing line: ~    args.state.starting_x = 0~
     - Inside source: true
     *** True Line Result
    -      radians = angle * (Math::PI / 180)
    -** Processing line: ~      x = (xoffset + (distance * Math.cos(radians))).round~
    +    args.state.starting_x = 0
    +** Processing line: ~    args.state.starting_y = 0~
     - Inside source: true
     *** True Line Result
    -      x = (xoffset + (distance * Math.cos(radians))).round
    -** Processing line: ~      y = (yoffset + (distance * Math.sin(radians))).round~
    +    args.state.starting_y = 0
    +** Processing line: ~    args.state.starting_w = 300~
     - Inside source: true
     *** True Line Result
    -      y = (yoffset + (distance * Math.sin(radians))).round
    -** Processing line: ~      pass.solids << [ x, y, blocksize, blocksize, 255, 255, 0 ]~
    +    args.state.starting_w = 300
    +** Processing line: ~    args.state.starting_h = 300~
     - Inside source: true
     *** True Line Result
    -      pass.solids << [ x, y, blocksize, blocksize, 255, 255, 0 ]
    -** Processing line: ~    end~
    +    args.state.starting_h = 300
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +
    +** Processing line: ~    # define start time and duration of animation~
     - Inside source: true
     *** True Line Result
    -  end
    +    # define start time and duration of animation
    +** Processing line: ~    args.state.start_animate_at = 3.seconds # this is the same as writing 60 * 5 (or 300)~
    +- Inside source: true
    +*** True Line Result
    +    args.state.start_animate_at = 3.seconds # this is the same as writing 60 * 5 (or 300)
    +** Processing line: ~    args.state.duration = 2.seconds # this is the same as writing 60 * 2 (or 120)~
    +- Inside source: true
    +*** True Line Result
    +    args.state.duration = 2.seconds # this is the same as writing 60 * 2 (or 120)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def draw_scene args, pass~
    +** Processing line: ~    # define type of animations~
     - Inside source: true
     *** True Line Result
    -  def draw_scene args, pass
    -** Processing line: ~    pass.solids << [0, 360, 1280, 360, 0, 0, 200]~
    +    # define type of animations
    +** Processing line: ~    # Here are all the options you have for values you can put in the array:~
     - Inside source: true
     *** True Line Result
    -    pass.solids << [0, 360, 1280, 360, 0, 0, 200]
    -** Processing line: ~    pass.solids << [0, 0, 1280, 360, 0, 127, 0]~
    +    # Here are all the options you have for values you can put in the array:
    +** Processing line: ~    # :identity, :quad, :cube, :quart, :quint, :flip~
     - Inside source: true
     *** True Line Result
    -    pass.solids << [0, 0, 1280, 360, 0, 127, 0]
    +    # :identity, :quad, :cube, :quart, :quint, :flip
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    blocksize = 100~
    +** Processing line: ~    # Linear is defined as:~
     - Inside source: true
     *** True Line Result
    -    blocksize = 100
    -** Processing line: ~    angleoffset = args.state.tick_count * 2.5~
    +    # Linear is defined as:
    +** Processing line: ~    # [:identity]~
     - Inside source: true
     *** True Line Result
    -    angleoffset = args.state.tick_count * 2.5
    -** Processing line: ~    centerx = (1280 - blocksize) / 2~
    +    # [:identity]
    +** Processing line: ~    #~
     - Inside source: true
     *** True Line Result
    -    centerx = (1280 - blocksize) / 2
    -** Processing line: ~    centery = (720 - blocksize) / 2~
    +    #
    +** Processing line: ~    # Smooth start variations are:~
     - Inside source: true
     *** True Line Result
    -    centery = (720 - blocksize) / 2
    +    # Smooth start variations are:
    +** Processing line: ~    # [:quad]~
    +- Inside source: true
    +*** True Line Result
    +    # [:quad]
    +** Processing line: ~    # [:cube]~
    +- Inside source: true
    +*** True Line Result
    +    # [:cube]
    +** Processing line: ~    # [:quart]~
    +- Inside source: true
    +*** True Line Result
    +    # [:quart]
    +** Processing line: ~    # [:quint]~
    +- Inside source: true
    +*** True Line Result
    +    # [:quint]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize * 2, 500~
    +** Processing line: ~    # Linear reversed, and smooth stop are the same as the animations defined above, but reversed:~
     - Inside source: true
     *** True Line Result
    -    circle_of_blocks pass, centerx, centery, angleoffset, blocksize * 2, 500
    -** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize, 325~
    +    # Linear reversed, and smooth stop are the same as the animations defined above, but reversed:
    +** Processing line: ~    # [:flip, :identity]~
     - Inside source: true
     *** True Line Result
    -    circle_of_blocks pass, centerx, centery, angleoffset, blocksize, 325
    -** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 2, 200~
    +    # [:flip, :identity]
    +** Processing line: ~    # [:flip, :quad, :flip]~
     - Inside source: true
     *** True Line Result
    -    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 2, 200
    -** Processing line: ~    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 4, 100~
    +    # [:flip, :quad, :flip]
    +** Processing line: ~    # [:flip, :cube, :flip]~
     - Inside source: true
     *** True Line Result
    -    circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 4, 100
    -** Processing line: ~  end~
    +    # [:flip, :cube, :flip]
    +** Processing line: ~    # [:flip, :quart, :flip]~
     - Inside source: true
     *** True Line Result
    -  end
    +    # [:flip, :quart, :flip]
    +** Processing line: ~    # [:flip, :quint, :flip]~
    +- Inside source: true
    +*** True Line Result
    +    # [:flip, :quint, :flip]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~    # You can also do custom definitions. See the bottom of the file details~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    segments = 160~
    +    # You can also do custom definitions. See the bottom of the file details
    +** Processing line: ~    # on how to do that. I've defined a couple for you:~
     - Inside source: true
     *** True Line Result
    -    segments = 160
    +    # on how to do that. I've defined a couple for you:
    +** Processing line: ~    # [:smoothest_start]~
    +- Inside source: true
    +*** True Line Result
    +    # [:smoothest_start]
    +** Processing line: ~    # [:smoothest_stop]~
    +- Inside source: true
    +*** True Line Result
    +    # [:smoothest_stop]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # On the first tick, initialize some stuff.~
    +** Processing line: ~    # CHANGE THIS LINE TO ONE OF THE LINES ABOVE TO SEE VARIATIONS~
     - Inside source: true
     *** True Line Result
    -    # On the first tick, initialize some stuff.
    -** Processing line: ~    if !args.state.yoffsets~
    +    # CHANGE THIS LINE TO ONE OF THE LINES ABOVE TO SEE VARIATIONS
    +** Processing line: ~    args.state.animation_type = [:identity]~
     - Inside source: true
     *** True Line Result
    -    if !args.state.yoffsets
    -** Processing line: ~      args.state.baseyoff = 0~
    +    args.state.animation_type = [:identity]
    +** Processing line: ~    # args.state.animation_type = [:quad]~
     - Inside source: true
     *** True Line Result
    -      args.state.baseyoff = 0
    -** Processing line: ~      args.state.yoffsets = []~
    +    # args.state.animation_type = [:quad]
    +** Processing line: ~    # args.state.animation_type = [:cube]~
     - Inside source: true
     *** True Line Result
    -      args.state.yoffsets = []
    -** Processing line: ~      for i in 0..segments do~
    +    # args.state.animation_type = [:cube]
    +** Processing line: ~    # args.state.animation_type = [:quart]~
     - Inside source: true
     *** True Line Result
    -      for i in 0..segments do
    -** Processing line: ~        args.state.yoffsets << rand * 100~
    +    # args.state.animation_type = [:quart]
    +** Processing line: ~    # args.state.animation_type = [:quint]~
     - Inside source: true
     *** True Line Result
    -        args.state.yoffsets << rand * 100
    -** Processing line: ~      end~
    +    # args.state.animation_type = [:quint]
    +** Processing line: ~    # args.state.animation_type = [:flip, :identity]~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    # args.state.animation_type = [:flip, :identity]
    +** Processing line: ~    # args.state.animation_type = [:flip, :quad, :flip]~
     - Inside source: true
     *** True Line Result
    -    end
    +    # args.state.animation_type = [:flip, :quad, :flip]
    +** Processing line: ~    # args.state.animation_type = [:flip, :cube, :flip]~
    +- Inside source: true
    +*** True Line Result
    +    # args.state.animation_type = [:flip, :cube, :flip]
    +** Processing line: ~    # args.state.animation_type = [:flip, :quart, :flip]~
    +- Inside source: true
    +*** True Line Result
    +    # args.state.animation_type = [:flip, :quart, :flip]
    +** Processing line: ~    # args.state.animation_type = [:flip, :quint, :flip]~
    +- Inside source: true
    +*** True Line Result
    +    # args.state.animation_type = [:flip, :quint, :flip]
    +** Processing line: ~    # args.state.animation_type = [:smoothest_start]~
    +- Inside source: true
    +*** True Line Result
    +    # args.state.animation_type = [:smoothest_start]
    +** Processing line: ~    # args.state.animation_type = [:smoothest_stop]~
    +- Inside source: true
    +*** True Line Result
    +    # args.state.animation_type = [:smoothest_stop]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Just draw some random stuff for a few seconds.~
    +** Processing line: ~    # THIS IS WHERE THE MAGIC HAPPENS!~
     - Inside source: true
     *** True Line Result
    -    # Just draw some random stuff for a few seconds.
    -** Processing line: ~    args.state.static_debounce ||= 60 * 2.5~
    +    # THIS IS WHERE THE MAGIC HAPPENS!
    +** Processing line: ~    # Numeric#ease~
     - Inside source: true
     *** True Line Result
    -    args.state.static_debounce ||= 60 * 2.5
    -** Processing line: ~    if args.state.static_debounce > 0~
    +    # Numeric#ease
    +** Processing line: ~    progress = args.state.start_animate_at.ease(args.state.duration, args.state.animation_type)~
     - Inside source: true
     *** True Line Result
    -    if args.state.static_debounce > 0
    -** Processing line: ~      last_frame = args.state.static_debounce == 1~
    +    progress = args.state.start_animate_at.ease(args.state.duration, args.state.animation_type)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      last_frame = args.state.static_debounce == 1
    -** Processing line: ~      target = last_frame ? args.render_target(:last_frame) : args.outputs~
    +
    +** Processing line: ~    # Numeric#ease needs to called:~
     - Inside source: true
     *** True Line Result
    -      target = last_frame ? args.render_target(:last_frame) : args.outputs
    -** Processing line: ~      draw_scene args, target~
    +    # Numeric#ease needs to called:
    +** Processing line: ~    # 1. On the number that represents the point in time you want to start, and takes two parameters:~
     - Inside source: true
     *** True Line Result
    -      draw_scene args, target
    -** Processing line: ~      args.state.static_debounce -= 1~
    +    # 1. On the number that represents the point in time you want to start, and takes two parameters:
    +** Processing line: ~    #   a. The first parameter is how long the animation should take.~
     - Inside source: true
     *** True Line Result
    -      args.state.static_debounce -= 1
    -** Processing line: ~      return unless last_frame~
    +    #   a. The first parameter is how long the animation should take.
    +** Processing line: ~    #   b. The second parameter represents the functions that need to be called.~
     - Inside source: true
     *** True Line Result
    -      return unless last_frame
    -** Processing line: ~    end~
    +    #   b. The second parameter represents the functions that need to be called.
    +** Processing line: ~    #~
    +- Inside source: true
    +*** True Line Result
    +    #
    +** Processing line: ~    # For example, if I wanted an animate to start 3 seconds in, and last for 10 seconds,~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    # For example, if I wanted an animate to start 3 seconds in, and last for 10 seconds,
    +** Processing line: ~    # and I want to animation to start fast and end slow, I would do:~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # build up the wipe...~
    +    # and I want to animation to start fast and end slow, I would do:
    +** Processing line: ~    # (60 * 3).ease(60 * 10, :flip, :quint, :flip)~
     - Inside source: true
     *** True Line Result
    -    # build up the wipe...
    +    # (60 * 3).ease(60 * 10, :flip, :quint, :flip)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # this is the thing we're wiping to.~
    +** Processing line: ~    #        initial value           delta to the final value~
     - Inside source: true
     *** True Line Result
    -    # this is the thing we're wiping to.
    -** Processing line: ~    args.outputs.sprites << [ 0, 0, 1280, 720, 'dragonruby.png' ]~
    +    #        initial value           delta to the final value
    +** Processing line: ~    calc_x = args.state.starting_x + (args.state.target_x - args.state.starting_x) * progress~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [ 0, 0, 1280, 720, 'dragonruby.png' ]
    -** Processing line: ~~
    +    calc_x = args.state.starting_x + (args.state.target_x - args.state.starting_x) * progress
    +** Processing line: ~    calc_y = args.state.starting_y + (args.state.target_y - args.state.starting_y) * progress~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    return if (args.state.baseyoff > (1280 + 100))  # stop when done sliding~
    +    calc_y = args.state.starting_y + (args.state.target_y - args.state.starting_y) * progress
    +** Processing line: ~    calc_w = args.state.starting_w + (args.state.target_w - args.state.starting_w) * progress~
     - Inside source: true
     *** True Line Result
    -    return if (args.state.baseyoff > (1280 + 100))  # stop when done sliding
    +    calc_w = args.state.starting_w + (args.state.target_w - args.state.starting_w) * progress
    +** Processing line: ~    calc_h = args.state.starting_h + (args.state.target_h - args.state.starting_h) * progress~
    +- Inside source: true
    +*** True Line Result
    +    calc_h = args.state.starting_h + (args.state.target_h - args.state.starting_h) * progress
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    segmentw = 1280 / segments~
    +** Processing line: ~    args.outputs.solids << [calc_x, calc_y, calc_w, calc_h, 0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    segmentw = 1280 / segments
    +    args.outputs.solids << [calc_x, calc_y, calc_w, calc_h, 0, 0, 0]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    x = 0~
    +** Processing line: ~    # count down~
     - Inside source: true
     *** True Line Result
    -    x = 0
    -** Processing line: ~    for i in 0..segments do~
    +    # count down
    +** Processing line: ~    count_down = args.state.start_animate_at - args.state.tick_count~
     - Inside source: true
     *** True Line Result
    -    for i in 0..segments do
    -** Processing line: ~      yoffset = 0~
    +    count_down = args.state.start_animate_at - args.state.tick_count
    +** Processing line: ~    if count_down > 0~
     - Inside source: true
     *** True Line Result
    -      yoffset = 0
    -** Processing line: ~      if args.state.yoffsets[i] < args.state.baseyoff~
    +    if count_down > 0
    +** Processing line: ~      args.outputs.labels << [640, 375, "Running: #{args.state.animation_type} in...", 3, 1]~
     - Inside source: true
     *** True Line Result
    -      if args.state.yoffsets[i] < args.state.baseyoff
    -** Processing line: ~        yoffset = args.state.baseyoff - args.state.yoffsets[i]~
    +      args.outputs.labels << [640, 375, "Running: #{args.state.animation_type} in...", 3, 1]
    +** Processing line: ~      args.outputs.labels << [640, 345, "%.2f" % count_down.fdiv(60), 3, 1]~
     - Inside source: true
     *** True Line Result
    -        yoffset = args.state.baseyoff - args.state.yoffsets[i]
    -** Processing line: ~      end~
    +      args.outputs.labels << [640, 345, "%.2f" % count_down.fdiv(60), 3, 1]
    +** Processing line: ~    elsif progress >= 1~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    elsif progress >= 1
    +** Processing line: ~      args.outputs.labels << [640, 360, "Click screen to reset.", 3, 1]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # (720 - yoffset) flips the coordinate system, (- 720) adjusts for the height of the segment.~
    +      args.outputs.labels << [640, 360, "Click screen to reset.", 3, 1]
    +** Processing line: ~      if args.inputs.click~
     - Inside source: true
     *** True Line Result
    -      # (720 - yoffset) flips the coordinate system, (- 720) adjusts for the height of the segment.
    -** Processing line: ~      args.outputs.sprites << [ x, (720 - yoffset) - 720, segmentw, 720, 'last_frame', 0, 255, 255, 255, 255, x, 0, segmentw, 720 ]~
    +      if args.inputs.click
    +** Processing line: ~        $gtk.reset~
     - Inside source: true
     *** True Line Result
    -      args.outputs.sprites << [ x, (720 - yoffset) - 720, segmentw, 720, 'last_frame', 0, 255, 255, 255, 255, x, 0, segmentw, 720 ]
    -** Processing line: ~      x += segmentw~
    +        $gtk.reset
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      x += segmentw
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~    args.state.baseyoff += 4~
    -- Inside source: true
    -*** True Line Result
    -    args.state.baseyoff += 4
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~    tick_instructions args, "Sample app shows an advanced usage of render_target."~
    -- Inside source: true
    -*** True Line Result
    -    tick_instructions args, "Sample app shows an advanced usage of render_target."
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -45976,34 +54271,34 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick_instructions args, text, y = 715~
    +** Processing line: ~  # $gtk.reset~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +  # $gtk.reset
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +
    +** Processing line: ~  # you can make own variations of animations using this~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +  # you can make own variations of animations using this
    +** Processing line: ~  module Easing~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +  module Easing
    +** Processing line: ~    # you have access to all the built in functions: identity, flip, quad, cube, quart, quint~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +    # you have access to all the built in functions: identity, flip, quad, cube, quart, quint
    +** Processing line: ~    def self.smoothest_start x~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +    def self.smoothest_start x
    +** Processing line: ~      quad(quint(x))~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    +      quad(quint(x))
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -46012,822 +54307,782 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    -- Inside source: true
    -*** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +** Processing line: ~    def self.smoothest_stop x~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +    def self.smoothest_stop x
    +** Processing line: ~      flip(quad(quint(flip(x))))~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    -** Processing line: ~  end~
    +      flip(quad(quint(flip(x))))
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Advanced Rendering - Render Target Viewports - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Advanced Rendering - Render Target Viewports - 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/03_render_target_viewports/app/main.rb~
    +** Processing line: ~    # this is the source for the existing easing functions~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/03_render_target_viewports/app/main.rb
    -** Processing line: ~  =begin~
    +    # this is the source for the existing easing functions
    +** Processing line: ~    def self.identity x~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +    def self.identity x
    +** Processing line: ~      x~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +      x
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
    -- Inside source: true
    -*** True Line Result
    -   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
    -** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
    +** Processing line: ~    def self.flip x~
     - Inside source: true
     *** True Line Result
    -     For example, if we want to create a new button, we would declare it as a new entity and
    -** Processing line: ~     then define its properties. (Remember, you can use state to define ANY property and it will~
    +    def self.flip x
    +** Processing line: ~      1 - x~
     - Inside source: true
     *** True Line Result
    -     then define its properties. (Remember, you can use state to define ANY property and it will
    -** Processing line: ~     be retained across frames.)~
    +      1 - x
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     be retained across frames.)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     If you have a solar system and you're creating args.state.sun and setting its image path to an~
    +** Processing line: ~    def self.quad x~
     - Inside source: true
     *** True Line Result
    -     If you have a solar system and you're creating args.state.sun and setting its image path to an
    -** Processing line: ~     image in the sprites folder, you would do the following:~
    +    def self.quad x
    +** Processing line: ~      x * x~
     - Inside source: true
     *** True Line Result
    -     image in the sprites folder, you would do the following:
    -** Processing line: ~     (See samples/99_sample_nddnug_workshop for more details.)~
    +      x * x
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     (See samples/99_sample_nddnug_workshop for more details.)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     args.state.sun ||= args.state.new_entity(:sun) do |s|~
    +** Processing line: ~    def self.cube x~
     - Inside source: true
     *** True Line Result
    -     args.state.sun ||= args.state.new_entity(:sun) do |s|
    -** Processing line: ~     s.path = 'sprites/sun.png'~
    +    def self.cube x
    +** Processing line: ~      x * x * x~
     - Inside source: true
     *** True Line Result
    -     s.path = 'sprites/sun.png'
    -** Processing line: ~     end~
    +      x * x * x
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
    +** Processing line: ~    def self.quart x~
     - Inside source: true
     *** True Line Result
    -   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
    -** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
    +    def self.quart x
    +** Processing line: ~      x * x * x * x * x~
     - Inside source: true
     *** True Line Result
    -     as Ruby code, and the placeholder is replaced with its corresponding value or result.
    +      x * x * x * x * x
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     For example, if we have a variable~
    +** Processing line: ~    def self.quint x~
     - Inside source: true
     *** True Line Result
    -     For example, if we have a variable
    -** Processing line: ~     name = "Ruby"~
    +    def self.quint x
    +** Processing line: ~      x * x * x * x * x * x~
     - Inside source: true
     *** True Line Result
    -     name = "Ruby"
    -** Processing line: ~     then the line~
    +      x * x * x * x * x * x
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     then the line
    -** Processing line: ~     puts "How are you, #{name}?"~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     puts "How are you, #{name}?"
    -** Processing line: ~     would print "How are you, Ruby?" to the console.~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     would print "How are you, Ruby?" to the console.
    -** Processing line: ~     (Remember, string interpolation only works with double quotes!)~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -     (Remember, string interpolation only works with double quotes!)
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~   - Ternary operator (?): Similar to if statement; first evalulates whether a statement is~
    -- Inside source: true
    +** Processing line: ~*** Tweening Lerping Easing Functions - Cubic Bezier - main.rb~
    +- Header detected.
     *** True Line Result
    -   - Ternary operator (?): Similar to if statement; first evalulates whether a statement is
    -** Processing line: ~     true or false, and then executes a command depending on that result.~
    -- Inside source: true
    +
     *** True Line Result
    -     true or false, and then executes a command depending on that result.
    -** Processing line: ~     For example, if we had a variable~
    -- Inside source: true
    +*** Tweening Lerping Easing Functions - Cubic Bezier - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -     For example, if we had a variable
    -** Processing line: ~     grade = 75~
    -- Inside source: true
    +
     *** True Line Result
    -     grade = 75
    -** Processing line: ~     and used the ternary operator in the command~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/02_cubic_bezier/app/main.rb~
     - Inside source: true
     *** True Line Result
    -     and used the ternary operator in the command
    -** Processing line: ~     pass_or_fail = grade > 65 ? "pass" : "fail"~
    +  # ./samples/08_tweening_lerping_easing_functions/02_cubic_bezier/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -     pass_or_fail = grade > 65 ? "pass" : "fail"
    -** Processing line: ~     then the value of pass_or_fail would be "pass" since grade's value was greater than 65.~
    +  def tick args
    +** Processing line: ~    args.outputs.background_color = [33, 33, 33]~
     - Inside source: true
     *** True Line Result
    -     then the value of pass_or_fail would be "pass" since grade's value was greater than 65.
    -** Processing line: ~~
    +    args.outputs.background_color = [33, 33, 33]
    +** Processing line: ~    args.outputs.lines << bezier(100, 100,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +    args.outputs.lines << bezier(100, 100,
    +** Processing line: ~                                 100, 620,~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +                                 100, 620,
    +** Processing line: ~                                 1180, 620,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~
    +                                 1180, 620,
    +** Processing line: ~                                 1180, 100,~
     - Inside source: true
     *** True Line Result
    -   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual
    -** Processing line: ~     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~
    +                                 1180, 100,
    +** Processing line: ~                                 0)~
     - Inside source: true
     *** True Line Result
    -     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).
    +                                 0)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - Numeric#shift_(left|right|up|down): Shifts the Numeric in the correct direction~
    +** Processing line: ~    args.outputs.lines << bezier(100, 100,~
     - Inside source: true
     *** True Line Result
    -   - Numeric#shift_(left|right|up|down): Shifts the Numeric in the correct direction
    -** Processing line: ~     by adding or subracting.~
    +    args.outputs.lines << bezier(100, 100,
    +** Processing line: ~                                 100, 620,~
     - Inside source: true
     *** True Line Result
    -     by adding or subracting.
    -** Processing line: ~~
    +                                 100, 620,
    +** Processing line: ~                                 1180, 620,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array~
    +                                 1180, 620,
    +** Processing line: ~                                 1180, 100,~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
    -** Processing line: ~     with at least four values is considered a rect. The inside_rect? function returns true~
    +                                 1180, 100,
    +** Processing line: ~                                 20)~
     - Inside source: true
     *** True Line Result
    -     with at least four values is considered a rect. The inside_rect? function returns true
    -** Processing line: ~     or false depending on if the point is inside the rect.~
    +                                 20)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     or false depending on if the point is inside the rect.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.~
    -- Inside source: true
    -*** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.mouse.click: This property will be set if the mouse was clicked.~
    +** Processing line: ~  def bezier x1, y1, x2, y2, x3, y3, x4, y4, step~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.mouse.click: This property will be set if the mouse was clicked.
    -** Processing line: ~     For more information about the mouse, go to mygame/documentation/07-mouse.md.~
    +  def bezier x1, y1, x2, y2, x3, y3, x4, y4, step
    +** Processing line: ~    step ||= 0~
     - Inside source: true
     *** True Line Result
    -     For more information about the mouse, go to mygame/documentation/07-mouse.md.
    +    step ||= 0
    +** Processing line: ~    color = [200, 200, 200]~
    +- Inside source: true
    +*** True Line Result
    +    color = [200, 200, 200]
    +** Processing line: ~    points = points_for_bezier [x1, y1], [x2, y2], [x3, y3], [x4, y4], step~
    +- Inside source: true
    +*** True Line Result
    +    points = points_for_bezier [x1, y1], [x2, y2], [x3, y3], [x4, y4], step
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.inputs.keyboard.key_up.KEY: The value of the properties will be set~
    +** Processing line: ~    points.each_cons(2).map do |p1, p2|~
     - Inside source: true
     *** True Line Result
    -   - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
    -** Processing line: ~     to the frame  that the key_up event occurred (the frame correlates~
    +    points.each_cons(2).map do |p1, p2|
    +** Processing line: ~      [p1, p2, color]~
     - Inside source: true
     *** True Line Result
    -     to the frame  that the key_up event occurred (the frame correlates
    -** Processing line: ~     to args.state.tick_count).~
    +      [p1, p2, color]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     to args.state.tick_count).
    -** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.state.labels:~
    -- Inside source: true
    -*** True Line Result
    -   - args.state.labels:
    -** Processing line: ~     The parameters for a label are~
    +** Processing line: ~  def points_for_bezier p1, p2, p3, p4, step~
     - Inside source: true
     *** True Line Result
    -     The parameters for a label are
    -** Processing line: ~     1. the position (x, y)~
    +  def points_for_bezier p1, p2, p3, p4, step
    +** Processing line: ~    points = []~
     - Inside source: true
     *** True Line Result
    -     1. the position (x, y)
    -** Processing line: ~     2. the text~
    +    points = []
    +** Processing line: ~    if step == 0~
     - Inside source: true
     *** True Line Result
    -     2. the text
    -** Processing line: ~     3. the size~
    +    if step == 0
    +** Processing line: ~      [p1, p2, p3, p4]~
     - Inside source: true
     *** True Line Result
    -     3. the size
    -** Processing line: ~     4. the alignment~
    +      [p1, p2, p3, p4]
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -     4. the alignment
    -** Processing line: ~     5. the color (red, green, and blue saturations)~
    +    else
    +** Processing line: ~      t_step = 1.fdiv(step + 1)~
     - Inside source: true
     *** True Line Result
    -     5. the color (red, green, and blue saturations)
    -** Processing line: ~     6. the alpha (or transparency)~
    +      t_step = 1.fdiv(step + 1)
    +** Processing line: ~      t = 0~
     - Inside source: true
     *** True Line Result
    -     6. the alpha (or transparency)
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +      t = 0
    +** Processing line: ~      t += t_step~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    -** Processing line: ~~
    +      t += t_step
    +** Processing line: ~      points = []~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.state.lines:~
    +      points = []
    +** Processing line: ~      while t < 1~
     - Inside source: true
     *** True Line Result
    -   - args.state.lines:
    -** Processing line: ~     The parameters for a line are~
    +      while t < 1
    +** Processing line: ~        points << [~
     - Inside source: true
     *** True Line Result
    -     The parameters for a line are
    -** Processing line: ~     1. the starting position (x, y)~
    +        points << [
    +** Processing line: ~          b_for_t(p1.x, p2.x, p3.x, p4.x, t),~
     - Inside source: true
     *** True Line Result
    -     1. the starting position (x, y)
    -** Processing line: ~     2. the ending position (x2, y2)~
    +          b_for_t(p1.x, p2.x, p3.x, p4.x, t),
    +** Processing line: ~          b_for_t(p1.y, p2.y, p3.y, p4.y, t),~
     - Inside source: true
     *** True Line Result
    -     2. the ending position (x2, y2)
    -** Processing line: ~     3. the color (red, green, and blue saturations)~
    +          b_for_t(p1.y, p2.y, p3.y, p4.y, t),
    +** Processing line: ~        ]~
     - Inside source: true
     *** True Line Result
    -     3. the color (red, green, and blue saturations)
    -** Processing line: ~     4. the alpha (or transparency)~
    +        ]
    +** Processing line: ~        t += t_step~
     - Inside source: true
     *** True Line Result
    -     4. the alpha (or transparency)
    -** Processing line: ~     For more information about lines, go to mygame/documentation/04-lines.md.~
    +        t += t_step
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     For more information about lines, go to mygame/documentation/04-lines.md.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.state.solids (and args.state.borders):~
    -- Inside source: true
    -*** True Line Result
    -   - args.state.solids (and args.state.borders):
    -** Processing line: ~     The parameters for a solid (or border) are~
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -     The parameters for a solid (or border) are
    -** Processing line: ~     1. the position (x, y)~
    +      [
    +** Processing line: ~        p1,~
     - Inside source: true
     *** True Line Result
    -     1. the position (x, y)
    -** Processing line: ~     2. the width (w)~
    +        p1,
    +** Processing line: ~        *points,~
     - Inside source: true
     *** True Line Result
    -     2. the width (w)
    -** Processing line: ~     3. the height (h)~
    +        *points,
    +** Processing line: ~        p4~
     - Inside source: true
     *** True Line Result
    -     3. the height (h)
    -** Processing line: ~     4. the color (r, g, b)~
    +        p4
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -     4. the color (r, g, b)
    -** Processing line: ~     5. the alpha (or transparency)~
    +      ]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     5. the alpha (or transparency)
    -** Processing line: ~     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.state.sprites:~
    +** Processing line: ~  def b_for_t v0, v1, v2, v3, t~
     - Inside source: true
     *** True Line Result
    -   - args.state.sprites:
    -** Processing line: ~     The parameters for a sprite are~
    +  def b_for_t v0, v1, v2, v3, t
    +** Processing line: ~    pow(1 - t, 3) * v0 +~
     - Inside source: true
     *** True Line Result
    -     The parameters for a sprite are
    -** Processing line: ~     1. the position (x, y)~
    +    pow(1 - t, 3) * v0 +
    +** Processing line: ~    3 * pow(1 - t, 2) * t * v1 +~
     - Inside source: true
     *** True Line Result
    -     1. the position (x, y)
    -** Processing line: ~     2. the width (w)~
    +    3 * pow(1 - t, 2) * t * v1 +
    +** Processing line: ~    3 * (1 - t) * pow(t, 2) * v2 +~
     - Inside source: true
     *** True Line Result
    -     2. the width (w)
    -** Processing line: ~     3. the height (h)~
    +    3 * (1 - t) * pow(t, 2) * v2 +
    +** Processing line: ~    pow(t, 3) * v3~
     - Inside source: true
     *** True Line Result
    -     3. the height (h)
    -** Processing line: ~     4. the image path~
    +    pow(t, 3) * v3
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     4. the image path
    -** Processing line: ~     5. the angle~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     5. the angle
    -** Processing line: ~     6. the alpha (or transparency)~
    +
    +** Processing line: ~  def pow n, to~
     - Inside source: true
     *** True Line Result
    -     6. the alpha (or transparency)
    -** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
    +  def pow n, to
    +** Processing line: ~    n ** to~
     - Inside source: true
     *** True Line Result
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    -** Processing line: ~  =end~
    +    n ** to
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  =end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This sample app shows different objects that can be used when making games, such as labels,~
    -- Inside source: true
    -*** True Line Result
    -  # This sample app shows different objects that can be used when making games, such as labels,
    -** Processing line: ~  # lines, sprites, solids, buttons, etc. Each demo section shows how these objects can be used.~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  # lines, sprites, solids, buttons, etc. Each demo section shows how these objects can be used.
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~  # Also note that state.tick_count refers to the passage of time, or current frame.~
    -- Inside source: true
    +** Processing line: ~*** Tweening Lerping Easing Functions - Easing Using Spline - main.rb~
    +- Header detected.
     *** True Line Result
    -  # Also note that state.tick_count refers to the passage of time, or current frame.
    -** Processing line: ~~
    -- Inside source: true
    +
    +*** True Line Result
    +*** Tweening Lerping Easing Functions - Easing Using Spline - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~  class TechDemo~
    -- Inside source: true
     *** True Line Result
    -  class TechDemo
    -** Processing line: ~    attr_accessor :inputs, :state, :outputs, :grid, :args~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/03_easing_using_spline/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :inputs, :state, :outputs, :grid, :args
    -** Processing line: ~~
    +  # ./samples/08_tweening_lerping_easing_functions/03_easing_using_spline/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Calls all methods necessary for the app to run properly.~
    +  def tick args
    +** Processing line: ~    args.state.duration = 10.seconds~
     - Inside source: true
     *** True Line Result
    -    # Calls all methods necessary for the app to run properly.
    -** Processing line: ~    def tick~
    +    args.state.duration = 10.seconds
    +** Processing line: ~    args.state.spline = [~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      labels_tech_demo~
    +    args.state.spline = [
    +** Processing line: ~      [0.0, 0.33, 0.66, 1.0],~
     - Inside source: true
     *** True Line Result
    -      labels_tech_demo
    -** Processing line: ~      lines_tech_demo~
    +      [0.0, 0.33, 0.66, 1.0],
    +** Processing line: ~      [1.0, 1.0,  1.0,  1.0],~
     - Inside source: true
     *** True Line Result
    -      lines_tech_demo
    -** Processing line: ~      solids_tech_demo~
    +      [1.0, 1.0,  1.0,  1.0],
    +** Processing line: ~      [1.0, 0.66, 0.33, 0.0],~
     - Inside source: true
     *** True Line Result
    -      solids_tech_demo
    -** Processing line: ~      borders_tech_demo~
    +      [1.0, 0.66, 0.33, 0.0],
    +** Processing line: ~    ]~
     - Inside source: true
     *** True Line Result
    -      borders_tech_demo
    -** Processing line: ~      sprites_tech_demo~
    +    ]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      sprites_tech_demo
    -** Processing line: ~      keyboards_tech_demo~
    +
    +** Processing line: ~    args.state.simulation_tick = args.state.tick_count % args.state.duration~
     - Inside source: true
     *** True Line Result
    -      keyboards_tech_demo
    -** Processing line: ~      controller_tech_demo~
    +    args.state.simulation_tick = args.state.tick_count % args.state.duration
    +** Processing line: ~    progress = 0.ease_spline_extended args.state.simulation_tick, args.state.duration, args.state.spline~
     - Inside source: true
     *** True Line Result
    -      controller_tech_demo
    -** Processing line: ~      mouse_tech_demo~
    +    progress = 0.ease_spline_extended args.state.simulation_tick, args.state.duration, args.state.spline
    +** Processing line: ~    args.outputs.borders << args.grid.rect~
     - Inside source: true
     *** True Line Result
    -      mouse_tech_demo
    -** Processing line: ~      point_to_rect_tech_demo~
    +    args.outputs.borders << args.grid.rect
    +** Processing line: ~    args.outputs.solids << [20 + 1240 * progress,~
     - Inside source: true
     *** True Line Result
    -      point_to_rect_tech_demo
    -** Processing line: ~      rect_to_rect_tech_demo~
    +    args.outputs.solids << [20 + 1240 * progress,
    +** Processing line: ~                            20 +  680 * progress,~
     - Inside source: true
     *** True Line Result
    -      rect_to_rect_tech_demo
    -** Processing line: ~      button_tech_demo~
    +                            20 +  680 * progress,
    +** Processing line: ~                            20, 20].anchor_rect(0.5, 0.5)~
     - Inside source: true
     *** True Line Result
    -      button_tech_demo
    -** Processing line: ~      export_game_state_demo~
    +                            20, 20].anchor_rect(0.5, 0.5)
    +** Processing line: ~    args.outputs.labels << [10,~
     - Inside source: true
     *** True Line Result
    -      export_game_state_demo
    -** Processing line: ~      window_state_demo~
    +    args.outputs.labels << [10,
    +** Processing line: ~                            710,~
     - Inside source: true
     *** True Line Result
    -      window_state_demo
    -** Processing line: ~      render_seperators~
    +                            710,
    +** Processing line: ~                            "perc: #{"%.2f" % (args.state.simulation_tick / args.state.duration)} t: #{args.state.simulation_tick}"]~
     - Inside source: true
     *** True Line Result
    -      render_seperators
    -** Processing line: ~    end~
    +                            "perc: #{"%.2f" % (args.state.simulation_tick / args.state.duration)} t: #{args.state.simulation_tick}"]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Shows output of different kinds of labels on the screen~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    # Shows output of different kinds of labels on the screen
    -** Processing line: ~    def labels_tech_demo~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -    def labels_tech_demo
    -** Processing line: ~      outputs.labels << [grid.left.shift_right(5), grid.top.shift_down(5), "This is a label located at the top left."]~
    -- Inside source: true
    +
    +** Processing line: ~*** Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb~
    +- Header detected.
     *** True Line Result
    -      outputs.labels << [grid.left.shift_right(5), grid.top.shift_down(5), "This is a label located at the top left."]
    -** Processing line: ~      outputs.labels << [grid.left.shift_right(5), grid.bottom.shift_up(30), "This is a label located at the bottom left."]~
    -- Inside source: true
    +
     *** True Line Result
    -      outputs.labels << [grid.left.shift_right(5), grid.bottom.shift_up(30), "This is a label located at the bottom left."]
    -** Processing line: ~      outputs.labels << [ 5, 690, "Labels (x, y, text, size, align, r, g, b, a)"]~
    -- Inside source: true
    +*** Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -      outputs.labels << [ 5, 690, "Labels (x, y, text, size, align, r, g, b, a)"]
    -** Processing line: ~      outputs.labels << [ 5, 660, "Smaller label.",  -2]~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/04_parametric_enemy_movement/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [ 5, 660, "Smaller label.",  -2]
    -** Processing line: ~      outputs.labels << [ 5, 630, "Small label.",    -1]~
    +  # ./samples/08_tweening_lerping_easing_functions/04_parametric_enemy_movement/app/main.rb
    +** Processing line: ~  def new_star args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [ 5, 630, "Small label.",    -1]
    -** Processing line: ~      outputs.labels << [ 5, 600, "Medium label.",    0]~
    +  def new_star args
    +** Processing line: ~    { x: 1280.randomize(:ratio),~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [ 5, 600, "Medium label.",    0]
    -** Processing line: ~      outputs.labels << [ 5, 570, "Large label.",     1]~
    +    { x: 1280.randomize(:ratio),
    +** Processing line: ~      starting_y: 800,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [ 5, 570, "Large label.",     1]
    -** Processing line: ~      outputs.labels << [ 5, 540, "Larger label.",    2]~
    +      starting_y: 800,
    +** Processing line: ~      distance_to_travel: 900 + 100.randomize(:ratio),~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [ 5, 540, "Larger label.",    2]
    -** Processing line: ~      outputs.labels << [300, 660, "Left aligned.",    0, 2]~
    +      distance_to_travel: 900 + 100.randomize(:ratio),
    +** Processing line: ~      duration: 100.randomize(:ratio) + 60,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [300, 660, "Left aligned.",    0, 2]
    -** Processing line: ~      outputs.labels << [300, 640, "Center aligned.",  0, 1]~
    +      duration: 100.randomize(:ratio) + 60,
    +** Processing line: ~      created_at: args.state.tick_count,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [300, 640, "Center aligned.",  0, 1]
    -** Processing line: ~      outputs.labels << [300, 620, "Right aligned.",   0, 0]~
    +      created_at: args.state.tick_count,
    +** Processing line: ~      max_alpha: 128.randomize(:ratio) + 128,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [300, 620, "Right aligned.",   0, 0]
    -** Processing line: ~      outputs.labels << [175, 595, "Red Label.",       0, 0, 255,   0,   0]~
    +      max_alpha: 128.randomize(:ratio) + 128,
    +** Processing line: ~      b: 255.randomize(:ratio),~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [175, 595, "Red Label.",       0, 0, 255,   0,   0]
    -** Processing line: ~      outputs.labels << [175, 575, "Green Label.",     0, 0,   0, 255,   0]~
    +      b: 255.randomize(:ratio),
    +** Processing line: ~      g: 200.randomize(:ratio),~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [175, 575, "Green Label.",     0, 0,   0, 255,   0]
    -** Processing line: ~      outputs.labels << [175, 555, "Blue Label.",      0, 0,   0,   0, 255]~
    +      g: 200.randomize(:ratio),
    +** Processing line: ~      w: 1.randomize(:ratio) + 1,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [175, 555, "Blue Label.",      0, 0,   0,   0, 255]
    -** Processing line: ~      outputs.labels << [175, 535, "Faded Label.",     0, 0,   0,   0,   0, 128]~
    +      w: 1.randomize(:ratio) + 1,
    +** Processing line: ~      h: 1.randomize(:ratio) + 1 }~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [175, 535, "Faded Label.",     0, 0,   0,   0,   0, 128]
    -** Processing line: ~    end~
    +      h: 1.randomize(:ratio) + 1 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Shows output of lines on the screen~
    +** Processing line: ~  def new_enemy args~
     - Inside source: true
     *** True Line Result
    -    # Shows output of lines on the screen
    -** Processing line: ~    def lines_tech_demo~
    +  def new_enemy args
    +** Processing line: ~    { x: 1280.randomize(:ratio),~
     - Inside source: true
     *** True Line Result
    -    def lines_tech_demo
    -** Processing line: ~      outputs.labels << [5, 500, "Lines (x, y, x2, y2, r, g, b, a)"]~
    +    { x: 1280.randomize(:ratio),
    +** Processing line: ~      starting_y: 800,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [5, 500, "Lines (x, y, x2, y2, r, g, b, a)"]
    -** Processing line: ~      outputs.lines  << [5, 450, 100, 450]~
    +      starting_y: 800,
    +** Processing line: ~      distance_to_travel: -900,~
     - Inside source: true
     *** True Line Result
    -      outputs.lines  << [5, 450, 100, 450]
    -** Processing line: ~      outputs.lines  << [5, 430, 300, 430]~
    +      distance_to_travel: -900,
    +** Processing line: ~      duration: 60.randomize(:ratio) + 180,~
     - Inside source: true
     *** True Line Result
    -      outputs.lines  << [5, 430, 300, 430]
    -** Processing line: ~      outputs.lines  << [5, 410, 300, 410, state.tick_count % 255, 0, 0, 255] # red saturation changes~
    +      duration: 60.randomize(:ratio) + 180,
    +** Processing line: ~      created_at: args.state.tick_count,~
     - Inside source: true
     *** True Line Result
    -      outputs.lines  << [5, 410, 300, 410, state.tick_count % 255, 0, 0, 255] # red saturation changes
    -** Processing line: ~      outputs.lines  << [5, 390 - state.tick_count % 25, 300, 390, 0, 0, 0, 255] # y position changes~
    +      created_at: args.state.tick_count,
    +** Processing line: ~      w: 32,~
     - Inside source: true
     *** True Line Result
    -      outputs.lines  << [5, 390 - state.tick_count % 25, 300, 390, 0, 0, 0, 255] # y position changes
    -** Processing line: ~      outputs.lines  << [5 + state.tick_count % 200, 360, 300, 360, 0, 0, 0, 255] # x position changes~
    +      w: 32,
    +** Processing line: ~      h: 32,~
     - Inside source: true
     *** True Line Result
    -      outputs.lines  << [5 + state.tick_count % 200, 360, 300, 360, 0, 0, 0, 255] # x position changes
    -** Processing line: ~    end~
    +      h: 32,
    +** Processing line: ~      fire_rate: (30.randomize(:ratio) + (60 - args.state.score)).to_i }~
     - Inside source: true
     *** True Line Result
    -    end
    +      fire_rate: (30.randomize(:ratio) + (60 - args.state.score)).to_i }
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Shows output of different kinds of solids on the screen~
    +** Processing line: ~  def new_bullet args, starting_x, starting_y, enemy_speed~
     - Inside source: true
     *** True Line Result
    -    # Shows output of different kinds of solids on the screen
    -** Processing line: ~    def solids_tech_demo~
    +  def new_bullet args, starting_x, starting_y, enemy_speed
    +** Processing line: ~    { x: starting_x,~
     - Inside source: true
     *** True Line Result
    -    def solids_tech_demo
    -** Processing line: ~      outputs.labels << [  5, 350, "Solids (x, y, w, h, r, g, b, a)"]~
    +    { x: starting_x,
    +** Processing line: ~      starting_y: starting_y,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [  5, 350, "Solids (x, y, w, h, r, g, b, a)"]
    -** Processing line: ~      outputs.solids << [ 10, 270, 50, 50]~
    +      starting_y: starting_y,
    +** Processing line: ~      distance_to_travel: -900,~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [ 10, 270, 50, 50]
    -** Processing line: ~      outputs.solids << [ 70, 270, 50, 50, 0, 0, 0]~
    +      distance_to_travel: -900,
    +** Processing line: ~      created_at: args.state.tick_count,~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [ 70, 270, 50, 50, 0, 0, 0]
    -** Processing line: ~      outputs.solids << [130, 270, 50, 50, 255, 0, 0]~
    +      created_at: args.state.tick_count,
    +** Processing line: ~      duration: 900 / (enemy_speed.abs + 2.0 + (5.0 * args.state.score.fdiv(100))).abs,~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [130, 270, 50, 50, 255, 0, 0]
    -** Processing line: ~      outputs.solids << [190, 270, 50, 50, 255, 0, 0, 128]~
    +      duration: 900 / (enemy_speed.abs + 2.0 + (5.0 * args.state.score.fdiv(100))).abs,
    +** Processing line: ~      w: 5,~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [190, 270, 50, 50, 255, 0, 0, 128]
    -** Processing line: ~      outputs.solids << [250, 270, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes~
    +      w: 5,
    +** Processing line: ~      h: 5 }~
     - Inside source: true
     *** True Line Result
    -      outputs.solids << [250, 270, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes
    -** Processing line: ~    end~
    +      h: 5 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Shows output of different kinds of borders on the screen~
    -- Inside source: true
    -*** True Line Result
    -    # Shows output of different kinds of borders on the screen
    -** Processing line: ~    # The parameters for a border are the same as the parameters for a solid~
    +** Processing line: ~  def new_player_bullet args, starting_x, starting_y, player_speed~
     - Inside source: true
     *** True Line Result
    -    # The parameters for a border are the same as the parameters for a solid
    -** Processing line: ~    def borders_tech_demo~
    +  def new_player_bullet args, starting_x, starting_y, player_speed
    +** Processing line: ~    { x: starting_x,~
     - Inside source: true
     *** True Line Result
    -    def borders_tech_demo
    -** Processing line: ~      outputs.labels <<  [  5, 260, "Borders (x, y, w, h, r, g, b, a)"]~
    +    { x: starting_x,
    +** Processing line: ~      starting_y: starting_y,~
     - Inside source: true
     *** True Line Result
    -      outputs.labels <<  [  5, 260, "Borders (x, y, w, h, r, g, b, a)"]
    -** Processing line: ~      outputs.borders << [ 10, 180, 50, 50]~
    +      starting_y: starting_y,
    +** Processing line: ~      distance_to_travel: 900,~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [ 10, 180, 50, 50]
    -** Processing line: ~      outputs.borders << [ 70, 180, 50, 50, 0, 0, 0]~
    +      distance_to_travel: 900,
    +** Processing line: ~      created_at: args.state.tick_count,~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [ 70, 180, 50, 50, 0, 0, 0]
    -** Processing line: ~      outputs.borders << [130, 180, 50, 50, 255, 0, 0]~
    +      created_at: args.state.tick_count,
    +** Processing line: ~      duration: 900 / (player_speed + 2.0),~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [130, 180, 50, 50, 255, 0, 0]
    -** Processing line: ~      outputs.borders << [190, 180, 50, 50, 255, 0, 0, 128]~
    +      duration: 900 / (player_speed + 2.0),
    +** Processing line: ~      w: 5,~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [190, 180, 50, 50, 255, 0, 0, 128]
    -** Processing line: ~      outputs.borders << [250, 180, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes~
    +      w: 5,
    +** Processing line: ~      h: 5 }~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [250, 180, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes
    -** Processing line: ~    end~
    +      h: 5 }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Shows output of different kinds of sprites on the screen~
    -- Inside source: true
    -*** True Line Result
    -    # Shows output of different kinds of sprites on the screen
    -** Processing line: ~    def sprites_tech_demo~
    +** Processing line: ~  def defaults args~
     - Inside source: true
     *** True Line Result
    -    def sprites_tech_demo
    -** Processing line: ~      outputs.labels <<  [   5, 170, "Sprites (x, y, w, h, path, angle, a)"]~
    +  def defaults args
    +** Processing line: ~    args.outputs.background_color  = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -      outputs.labels <<  [   5, 170, "Sprites (x, y, w, h, path, angle, a)"]
    -** Processing line: ~      outputs.sprites << [  10, 40, 128, 101, 'dragonruby.png']~
    +    args.outputs.background_color  = [0, 0, 0]
    +** Processing line: ~    args.state.score             ||= 0~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << [  10, 40, 128, 101, 'dragonruby.png']
    -** Processing line: ~      outputs.sprites << [ 150, 40, 128, 101, 'dragonruby.png', state.tick_count % 360] # angle changes~
    +    args.state.score             ||= 0
    +** Processing line: ~    args.state.stars             ||= []~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << [ 150, 40, 128, 101, 'dragonruby.png', state.tick_count % 360] # angle changes
    -** Processing line: ~      outputs.sprites << [ 300, 40, 128, 101, 'dragonruby.png', 0, state.tick_count % 255] # transparency changes~
    +    args.state.stars             ||= []
    +** Processing line: ~    args.state.enemies           ||= []~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << [ 300, 40, 128, 101, 'dragonruby.png', 0, state.tick_count % 255] # transparency changes
    -** Processing line: ~    end~
    +    args.state.enemies           ||= []
    +** Processing line: ~    args.state.bullets           ||= []~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.bullets           ||= []
    +** Processing line: ~    args.state.player_bullets    ||= []~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Holds size, alignment, color (black), and alpha (transparency) parameters~
    +    args.state.player_bullets    ||= []
    +** Processing line: ~    args.state.max_stars           = 50~
     - Inside source: true
     *** True Line Result
    -    # Holds size, alignment, color (black), and alpha (transparency) parameters
    -** Processing line: ~    # Using small_font as a parameter accounts for all remaining parameters~
    +    args.state.max_stars           = 50
    +** Processing line: ~    args.state.max_enemies         = 10~
     - Inside source: true
     *** True Line Result
    -    # Using small_font as a parameter accounts for all remaining parameters
    -** Processing line: ~    # so they don't have to be repeatedly typed~
    +    args.state.max_enemies         = 10
    +** Processing line: ~    args.state.player.x          ||= 640~
     - Inside source: true
     *** True Line Result
    -    # so they don't have to be repeatedly typed
    -** Processing line: ~    def small_font~
    +    args.state.player.x          ||= 640
    +** Processing line: ~    args.state.player.y          ||= 100~
     - Inside source: true
     *** True Line Result
    -    def small_font
    -** Processing line: ~      [-2, 0, 0, 0, 0, 255]~
    +    args.state.player.y          ||= 100
    +** Processing line: ~    args.state.player.w          ||= 32~
     - Inside source: true
     *** True Line Result
    -      [-2, 0, 0, 0, 0, 255]
    -** Processing line: ~    end~
    +    args.state.player.w          ||= 32
    +** Processing line: ~    args.state.player.h          ||= 32~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.player.h          ||= 32
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sets position of each row~
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -    # Sets position of each row
    -** Processing line: ~    # Converts given row value to pixels that DragonRuby understands~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars.clear~
     - Inside source: true
     *** True Line Result
    -    # Converts given row value to pixels that DragonRuby understands
    -** Processing line: ~    def row_to_px row_number~
    +      args.state.stars.clear
    +** Processing line: ~      args.state.max_stars.times do~
     - Inside source: true
     *** True Line Result
    -    def row_to_px row_number
    -** Processing line: ~~
    +      args.state.max_stars.times do
    +** Processing line: ~        s = new_star args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # Row 0 starts 5 units below the top of the grid.~
    +        s = new_star args
    +** Processing line: ~        s[:created_at] += s[:duration].randomize(:ratio)~
     - Inside source: true
     *** True Line Result
    -      # Row 0 starts 5 units below the top of the grid.
    -** Processing line: ~      # Each row afterward is 20 units lower.~
    +        s[:created_at] += s[:duration].randomize(:ratio)
    +** Processing line: ~        args.state.stars << s~
     - Inside source: true
     *** True Line Result
    -      # Each row afterward is 20 units lower.
    -** Processing line: ~      grid.top.shift_down(5).shift_down(20 * row_number)~
    +        args.state.stars << s
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      grid.top.shift_down(5).shift_down(20 * row_number)
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -46836,118 +55091,66 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Uses labels to output current game time (passage of time), and whether or not "h" was pressed~
    -- Inside source: true
    -*** True Line Result
    -    # Uses labels to output current game time (passage of time), and whether or not "h" was pressed
    -** Processing line: ~    # If "h" is pressed, the frame is output when the key_up event occurred~
    -- Inside source: true
    -*** True Line Result
    -    # If "h" is pressed, the frame is output when the key_up event occurred
    -** Processing line: ~    def keyboards_tech_demo~
    -- Inside source: true
    -*** True Line Result
    -    def keyboards_tech_demo
    -** Processing line: ~      outputs.labels << [460, row_to_px(0), "Current game time: #{state.tick_count}", small_font]~
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [460, row_to_px(0), "Current game time: #{state.tick_count}", small_font]
    -** Processing line: ~      outputs.labels << [460, row_to_px(2), "Keyboard input: inputs.keyboard.key_up.h", small_font]~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.enemies.clear~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [460, row_to_px(2), "Keyboard input: inputs.keyboard.key_up.h", small_font]
    -** Processing line: ~      outputs.labels << [460, row_to_px(3), "Press \"h\" on the keyboard.", small_font]~
    +      args.state.enemies.clear
    +** Processing line: ~      args.state.max_enemies.times do~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [460, row_to_px(3), "Press \"h\" on the keyboard.", small_font]
    -** Processing line: ~~
    +      args.state.max_enemies.times do
    +** Processing line: ~        s = new_enemy args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if inputs.keyboard.key_up.h # if "h" key_up event occurs~
    +        s = new_enemy args
    +** Processing line: ~        s[:created_at] += s[:duration].randomize(:ratio)~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_up.h # if "h" key_up event occurs
    -** Processing line: ~        state.h_pressed_at = state.tick_count # frame it occurred is stored~
    +        s[:created_at] += s[:duration].randomize(:ratio)
    +** Processing line: ~        args.state.enemies << s~
     - Inside source: true
     *** True Line Result
    -        state.h_pressed_at = state.tick_count # frame it occurred is stored
    +        args.state.enemies << s
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~      # h_pressed_at is initially set to false, and changes once the user presses the "h" key.~
    -- Inside source: true
    -*** True Line Result
    -      # h_pressed_at is initially set to false, and changes once the user presses the "h" key.
    -** Processing line: ~      state.h_pressed_at ||= false~
    -- Inside source: true
    -*** True Line Result
    -      state.h_pressed_at ||= false
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~      if state.h_pressed_at # if h is pressed (pressed_at has a frame number and is no longer false)~
    -- Inside source: true
    -*** True Line Result
    -      if state.h_pressed_at # if h is pressed (pressed_at has a frame number and is no longer false)
    -** Processing line: ~        outputs.labels << [460, row_to_px(4), "\"h\" was pressed at time: #{state.h_pressed_at}", small_font]~
    -- Inside source: true
    -*** True Line Result
    -        outputs.labels << [460, row_to_px(4), "\"h\" was pressed at time: #{state.h_pressed_at}", small_font]
    -** Processing line: ~      else # otherwise, label says "h" was never pressed~
    -- Inside source: true
    -*** True Line Result
    -      else # otherwise, label says "h" was never pressed
    -** Processing line: ~        outputs.labels << [460, row_to_px(4), "\"h\" has never been pressed.", small_font]~
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << [460, row_to_px(4), "\"h\" has never been pressed.", small_font]
    -** Processing line: ~      end~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # border around keyboard input demo section~
    -- Inside source: true
    -*** True Line Result
    -      # border around keyboard input demo section
    -** Processing line: ~      outputs.borders << [455, row_to_px(5), 360, row_to_px(2).shift_up(5) - row_to_px(5)]~
    -- Inside source: true
    -*** True Line Result
    -      outputs.borders << [455, row_to_px(5), 360, row_to_px(2).shift_up(5) - row_to_px(5)]
    -** Processing line: ~    end~
    -- Inside source: true
    -*** True Line Result
    -    end
    -** Processing line: ~~
    +** Processing line: ~  def input args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Sets definition for a small label~
    +  def input args
    +** Processing line: ~    if args.inputs.keyboard.left~
     - Inside source: true
     *** True Line Result
    -    # Sets definition for a small label
    -** Processing line: ~    # Makes it easier to position labels in respect to the position of other labels~
    +    if args.inputs.keyboard.left
    +** Processing line: ~      args.state.player.x -= 5~
     - Inside source: true
     *** True Line Result
    -    # Makes it easier to position labels in respect to the position of other labels
    -** Processing line: ~    def small_label x, row, message~
    +      args.state.player.x -= 5
    +** Processing line: ~    elsif args.inputs.keyboard.right~
     - Inside source: true
     *** True Line Result
    -    def small_label x, row, message
    -** Processing line: ~      [x, row_to_px(row), message, small_font]~
    +    elsif args.inputs.keyboard.right
    +** Processing line: ~      args.state.player.x += 5~
     - Inside source: true
     *** True Line Result
    -      [x, row_to_px(row), message, small_font]
    +      args.state.player.x += 5
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -46956,178 +55159,162 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Uses small labels to show whether the "a" button on the controller is down, held, or up.~
    -- Inside source: true
    -*** True Line Result
    -    # Uses small labels to show whether the "a" button on the controller is down, held, or up.
    -** Processing line: ~    # y value of each small label is set by calling the row_to_px method~
    -- Inside source: true
    -*** True Line Result
    -    # y value of each small label is set by calling the row_to_px method
    -** Processing line: ~    def controller_tech_demo~
    -- Inside source: true
    -*** True Line Result
    -    def controller_tech_demo
    -** Processing line: ~      x = 460~
    -- Inside source: true
    -*** True Line Result
    -      x = 460
    -** Processing line: ~      outputs.labels << small_label(x, 6, "Controller one input: inputs.controller_one")~
    +** Processing line: ~    if args.inputs.keyboard.up~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 6, "Controller one input: inputs.controller_one")
    -** Processing line: ~      outputs.labels << small_label(x, 7, "Current state of the \"a\" button.")~
    +    if args.inputs.keyboard.up
    +** Processing line: ~      args.state.player.y += 5~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 7, "Current state of the \"a\" button.")
    -** Processing line: ~      outputs.labels << small_label(x, 8, "Check console window for more info.")~
    +      args.state.player.y += 5
    +** Processing line: ~    elsif args.inputs.keyboard.down~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 8, "Check console window for more info.")
    -** Processing line: ~~
    +    elsif args.inputs.keyboard.down
    +** Processing line: ~      args.state.player.y -= 5~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if inputs.controller_one.key_down.a # if "a" is in "down" state~
    +      args.state.player.y -= 5
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if inputs.controller_one.key_down.a # if "a" is in "down" state
    -** Processing line: ~        outputs.labels << small_label(x, 9, "\"a\" button down: #{inputs.controller_one.key_down.a}")~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 9, "\"a\" button down: #{inputs.controller_one.key_down.a}")
    -** Processing line: ~        puts "\"a\" button down at #{inputs.controller_one.key_down.a}" # prints frame the event occurred~
    +
    +** Processing line: ~    if args.inputs.keyboard.key_down.space~
     - Inside source: true
     *** True Line Result
    -        puts "\"a\" button down at #{inputs.controller_one.key_down.a}" # prints frame the event occurred
    -** Processing line: ~      elsif inputs.controller_one.key_held.a # if "a" is held down~
    +    if args.inputs.keyboard.key_down.space
    +** Processing line: ~      args.state.player_bullets << new_player_bullet(args,~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.controller_one.key_held.a # if "a" is held down
    -** Processing line: ~        outputs.labels << small_label(x, 9, "\"a\" button held: #{inputs.controller_one.key_held.a}")~
    +      args.state.player_bullets << new_player_bullet(args,
    +** Processing line: ~                                                     args.state.player.x + args.state.player.w.half,~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 9, "\"a\" button held: #{inputs.controller_one.key_held.a}")
    -** Processing line: ~      elsif inputs.controller_one.key_up.a # if "a" is in up state~
    +                                                     args.state.player.x + args.state.player.w.half,
    +** Processing line: ~                                                     args.state.player.y + args.state.player.h, 5)~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.controller_one.key_up.a # if "a" is in up state
    -** Processing line: ~        outputs.labels << small_label(x, 9, "\"a\" button up: #{inputs.controller_one.key_up.a}")~
    +                                                     args.state.player.y + args.state.player.h, 5)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 9, "\"a\" button up: #{inputs.controller_one.key_up.a}")
    -** Processing line: ~        puts "\"a\" key up at #{inputs.controller_one.key_up.a}"~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        puts "\"a\" key up at #{inputs.controller_one.key_up.a}"
    -** Processing line: ~      else # if no event has occurred~
    +
    +** Processing line: ~    args.state.player.y = args.state.player.y.greater(0).lesser(720 - args.state.player.w)~
     - Inside source: true
     *** True Line Result
    -      else # if no event has occurred
    -** Processing line: ~        outputs.labels << small_label(x, 9, "\"a\" button state is nil.")~
    +    args.state.player.y = args.state.player.y.greater(0).lesser(720 - args.state.player.w)
    +** Processing line: ~    args.state.player.x = args.state.player.x.greater(0).lesser(1280 - args.state.player.h)~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 9, "\"a\" button state is nil.")
    -** Processing line: ~      end~
    +    args.state.player.x = args.state.player.x.greater(0).lesser(1280 - args.state.player.h)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # border around controller input demo section~
    +** Processing line: ~  def completed? entity~
     - Inside source: true
     *** True Line Result
    -      # border around controller input demo section
    -** Processing line: ~      outputs.borders << [455, row_to_px(10), 360, row_to_px(6).shift_up(5) - row_to_px(10)]~
    +  def completed? entity
    +** Processing line: ~    (entity[:created_at] + entity[:duration]).elapsed_time > 0~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [455, row_to_px(10), 360, row_to_px(6).shift_up(5) - row_to_px(10)]
    -** Processing line: ~    end~
    +    (entity[:created_at] + entity[:duration]).elapsed_time > 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs when the mouse was clicked, as well as the coordinates on the screen~
    +** Processing line: ~  def calc_stars args~
     - Inside source: true
     *** True Line Result
    -    # Outputs when the mouse was clicked, as well as the coordinates on the screen
    -** Processing line: ~    # of where the click occurred~
    +  def calc_stars args
    +** Processing line: ~    if (stars_to_add = args.state.max_stars - args.state.stars.length) > 0~
     - Inside source: true
     *** True Line Result
    -    # of where the click occurred
    -** Processing line: ~    def mouse_tech_demo~
    +    if (stars_to_add = args.state.max_stars - args.state.stars.length) > 0
    +** Processing line: ~      stars_to_add.times { args.state.stars << new_star(args) }~
     - Inside source: true
     *** True Line Result
    -    def mouse_tech_demo
    -** Processing line: ~      x = 460~
    +      stars_to_add.times { args.state.stars << new_star(args) }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      x = 460
    -** Processing line: ~~
    +    end
    +** Processing line: ~    args.state.stars = args.state.stars.reject { |s| completed? s }~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << small_label(x, 11, "Mouse input: inputs.mouse")~
    +    args.state.stars = args.state.stars.reject { |s| completed? s }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 11, "Mouse input: inputs.mouse")
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if inputs.mouse.click # if click has a value and is not nil~
    +** Processing line: ~  def move_enemies args~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.click # if click has a value and is not nil
    -** Processing line: ~        state.last_mouse_click = inputs.mouse.click # coordinates of click are stored~
    +  def move_enemies args
    +** Processing line: ~    if (enemies_to_add = args.state.max_enemies - args.state.enemies.length) > 0~
     - Inside source: true
     *** True Line Result
    -        state.last_mouse_click = inputs.mouse.click # coordinates of click are stored
    -** Processing line: ~      end~
    +    if (enemies_to_add = args.state.max_enemies - args.state.enemies.length) > 0
    +** Processing line: ~      enemies_to_add.times { args.state.enemies << new_enemy(args) }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +      enemies_to_add.times { args.state.enemies << new_enemy(args) }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if state.last_mouse_click # if mouse is clicked (has coordinates as value)~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if state.last_mouse_click # if mouse is clicked (has coordinates as value)
    -** Processing line: ~        # outputs the time (frame) the click occurred, as well as how many frames have passed since the event~
    +
    +** Processing line: ~    args.state.enemies = args.state.enemies.reject { |s| completed? s }~
     - Inside source: true
     *** True Line Result
    -        # outputs the time (frame) the click occurred, as well as how many frames have passed since the event
    -** Processing line: ~        outputs.labels << small_label(x, 12, "Mouse click happened at: #{state.last_mouse_click.created_at}, #{state.last_mouse_click.created_at_elapsed}")~
    +    args.state.enemies = args.state.enemies.reject { |s| completed? s }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 12, "Mouse click happened at: #{state.last_mouse_click.created_at}, #{state.last_mouse_click.created_at_elapsed}")
    -** Processing line: ~        # outputs coordinates of click~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        # outputs coordinates of click
    -** Processing line: ~        outputs.labels << small_label(x, 13, "Mouse click location: #{state.last_mouse_click.point.x}, #{state.last_mouse_click.point.y}")~
    +
    +** Processing line: ~  def move_bullets args~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 13, "Mouse click location: #{state.last_mouse_click.point.x}, #{state.last_mouse_click.point.y}")
    -** Processing line: ~      else # otherwise if the mouse has not been clicked~
    +  def move_bullets args
    +** Processing line: ~    args.state.enemies.each do |e|~
     - Inside source: true
     *** True Line Result
    -      else # otherwise if the mouse has not been clicked
    -** Processing line: ~        outputs.labels << small_label(x, 12, "Mouse click has not occurred yet.")~
    +    args.state.enemies.each do |e|
    +** Processing line: ~      if args.state.tick_count.mod_zero?(e[:fire_rate])~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 12, "Mouse click has not occurred yet.")
    -** Processing line: ~        outputs.labels << small_label(x, 13, "Please click mouse.")~
    +      if args.state.tick_count.mod_zero?(e[:fire_rate])
    +** Processing line: ~        args.state.bullets << new_bullet(args, e[:x] + e[:w].half, current_y(e), e[:distance_to_travel] / e[:duration])~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 13, "Please click mouse.")
    +        args.state.bullets << new_bullet(args, e[:x] + e[:w].half, current_y(e), e[:distance_to_travel] / e[:duration])
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -47140,90 +55327,90 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs whether a mouse click occurred inside or outside of a box~
    +** Processing line: ~    args.state.bullets = args.state.bullets.reject { |s| completed? s }~
     - Inside source: true
     *** True Line Result
    -    # Outputs whether a mouse click occurred inside or outside of a box
    -** Processing line: ~    def point_to_rect_tech_demo~
    +    args.state.bullets = args.state.bullets.reject { |s| completed? s }
    +** Processing line: ~    args.state.player_bullets = args.state.player_bullets.reject { |s| completed? s }~
     - Inside source: true
     *** True Line Result
    -    def point_to_rect_tech_demo
    -** Processing line: ~      x = 460~
    +    args.state.player_bullets = args.state.player_bullets.reject { |s| completed? s }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      x = 460
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.labels << small_label(x, 15, "Click inside the blue box maybe ---->")~
    +** Processing line: ~  def intersect? entity_one, entity_two~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 15, "Click inside the blue box maybe ---->")
    -** Processing line: ~~
    +  def intersect? entity_one, entity_two
    +** Processing line: ~    entity_one.merge(y: current_y(entity_one))~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      box = [765, 370, 50, 50, 0, 0, 170] # blue box~
    +    entity_one.merge(y: current_y(entity_one))
    +** Processing line: ~              .intersect_rect? entity_two.merge(y: current_y(entity_two))~
     - Inside source: true
     *** True Line Result
    -      box = [765, 370, 50, 50, 0, 0, 170] # blue box
    -** Processing line: ~      outputs.borders << box~
    +              .intersect_rect? entity_two.merge(y: current_y(entity_two))
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << box
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if state.last_mouse_click # if the mouse was clicked~
    +** Processing line: ~  def kill args~
     - Inside source: true
     *** True Line Result
    -      if state.last_mouse_click # if the mouse was clicked
    -** Processing line: ~        if state.last_mouse_click.point.inside_rect? box # if mouse clicked inside box~
    +  def kill args
    +** Processing line: ~    bullets_hitting_enemies = []~
     - Inside source: true
     *** True Line Result
    -        if state.last_mouse_click.point.inside_rect? box # if mouse clicked inside box
    -** Processing line: ~          outputs.labels << small_label(x, 16, "Mouse click happened inside the box.")~
    +    bullets_hitting_enemies = []
    +** Processing line: ~    dead_bullets = []~
     - Inside source: true
     *** True Line Result
    -          outputs.labels << small_label(x, 16, "Mouse click happened inside the box.")
    -** Processing line: ~        else # otherwise, if mouse was clicked outside the box~
    +    dead_bullets = []
    +** Processing line: ~    dead_enemies = []~
     - Inside source: true
     *** True Line Result
    -        else # otherwise, if mouse was clicked outside the box
    -** Processing line: ~          outputs.labels << small_label(x, 16, "Mouse click happened outside the box.")~
    +    dead_enemies = []
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          outputs.labels << small_label(x, 16, "Mouse click happened outside the box.")
    -** Processing line: ~        end~
    +
    +** Processing line: ~    args.state.player_bullets.each do |b|~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      else # otherwise, if was not clicked at all~
    +    args.state.player_bullets.each do |b|
    +** Processing line: ~      args.state.enemies.each do |e|~
     - Inside source: true
     *** True Line Result
    -      else # otherwise, if was not clicked at all
    -** Processing line: ~        outputs.labels << small_label(x, 16, "Mouse click has not occurred yet.") # output if the mouse was not clicked~
    +      args.state.enemies.each do |e|
    +** Processing line: ~        if intersect? b, e~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 16, "Mouse click has not occurred yet.") # output if the mouse was not clicked
    -** Processing line: ~      end~
    +        if intersect? b, e
    +** Processing line: ~          dead_bullets << b~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +          dead_bullets << b
    +** Processing line: ~          dead_enemies << e~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # border around mouse input demo section~
    +          dead_enemies << e
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      # border around mouse input demo section
    -** Processing line: ~      outputs.borders << [455, row_to_px(14), 360, row_to_px(11).shift_up(5) - row_to_px(14)]~
    +        end
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << [455, row_to_px(14), 360, row_to_px(11).shift_up(5) - row_to_px(14)]
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -47232,186 +55419,182 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs a red box onto the screen. A mouse click from the user inside of the red box will output~
    -- Inside source: true
    -*** True Line Result
    -    # Outputs a red box onto the screen. A mouse click from the user inside of the red box will output
    -** Processing line: ~    # a smaller box. If two small boxes are inside of the red box, it will be determined whether or not~
    +** Processing line: ~    args.state.score += dead_enemies.length~
     - Inside source: true
     *** True Line Result
    -    # a smaller box. If two small boxes are inside of the red box, it will be determined whether or not
    -** Processing line: ~    # they intersect.~
    +    args.state.score += dead_enemies.length
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # they intersect.
    -** Processing line: ~    def rect_to_rect_tech_demo~
    +
    +** Processing line: ~    args.state.player_bullets.reject! { |b| dead_bullets.include? b }~
     - Inside source: true
     *** True Line Result
    -    def rect_to_rect_tech_demo
    -** Processing line: ~      x = 460~
    +    args.state.player_bullets.reject! { |b| dead_bullets.include? b }
    +** Processing line: ~    args.state.enemies.reject! { |e| dead_enemies.include? e }~
     - Inside source: true
     *** True Line Result
    -      x = 460
    +    args.state.enemies.reject! { |e| dead_enemies.include? e }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.labels << small_label(x, 17.5, "Click inside the red box below.") # label with instructions~
    +** Processing line: ~    dead = args.state.bullets.any? do |b|~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << small_label(x, 17.5, "Click inside the red box below.") # label with instructions
    -** Processing line: ~      red_box = [460, 250, 355, 90, 170, 0, 0] # definition of the red box~
    +    dead = args.state.bullets.any? do |b|
    +** Processing line: ~      [args.state.player.x,~
     - Inside source: true
     *** True Line Result
    -      red_box = [460, 250, 355, 90, 170, 0, 0] # definition of the red box
    -** Processing line: ~      outputs.borders << red_box # output as a border (not filled in)~
    +      [args.state.player.x,
    +** Processing line: ~       args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << red_box # output as a border (not filled in)
    -** Processing line: ~~
    +       args.state.player.y,
    +** Processing line: ~       args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # If the mouse is clicked inside the red box, two collision boxes are created.~
    +       args.state.player.w,
    +** Processing line: ~       args.state.player.h].intersect_rect? b.merge(y: current_y(b))~
     - Inside source: true
     *** True Line Result
    -      # If the mouse is clicked inside the red box, two collision boxes are created.
    -** Processing line: ~      if inputs.mouse.click~
    +       args.state.player.h].intersect_rect? b.merge(y: current_y(b))
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.click
    -** Processing line: ~        if inputs.mouse.click.point.inside_rect? red_box~
    +    end
    +** Processing line: ~    return unless dead~
     - Inside source: true
     *** True Line Result
    -        if inputs.mouse.click.point.inside_rect? red_box
    -** Processing line: ~          if !state.box_collision_one # if the collision_one box does not yet have a definition~
    +    return unless dead
    +** Processing line: ~    args.gtk.reset~
     - Inside source: true
     *** True Line Result
    -          if !state.box_collision_one # if the collision_one box does not yet have a definition
    -** Processing line: ~            # Subtracts 25 from the x and y positions of the click point in order to make the click point the center of the box.~
    +    args.gtk.reset
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -            # Subtracts 25 from the x and y positions of the click point in order to make the click point the center of the box.
    -** Processing line: ~            # You can try deleting the subtraction to see how it impacts the box placement.~
    +    defaults args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -            # You can try deleting the subtraction to see how it impacts the box placement.
    -** Processing line: ~            state.box_collision_one = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 180, 0,   0, 180]  # sets definition~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -            state.box_collision_one = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 180, 0,   0, 180]  # sets definition
    -** Processing line: ~          elsif !state.box_collision_two # if collision_two does not yet have a definition~
    +
    +** Processing line: ~  def calc args~
     - Inside source: true
     *** True Line Result
    -          elsif !state.box_collision_two # if collision_two does not yet have a definition
    -** Processing line: ~            state.box_collision_two = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50,   0, 0, 180, 180] # sets definition~
    +  def calc args
    +** Processing line: ~    calc_stars args~
     - Inside source: true
     *** True Line Result
    -            state.box_collision_two = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50,   0, 0, 180, 180] # sets definition
    -** Processing line: ~          else~
    +    calc_stars args
    +** Processing line: ~    move_enemies args~
     - Inside source: true
     *** True Line Result
    -          else
    -** Processing line: ~            state.box_collision_one = nil # both boxes are empty~
    +    move_enemies args
    +** Processing line: ~    move_bullets args~
     - Inside source: true
     *** True Line Result
    -            state.box_collision_one = nil # both boxes are empty
    -** Processing line: ~            state.box_collision_two = nil~
    +    move_bullets args
    +** Processing line: ~    kill args~
     - Inside source: true
     *** True Line Result
    -            state.box_collision_two = nil
    -** Processing line: ~          end~
    +    kill args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -          end
    -** Processing line: ~        end~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      end~
    +
    +** Processing line: ~  def current_y entity~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +  def current_y entity
    +** Processing line: ~    entity[:starting_y] + (entity[:distance_to_travel] * entity[:created_at].ease(entity[:duration], :identity))~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      # If collision boxes exist, they are output onto screen inside the red box as solids~
    +    entity[:starting_y] + (entity[:distance_to_travel] * entity[:created_at].ease(entity[:duration], :identity))
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      # If collision boxes exist, they are output onto screen inside the red box as solids
    -** Processing line: ~      if state.box_collision_one~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if state.box_collision_one
    -** Processing line: ~        outputs.solids << state.box_collision_one~
    +
    +** Processing line: ~  def render args~
     - Inside source: true
     *** True Line Result
    -        outputs.solids << state.box_collision_one
    -** Processing line: ~      end~
    +  def render args
    +** Processing line: ~    args.outputs.solids << args.state.stars.map do |s|~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    args.outputs.solids << args.state.stars.map do |s|
    +** Processing line: ~      [s[:x],~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if state.box_collision_two~
    +      [s[:x],
    +** Processing line: ~       current_y(s),~
     - Inside source: true
     *** True Line Result
    -      if state.box_collision_two
    -** Processing line: ~        outputs.solids << state.box_collision_two~
    +       current_y(s),
    +** Processing line: ~       s[:w], s[:h], 0, s[:g], s[:b], s[:max_alpha] * s[:created_at].ease(20, :identity)]~
     - Inside source: true
     *** True Line Result
    -        outputs.solids << state.box_collision_two
    -** Processing line: ~      end~
    +       s[:w], s[:h], 0, s[:g], s[:b], s[:max_alpha] * s[:created_at].ease(20, :identity)]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Outputs whether or not the two collision boxes intersect.~
    +** Processing line: ~    args.outputs.borders << args.state.enemies.map do |s|~
     - Inside source: true
     *** True Line Result
    -      # Outputs whether or not the two collision boxes intersect.
    -** Processing line: ~      if state.box_collision_one && state.box_collision_two # if both collision_boxes are defined (and not nil or empty)~
    +    args.outputs.borders << args.state.enemies.map do |s|
    +** Processing line: ~      [s[:x],~
     - Inside source: true
     *** True Line Result
    -      if state.box_collision_one && state.box_collision_two # if both collision_boxes are defined (and not nil or empty)
    -** Processing line: ~        if state.box_collision_one.intersect_rect? state.box_collision_two # if the two boxes intersect~
    +      [s[:x],
    +** Processing line: ~       current_y(s),~
     - Inside source: true
     *** True Line Result
    -        if state.box_collision_one.intersect_rect? state.box_collision_two # if the two boxes intersect
    -** Processing line: ~          outputs.labels << small_label(x, 23.5, 'The boxes intersect.')~
    +       current_y(s),
    +** Processing line: ~       s[:w], s[:h], 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -          outputs.labels << small_label(x, 23.5, 'The boxes intersect.')
    -** Processing line: ~        else # otherwise, if the two boxes do not intersect~
    +       s[:w], s[:h], 255, 0, 0]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        else # otherwise, if the two boxes do not intersect
    -** Processing line: ~          outputs.labels << small_label(x, 23.5, 'The boxes do not intersect.')~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -          outputs.labels << small_label(x, 23.5, 'The boxes do not intersect.')
    -** Processing line: ~        end~
    +
    +** Processing line: ~    args.outputs.borders << args.state.bullets.map do |b|~
     - Inside source: true
     *** True Line Result
    -        end
    -** Processing line: ~      else~
    +    args.outputs.borders << args.state.bullets.map do |b|
    +** Processing line: ~      [b[:x],~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        outputs.labels << small_label(x, 23.5, '--') # if the two boxes are not defined (are nil or empty), this label is output~
    +      [b[:x],
    +** Processing line: ~       current_y(b),~
     - Inside source: true
     *** True Line Result
    -        outputs.labels << small_label(x, 23.5, '--') # if the two boxes are not defined (are nil or empty), this label is output
    -** Processing line: ~      end~
    +       current_y(b),
    +** Processing line: ~       b[:w], b[:h], 255, 0, 0]~
     - Inside source: true
     *** True Line Result
    -      end
    +       b[:w], b[:h], 255, 0, 0]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -47420,310 +55603,294 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Creates a button and outputs it onto the screen using labels and borders.~
    +** Processing line: ~    args.outputs.borders << args.state.player_bullets.map do |b|~
     - Inside source: true
     *** True Line Result
    -    # Creates a button and outputs it onto the screen using labels and borders.
    -** Processing line: ~    # If the button is clicked, the color changes to make it look faded.~
    +    args.outputs.borders << args.state.player_bullets.map do |b|
    +** Processing line: ~      [b[:x],~
     - Inside source: true
     *** True Line Result
    -    # If the button is clicked, the color changes to make it look faded.
    -** Processing line: ~    def button_tech_demo~
    +      [b[:x],
    +** Processing line: ~       current_y(b),~
     - Inside source: true
     *** True Line Result
    -    def button_tech_demo
    -** Processing line: ~      x, y, w, h = 460, 160, 300, 50~
    +       current_y(b),
    +** Processing line: ~       b[:w], b[:h], 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -      x, y, w, h = 460, 160, 300, 50
    -** Processing line: ~      state.button        ||= state.new_entity(:button_with_fade)~
    +       b[:w], b[:h], 255, 255, 255]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      state.button        ||= state.new_entity(:button_with_fade)
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      # Adds w.half to x and h.half + 10 to y in order to display the text inside the button's borders.~
    +** Processing line: ~    args.borders << [args.state.player.x,~
     - Inside source: true
     *** True Line Result
    -      # Adds w.half to x and h.half + 10 to y in order to display the text inside the button's borders.
    -** Processing line: ~      state.button.label  ||= [x + w.half, y + h.half + 10, "click me and watch me fade", 0, 1]~
    +    args.borders << [args.state.player.x,
    +** Processing line: ~                     args.state.player.y,~
     - Inside source: true
     *** True Line Result
    -      state.button.label  ||= [x + w.half, y + h.half + 10, "click me and watch me fade", 0, 1]
    -** Processing line: ~      state.button.border ||= [x, y, w, h]~
    +                     args.state.player.y,
    +** Processing line: ~                     args.state.player.w,~
     - Inside source: true
     *** True Line Result
    -      state.button.border ||= [x, y, w, h]
    +                     args.state.player.w,
    +** Processing line: ~                     args.state.player.h, 255, 255, 255]~
    +- Inside source: true
    +*** True Line Result
    +                     args.state.player.h, 255, 255, 255]
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.button.border) # if mouse is clicked, and clicked inside button's border~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.button.border) # if mouse is clicked, and clicked inside button's border
    -** Processing line: ~        state.button.clicked_at = inputs.mouse.click.created_at # stores the time the click occurred~
    +  def tick args
    +** Processing line: ~    defaults args~
     - Inside source: true
     *** True Line Result
    -        state.button.clicked_at = inputs.mouse.click.created_at # stores the time the click occurred
    -** Processing line: ~      end~
    +    defaults args
    +** Processing line: ~    input args~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +    input args
    +** Processing line: ~    calc args~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << state.button.label~
    +    calc args
    +** Processing line: ~    render args~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << state.button.label
    -** Processing line: ~      outputs.borders << state.button.border~
    +    render args
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << state.button.border
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if state.button.clicked_at # if button was clicked (variable has a value and is not nil)~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      if state.button.clicked_at # if button was clicked (variable has a value and is not nil)
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~        # The appearance of the button changes for 0.25 seconds after the time the button is clicked at.~
    -- Inside source: true
    -*** True Line Result
    -        # The appearance of the button changes for 0.25 seconds after the time the button is clicked at.
    -** Processing line: ~        # The color changes (rgb is set to 0, 180, 80) and the transparency gradually changes.~
    -- Inside source: true
    +** Processing line: ~*** Performance - Sprites As Hash - main.rb~
    +- Header detected.
     *** True Line Result
    -        # The color changes (rgb is set to 0, 180, 80) and the transparency gradually changes.
    -** Processing line: ~        # Change 0.25 to 1.25 and notice that the transparency takes longer to return to normal.~
    -- Inside source: true
    +
     *** True Line Result
    -        # Change 0.25 to 1.25 and notice that the transparency takes longer to return to normal.
    -** Processing line: ~        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.button.clicked_at.ease(0.25.seconds, :flip)]~
    -- Inside source: true
    +*** Performance - Sprites As Hash - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -        outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.button.clicked_at.ease(0.25.seconds, :flip)]
    -** Processing line: ~      end~
    -- Inside source: true
    +
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/01_sprites_as_hash/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    end
    +  # ./samples/09_performance/01_sprites_as_hash/app/main.rb
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Creates a new button by declaring it as a new entity, and sets values.~
    -- Inside source: true
    -*** True Line Result
    -    # Creates a new button by declaring it as a new entity, and sets values.
    -** Processing line: ~    def new_button_prefab x, y, message~
    +** Processing line: ~  # Sprites represented as Hashes using the queue ~args.outputs.sprites~~
     - Inside source: true
     *** True Line Result
    -    def new_button_prefab x, y, message
    -** Processing line: ~      w, h = 300, 50~
    +  # Sprites represented as Hashes using the queue ~args.outputs.sprites~
    +** Processing line: ~  # code up, but are the "slowest" to render.~
     - Inside source: true
     *** True Line Result
    -      w, h = 300, 50
    -** Processing line: ~      button        = state.new_entity(:button_with_fade)~
    +  # code up, but are the "slowest" to render.
    +** Processing line: ~  # The reason for this is the access of the key in the Hash and also~
     - Inside source: true
     *** True Line Result
    -      button        = state.new_entity(:button_with_fade)
    -** Processing line: ~      button.label  = [x + w.half, y + h.half + 10, message, 0, 1] # '+ 10' keeps label's text within button's borders~
    +  # The reason for this is the access of the key in the Hash and also
    +** Processing line: ~  # because the data args.outputs.sprites is cleared every tick.~
     - Inside source: true
     *** True Line Result
    -      button.label  = [x + w.half, y + h.half + 10, message, 0, 1] # '+ 10' keeps label's text within button's borders
    -** Processing line: ~      button.border = [x, y, w, h] # sets border definition~
    +  # because the data args.outputs.sprites is cleared every tick.
    +** Processing line: ~  def random_x args~
     - Inside source: true
     *** True Line Result
    -      button.border = [x, y, w, h] # sets border definition
    -** Processing line: ~      button~
    +  def random_x args
    +** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -      button
    -** Processing line: ~    end~
    +    (args.grid.w.randomize :ratio) * -1
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # If the mouse has been clicked and the click's location is inside of the button's border, that means~
    -- Inside source: true
    -*** True Line Result
    -    # If the mouse has been clicked and the click's location is inside of the button's border, that means
    -** Processing line: ~    # that the button has been clicked. This method returns a boolean value.~
    -- Inside source: true
    -*** True Line Result
    -    # that the button has been clicked. This method returns a boolean value.
    -** Processing line: ~    def button_clicked? button~
    +** Processing line: ~  def random_y args~
     - Inside source: true
     *** True Line Result
    -    def button_clicked? button
    -** Processing line: ~      inputs.mouse.click && inputs.mouse.click.point.inside_rect?(button.border)~
    +  def random_y args
    +** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -      inputs.mouse.click && inputs.mouse.click.point.inside_rect?(button.border)
    -** Processing line: ~    end~
    +    (args.grid.h.randomize :ratio) * -1
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Determines if button was clicked, and changes its appearance if it is clicked~
    -- Inside source: true
    -*** True Line Result
    -    # Determines if button was clicked, and changes its appearance if it is clicked
    -** Processing line: ~    def tick_button_prefab button~
    +** Processing line: ~  def random_speed~
     - Inside source: true
     *** True Line Result
    -    def tick_button_prefab button
    -** Processing line: ~      outputs.labels << button.label # outputs button's label and border~
    +  def random_speed
    +** Processing line: ~    1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << button.label # outputs button's label and border
    -** Processing line: ~      outputs.borders << button.border~
    +    1 + (4.randomize :ratio)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs.borders << button.border
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      if button_clicked? button # if button is clicked~
    -- Inside source: true
    -*** True Line Result
    -      if button_clicked? button # if button is clicked
    -** Processing line: ~        button.clicked_at = inputs.mouse.click.created_at # stores the time that the button was clicked~
    -- Inside source: true
    -*** True Line Result
    -        button.clicked_at = inputs.mouse.click.created_at # stores the time that the button was clicked
    -** Processing line: ~      end~
    +** Processing line: ~  def new_star args~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~~
    +  def new_star args
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if button.clicked_at # if clicked_at has a frame value and is not nil~
    +    {
    +** Processing line: ~      x: (random_x args),~
     - Inside source: true
     *** True Line Result
    -      if button.clicked_at # if clicked_at has a frame value and is not nil
    -** Processing line: ~        # button is output; color changes and transparency changes for 0.25 seconds after click occurs~
    +      x: (random_x args),
    +** Processing line: ~      y: (random_y args),~
     - Inside source: true
     *** True Line Result
    -        # button is output; color changes and transparency changes for 0.25 seconds after click occurs
    -** Processing line: ~        outputs.solids << [button.border.x, button.border.y, button.border.w, button.border.h,~
    +      y: (random_y args),
    +** Processing line: ~      w: 4, h: 4, path: 'sprites/tiny-star.png',~
     - Inside source: true
     *** True Line Result
    -        outputs.solids << [button.border.x, button.border.y, button.border.w, button.border.h,
    -** Processing line: ~                           0, 180, 80, 255 * button.clicked_at.ease(0.25.seconds, :flip)] # transparency changes for 0.25 seconds~
    +      w: 4, h: 4, path: 'sprites/tiny-star.png',
    +** Processing line: ~      s: random_speed~
     - Inside source: true
     *** True Line Result
    -                           0, 180, 80, 255 * button.clicked_at.ease(0.25.seconds, :flip)] # transparency changes for 0.25 seconds
    -** Processing line: ~      end~
    +      s: random_speed
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Exports the app's game state if the export button is clicked.~
    +** Processing line: ~  def move_star args, star~
     - Inside source: true
     *** True Line Result
    -    # Exports the app's game state if the export button is clicked.
    -** Processing line: ~    def export_game_state_demo~
    +  def move_star args, star
    +** Processing line: ~    star.x += star[:s]~
     - Inside source: true
     *** True Line Result
    -    def export_game_state_demo
    -** Processing line: ~      state.export_game_state_button ||= new_button_prefab(460, 100, "click to export app state")~
    +    star.x += star[:s]
    +** Processing line: ~    star.y += star[:s]~
     - Inside source: true
     *** True Line Result
    -      state.export_game_state_button ||= new_button_prefab(460, 100, "click to export app state")
    -** Processing line: ~      tick_button_prefab(state.export_game_state_button) # calls method to output button~
    +    star.y += star[:s]
    +** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
     - Inside source: true
     *** True Line Result
    -      tick_button_prefab(state.export_game_state_button) # calls method to output button
    -** Processing line: ~      if button_clicked? state.export_game_state_button # if the export button is clicked~
    +    if star.x > args.grid.w || star.y > args.grid.h
    +** Processing line: ~      star.x = (random_x args)~
     - Inside source: true
     *** True Line Result
    -      if button_clicked? state.export_game_state_button # if the export button is clicked
    -** Processing line: ~        args.gtk.export! "Exported from clicking the export button in the tech demo." # the export occurs~
    +      star.x = (random_x args)
    +** Processing line: ~      star.y = (random_y args)~
     - Inside source: true
     *** True Line Result
    -        args.gtk.export! "Exported from clicking the export button in the tech demo." # the export occurs
    -** Processing line: ~      end~
    +      star.y = (random_y args)
    +** Processing line: ~      star[:s] = random_speed~
     - Inside source: true
     *** True Line Result
    -      end
    +      star[:s] = random_speed
     ** 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: ~    # The mouse and keyboard focus are set to "yes" when the Dragonruby window is the active window.~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    # The mouse and keyboard focus are set to "yes" when the Dragonruby window is the active window.
    -** Processing line: ~    def window_state_demo~
    +  def tick args
    +** Processing line: ~    args.state.star_count ||= 0~
     - Inside source: true
     *** True Line Result
    -    def window_state_demo
    -** Processing line: ~      m = $gtk.args.inputs.mouse.has_focus ? 'Y' : 'N' # ternary operator (similar to if statement)~
    +    args.state.star_count ||= 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      m = $gtk.args.inputs.mouse.has_focus ? 'Y' : 'N' # ternary operator (similar to if statement)
    -** Processing line: ~      k = $gtk.args.inputs.keyboard.has_focus ? 'Y' : 'N'~
    +
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -      k = $gtk.args.inputs.keyboard.has_focus ? 'Y' : 'N'
    -** Processing line: ~      outputs.labels << [460, 20, "mouse focus: #{m}   keyboard focus: #{k}", small_font]~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [460, 20, "mouse focus: #{m}   keyboard focus: #{k}", small_font]
    -** Processing line: ~    end~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #Sets values for the horizontal separator (divides demo sections)~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -    #Sets values for the horizontal separator (divides demo sections)
    -** Processing line: ~    def horizontal_seperator y, x, x2~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Sprites, Hashes"~
     - Inside source: true
     *** True Line Result
    -    def horizontal_seperator y, x, x2
    -** Processing line: ~      [x, y, x2, y, 150, 150, 150]~
    +      puts "* INFO: Sprites, Hashes"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -      [x, y, x2, y, 150, 150, 150]
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
    +- Inside source: true
    +*** True Line Result
    +      args.gtk.console.set_command "reset_with count: 100"
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -47732,18 +55899,18 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #Sets the values for the vertical separator (divides demo sections)~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -    #Sets the values for the vertical separator (divides demo sections)
    -** Processing line: ~    def vertical_seperator x, y, y2~
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -    def vertical_seperator x, y, y2
    -** Processing line: ~      [x, y, x, y2, 150, 150, 150]~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
     - Inside source: true
     *** True Line Result
    -      [x, y, x, y2, 150, 150, 150]
    +      args.state.stars = args.state.star_count.map { |i| new_star args }
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -47752,62 +55919,58 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs vertical and horizontal separators onto the screen to separate each demo section.~
    +** Processing line: ~    # update~
     - Inside source: true
     *** True Line Result
    -    # Outputs vertical and horizontal separators onto the screen to separate each demo section.
    -** Processing line: ~    def render_seperators~
    +    # update
    +** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
     - Inside source: true
     *** True Line Result
    -    def render_seperators
    -** Processing line: ~      outputs.lines << horizontal_seperator(505, grid.left, 445)~
    +    args.state.stars.each { |s| move_star args, s }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_seperator(505, grid.left, 445)
    -** Processing line: ~      outputs.lines << horizontal_seperator(353, grid.left, 445)~
    +
    +** Processing line: ~    # render~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_seperator(353, grid.left, 445)
    -** Processing line: ~      outputs.lines << horizontal_seperator(264, grid.left, 445)~
    +    # render
    +** Processing line: ~    args.outputs.sprites << args.state.stars~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_seperator(264, grid.left, 445)
    -** Processing line: ~      outputs.lines << horizontal_seperator(174, grid.left, 445)~
    +    args.outputs.sprites << args.state.stars
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_seperator(174, grid.left, 445)
    -** Processing line: ~~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.lines << vertical_seperator(445, grid.top, grid.bottom)~
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << vertical_seperator(445, grid.top, grid.bottom)
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.lines << horizontal_seperator(690, 445, 820)~
    -- Inside source: true
    -*** True Line Result
    -      outputs.lines << horizontal_seperator(690, 445, 820)
    -** Processing line: ~      outputs.lines << horizontal_seperator(426, 445, 820)~
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << horizontal_seperator(426, 445, 820)
    -** Processing line: ~~
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.lines << vertical_seperator(820, grid.top, grid.bottom)~
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -      outputs.lines << vertical_seperator(820, grid.top, grid.bottom)
    -** Processing line: ~    end~
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
     - Inside source: true
     *** True Line Result
    -    end
    +    $gtk.args.state.star_count = count
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -47816,58 +55979,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $tech_demo = TechDemo.new~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  $tech_demo = TechDemo.new
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~*** Performance - Sprites As Entities - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Performance - Sprites As Entities - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/02_sprites_as_entities/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $tech_demo.inputs = args.inputs~
    +  # ./samples/09_performance/02_sprites_as_entities/app/main.rb
    +** Processing line: ~  # Sprites represented as Entities using the queue ~args.outputs.sprites~~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.inputs = args.inputs
    -** Processing line: ~    $tech_demo.state = args.state~
    +  # Sprites represented as Entities using the queue ~args.outputs.sprites~
    +** Processing line: ~  # yields nicer access apis over Hashes, but require a bit more code upfront.~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.state = args.state
    -** Processing line: ~    $tech_demo.grid = args.grid~
    +  # yields nicer access apis over Hashes, but require a bit more code upfront.
    +** Processing line: ~  # The hash sample has to use star[:s] to get the speed of the star, but~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.grid = args.grid
    -** Processing line: ~    $tech_demo.args = args~
    +  # The hash sample has to use star[:s] to get the speed of the star, but
    +** Processing line: ~  # an entity can use .s instead.~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.args = args
    -** Processing line: ~    $tech_demo.outputs = args.render_target(:mini_map)~
    +  # an entity can use .s instead.
    +** Processing line: ~  def random_x args~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.outputs = args.render_target(:mini_map)
    -** Processing line: ~    $tech_demo.tick~
    +  def random_x args
    +** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -    $tech_demo.tick
    -** Processing line: ~    args.outputs.labels  << [830, 715, "Render target:", [-2, 0, 0, 0, 0, 255]]~
    +    (args.grid.w.randomize :ratio) * -1
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels  << [830, 715, "Render target:", [-2, 0, 0, 0, 0, 255]]
    -** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, :mini_map]~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [0, 0, 1280, 720, :mini_map]
    -** Processing line: ~    args.outputs.sprites << [830, 300, 675, 379, :mini_map]~
    +
    +** Processing line: ~  def random_y args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << [830, 300, 675, 379, :mini_map]
    -** Processing line: ~    tick_instructions args, "Sample app shows all the rendering apis available."~
    +  def random_y args
    +** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -    tick_instructions args, "Sample app shows all the rendering apis available."
    +    (args.grid.h.randomize :ratio) * -1
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -47876,54 +56051,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 tick_instructions args, text, y = 715~
    +** Processing line: ~  def random_speed~
     - Inside source: true
     *** True Line Result
    -  def tick_instructions args, text, y = 715
    -** Processing line: ~    return if args.state.key_event_occurred~
    +  def random_speed
    +** Processing line: ~    1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -    return if args.state.key_event_occurred
    -** Processing line: ~    if args.inputs.mouse.click ||~
    +    1 + (4.randomize :ratio)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.mouse.click ||
    -** Processing line: ~       args.inputs.keyboard.directional_vector ||~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.directional_vector ||
    -** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
    +
    +** Processing line: ~  def new_star args~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.enter ||
    -** Processing line: ~       args.inputs.keyboard.key_down.escape~
    +  def new_star args
    +** Processing line: ~    args.state.new_entity :star, {~
     - Inside source: true
     *** True Line Result
    -       args.inputs.keyboard.key_down.escape
    -** Processing line: ~      args.state.key_event_occurred = true~
    +    args.state.new_entity :star, {
    +** Processing line: ~      x: (random_x args),~
     - Inside source: true
     *** True Line Result
    -      args.state.key_event_occurred = true
    -** Processing line: ~    end~
    +      x: (random_x args),
    +** Processing line: ~      y: (random_y args),~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      y: (random_y args),
    +** Processing line: ~      w: 4, h: 4,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
    +      w: 4, h: 4,
    +** Processing line: ~      path: 'sprites/tiny-star.png',~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [0, y - 50, 1280, 60].solid
    -** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
    +      path: 'sprites/tiny-star.png',
    +** Processing line: ~      s: random_speed~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
    -** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
    +      s: random_speed
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
    +    }
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -47932,318 +56107,314 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    +** Processing line: ~  def move_star args, star~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Advanced Rendering - Render Primitive Hierarchies - main.rb~
    -- Header detected.
    +  def move_star args, star
    +** Processing line: ~    star.x += star.s~
    +- Inside source: true
     *** True Line Result
    -
    +    star.x += star.s
    +** Processing line: ~    star.y += star.s~
    +- Inside source: true
     *** True Line Result
    -*** Advanced Rendering - Render Primitive Hierarchies - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    star.y += star.s
    +** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
    +- Inside source: true
     *** True Line Result
    -
    +    if star.x > args.grid.w || star.y > args.grid.h
    +** Processing line: ~      star.x = (random_x args)~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb~
    +      star.x = (random_x args)
    +** Processing line: ~      star.y = (random_y args)~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb
    -** Processing line: ~  =begin~
    +      star.y = (random_y args)
    +** Processing line: ~      star.s = random_speed~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +      star.s = random_speed
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - Nested array: An array whose individual elements are also arrays; useful for~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -   - Nested array: An array whose individual elements are also arrays; useful for
    -** Processing line: ~     storing groups of similar data.  Also called multidimensional arrays.~
    +  def tick args
    +** Processing line: ~    args.state.star_count ||= 0~
     - Inside source: true
     *** True Line Result
    -     storing groups of similar data.  Also called multidimensional arrays.
    +    args.state.star_count ||= 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     In this sample app, we see nested arrays being used in object definitions.~
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -     In this sample app, we see nested arrays being used in object definitions.
    -** Processing line: ~     Notice the parameters for solids, listed below. Parameters 1-3 set the~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -     Notice the parameters for solids, listed below. Parameters 1-3 set the
    -** Processing line: ~     definition for the rect, and parameter 4 sets the definition of the color.~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -     definition for the rect, and parameter 4 sets the definition of the color.
    -** Processing line: ~~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     Instead of having a solid definition that looks like this,~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -     Instead of having a solid definition that looks like this,
    -** Processing line: ~     [X, Y, W, H, R, G, B]~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Sprites, Open Entities"~
     - Inside source: true
     *** True Line Result
    -     [X, Y, W, H, R, G, B]
    -** Processing line: ~     we can separate it into two separate array definitions in one, like this~
    +      puts "* INFO: Sprites, Open Entities"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -     we can separate it into two separate array definitions in one, like this
    -** Processing line: ~     [[X, Y, W, H], [R, G, B]]~
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
     - Inside source: true
     *** True Line Result
    -     [[X, Y, W, H], [R, G, B]]
    -** Processing line: ~     and both options work fine in defining our solid (or any object).~
    +      args.gtk.console.set_command "reset_with count: 100"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     and both options work fine in defining our solid (or any object).
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - Collections: Lists of data; useful for organizing large amounts of data.~
    -- Inside source: true
    -*** True Line Result
    -   - Collections: Lists of data; useful for organizing large amounts of data.
    -** Processing line: ~     One element of a collection could be an array (which itself contains many elements).~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -     One element of a collection could be an array (which itself contains many elements).
    -** Processing line: ~     For example, a collection that stores two solid objects would look like this:~
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -     For example, a collection that stores two solid objects would look like this:
    -** Processing line: ~     [~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
     - Inside source: true
     *** True Line Result
    -     [
    -** Processing line: ~      [100, 100, 50, 50, 0, 0, 0],~
    +      args.state.stars = args.state.star_count.map { |i| new_star args }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      [100, 100, 50, 50, 0, 0, 0],
    -** Processing line: ~      [100, 150, 50, 50, 255, 255, 255]~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [100, 150, 50, 50, 255, 255, 255]
    -** Processing line: ~     ]~
    +
    +** Processing line: ~    # update~
     - Inside source: true
     *** True Line Result
    -     ]
    -** Processing line: ~     If this collection was added to args.outputs.solids, two solids would be output~
    +    # update
    +** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
     - Inside source: true
     *** True Line Result
    -     If this collection was added to args.outputs.solids, two solids would be output
    -** Processing line: ~     next to each other, one black and one white.~
    +    args.state.stars.each { |s| move_star args, s }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     next to each other, one black and one white.
    -** Processing line: ~     Nested arrays can be used in collections, as you will see in this sample app.~
    +
    +** Processing line: ~    # render~
     - Inside source: true
     *** True Line Result
    -     Nested arrays can be used in collections, as you will see in this sample app.
    -** Processing line: ~~
    +    # render
    +** Processing line: ~    args.outputs.sprites << args.state.stars~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +    args.outputs.sprites << args.state.stars
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array. The values generate a solid.
    -** Processing line: ~     The parameters for a solid are~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -     The parameters for a solid are
    -** Processing line: ~     1. The position on the screen (x, y)~
    +
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -     1. The position on the screen (x, y)
    -** Processing line: ~     2. The width (w)~
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
     - Inside source: true
     *** True Line Result
    -     2. The width (w)
    -** Processing line: ~     3. The height (h)~
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -     3. The height (h)
    -** Processing line: ~     4. The color (r, g, b) (if a color is not assigned, the object's default color will be black)~
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
     - Inside source: true
     *** True Line Result
    -     4. The color (r, g, b) (if a color is not assigned, the object's default color will be black)
    -** Processing line: ~     NOTE: THE PARAMETERS ARE THE SAME FOR BORDERS!~
    +    $gtk.args.state.star_count = count
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     NOTE: THE PARAMETERS ARE THE SAME FOR BORDERS!
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     Here is an example of a (red) border or solid definition:~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -     Here is an example of a (red) border or solid definition:
    -** Processing line: ~     [100, 100, 400, 500, 255, 0, 0]~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -     [100, 100, 400, 500, 255, 0, 0]
    -** Processing line: ~     It will be a solid or border depending on if it is added to args.outputs.solids or args.outputs.borders.~
    -- Inside source: true
    +
    +** Processing line: ~*** Performance - Sprites As Strict Entities - main.rb~
    +- Header detected.
     *** True Line Result
    -     It will be a solid or border depending on if it is added to args.outputs.solids or args.outputs.borders.
    -** Processing line: ~     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.~
    -- Inside source: true
    +
     *** True Line Result
    -     For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
    -** Processing line: ~~
    -- Inside source: true
    +*** Performance - Sprites As Strict Entities - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
    -- Inside source: true
     *** True Line Result
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -** Processing line: ~     The parameters for sprites are~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb~
     - Inside source: true
     *** True Line Result
    -     The parameters for sprites are
    -** Processing line: ~     1. The position on the screen (x, y)~
    +  # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb
    +** Processing line: ~  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~~
     - Inside source: true
     *** True Line Result
    -     1. The position on the screen (x, y)
    -** Processing line: ~     2. The width (w)~
    +  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
    +** Processing line: ~  # yields apis access similar to Entities, but all properties that can be set on the~
     - Inside source: true
     *** True Line Result
    -     2. The width (w)
    -** Processing line: ~     3. The height (h)~
    +  # yields apis access similar to Entities, but all properties that can be set on the
    +** Processing line: ~  # entity must be predefined with a default value. Strict entities do not support the~
     - Inside source: true
     *** True Line Result
    -     3. The height (h)
    -** Processing line: ~     4. The image path (p)~
    +  # entity must be predefined with a default value. Strict entities do not support the
    +** Processing line: ~  # addition of new properties after the fact. They are more performant than OpenEntities~
     - Inside source: true
     *** True Line Result
    -     4. The image path (p)
    -** Processing line: ~~
    +  # addition of new properties after the fact. They are more performant than OpenEntities
    +** Processing line: ~  # because of this constraint.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     Here is an example of a sprite definition:~
    +  # because of this constraint.
    +** Processing line: ~  def random_x args~
     - Inside source: true
     *** True Line Result
    -     Here is an example of a sprite definition:
    -** Processing line: ~     [100, 100, 400, 500, 'sprites/dragonruby.png']~
    +  def random_x args
    +** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -     [100, 100, 400, 500, 'sprites/dragonruby.png']
    -** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
    +    (args.grid.w.randomize :ratio) * -1
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~  def random_y args~
     - Inside source: true
     *** True Line Result
    -  =end
    -** Processing line: ~~
    +  def random_y args
    +** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # This code demonstrates the creation and output of objects like sprites, borders, and solids~
    +    (args.grid.h.randomize :ratio) * -1
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  # This code demonstrates the creation and output of objects like sprites, borders, and solids
    -** Processing line: ~  # If filled in, they are solids~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  # If filled in, they are solids
    -** Processing line: ~  # If hollow, they are borders~
    +
    +** Processing line: ~  def random_speed~
     - Inside source: true
     *** True Line Result
    -  # If hollow, they are borders
    -** Processing line: ~  # If images, they are sprites~
    +  def random_speed
    +** Processing line: ~    1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -  # If images, they are sprites
    +    1 + (4.randomize :ratio)
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Solids are added to args.outputs.solids~
    +** Processing line: ~  def new_star args~
     - Inside source: true
     *** True Line Result
    -  # Solids are added to args.outputs.solids
    -** Processing line: ~  # Borders are added to args.outputs.borders~
    +  def new_star args
    +** Processing line: ~    args.state.new_entity_strict(:star,~
     - Inside source: true
     *** True Line Result
    -  # Borders are added to args.outputs.borders
    -** Processing line: ~  # Sprites are added to args.outputs.sprites~
    +    args.state.new_entity_strict(:star,
    +** Processing line: ~                                 x: (random_x args),~
     - Inside source: true
     *** True Line Result
    -  # Sprites are added to args.outputs.sprites
    -** Processing line: ~~
    +                                 x: (random_x args),
    +** Processing line: ~                                 y: (random_y args),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # The tick method runs 60 frames every second.~
    +                                 y: (random_y args),
    +** Processing line: ~                                 w: 4, h: 4,~
     - Inside source: true
     *** True Line Result
    -  # The tick method runs 60 frames every second.
    -** Processing line: ~  # Your game is going to happen under this one function.~
    +                                 w: 4, h: 4,
    +** Processing line: ~                                 path: 'sprites/tiny-star.png',~
     - Inside source: true
     *** True Line Result
    -  # Your game is going to happen under this one function.
    -** Processing line: ~  def tick args~
    +                                 path: 'sprites/tiny-star.png',
    +** Processing line: ~                                 s: random_speed) do |entity|~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    border_as_solid_and_solid_as_border args~
    +                                 s: random_speed) do |entity|
    +** Processing line: ~      # invoke attr_sprite so that it responds to~
     - Inside source: true
     *** True Line Result
    -    border_as_solid_and_solid_as_border args
    -** Processing line: ~    sprite_as_border_or_solids args~
    +      # invoke attr_sprite so that it responds to
    +** Processing line: ~      # all properties that are required to render a sprite~
     - Inside source: true
     *** True Line Result
    -    sprite_as_border_or_solids args
    -** Processing line: ~    collection_of_borders_and_solids args~
    +      # all properties that are required to render a sprite
    +** Processing line: ~      entity.attr_sprite~
     - Inside source: true
     *** True Line Result
    -    collection_of_borders_and_solids args
    -** Processing line: ~    collection_of_sprites args~
    +      entity.attr_sprite
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    collection_of_sprites args
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -48252,166 +56423,170 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Shows a border being output onto the screen as a border and a solid~
    -- Inside source: true
    -*** True Line Result
    -  # Shows a border being output onto the screen as a border and a solid
    -** Processing line: ~  # Also shows how colors can be set~
    -- Inside source: true
    -*** True Line Result
    -  # Also shows how colors can be set
    -** Processing line: ~  def border_as_solid_and_solid_as_border args~
    +** Processing line: ~  def move_star args, star~
     - Inside source: true
     *** True Line Result
    -  def border_as_solid_and_solid_as_border args
    -** Processing line: ~    border = [0, 0, 50, 50]~
    +  def move_star args, star
    +** Processing line: ~    star.x += star.s~
     - Inside source: true
     *** True Line Result
    -    border = [0, 0, 50, 50]
    -** Processing line: ~    args.outputs.borders << border~
    +    star.x += star.s
    +** Processing line: ~    star.y += star.s~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << border
    -** Processing line: ~    args.outputs.solids  << border~
    +    star.y += star.s
    +** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids  << border
    -** Processing line: ~~
    +    if star.x > args.grid.w || star.y > args.grid.h
    +** Processing line: ~      star.x = (random_x args)~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Red, green, blue saturations (last three parameters) can be any number between 0 and 255~
    +      star.x = (random_x args)
    +** Processing line: ~      star.y = (random_y args)~
     - Inside source: true
     *** True Line Result
    -    # Red, green, blue saturations (last three parameters) can be any number between 0 and 255
    -** Processing line: ~    border_with_color = [0, 100, 50, 50, 255, 0, 0]~
    +      star.y = (random_y args)
    +** Processing line: ~      star.s = random_speed~
     - Inside source: true
     *** True Line Result
    -    border_with_color = [0, 100, 50, 50, 255, 0, 0]
    -** Processing line: ~    args.outputs.borders << border_with_color~
    +      star.s = random_speed
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << border_with_color
    -** Processing line: ~    args.outputs.solids  << border_with_color~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids  << border_with_color
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    border_with_nested_color = [0, 200, 50, 50, [0, 255, 0]] # nested color~
    -- Inside source: true
    -*** True Line Result
    -    border_with_nested_color = [0, 200, 50, 50, [0, 255, 0]] # nested color
    -** Processing line: ~    args.outputs.borders << border_with_nested_color~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << border_with_nested_color
    -** Processing line: ~    args.outputs.solids  << border_with_nested_color~
    +  def tick args
    +** Processing line: ~    args.state.star_count ||= 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids  << border_with_nested_color
    +    args.state.star_count ||= 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    border_with_nested_rect = [[0, 300, 50, 50], 0, 0, 255] # nested rect~
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -    border_with_nested_rect = [[0, 300, 50, 50], 0, 0, 255] # nested rect
    -** Processing line: ~    args.outputs.borders << border_with_nested_rect~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << border_with_nested_rect
    -** Processing line: ~    args.outputs.solids  << border_with_nested_rect~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids  << border_with_nested_rect
    -** Processing line: ~~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    border_with_nested_color_and_rect = [[0, 400, 50, 50], [255, 0, 255]] # nested rect and color~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -    border_with_nested_color_and_rect = [[0, 400, 50, 50], [255, 0, 255]] # nested rect and color
    -** Processing line: ~    args.outputs.borders << border_with_nested_color_and_rect~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Sprites, Strict Entities"~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << border_with_nested_color_and_rect
    -** Processing line: ~    args.outputs.solids  << border_with_nested_color_and_rect~
    +      puts "* INFO: Sprites, Strict Entities"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids  << border_with_nested_color_and_rect
    -** Processing line: ~  end~
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
     - Inside source: true
     *** True Line Result
    -  end
    +      args.gtk.console.set_command "reset_with count: 100"
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Shows a sprite output onto the screen as a sprite, border, and solid~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -  # Shows a sprite output onto the screen as a sprite, border, and solid
    -** Processing line: ~  # Demonstrates that all three outputs appear differently on screen~
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -  # Demonstrates that all three outputs appear differently on screen
    -** Processing line: ~  def sprite_as_border_or_solids args~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
     - Inside source: true
     *** True Line Result
    -  def sprite_as_border_or_solids args
    -** Processing line: ~    sprite = [100, 0, 50, 50, 'sprites/ship.png']~
    +      args.state.stars = args.state.star_count.map { |i| new_star args }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    sprite = [100, 0, 50, 50, 'sprites/ship.png']
    -** Processing line: ~    args.outputs.sprites << sprite~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << sprite
    +
    +** Processing line: ~    # update~
    +- Inside source: true
    +*** True Line Result
    +    # update
    +** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
    +- Inside source: true
    +*** True Line Result
    +    args.state.stars.each { |s| move_star args, s }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sprite_as_border variable has same parameters (excluding position) as above object,~
    +** Processing line: ~    # render~
     - Inside source: true
     *** True Line Result
    -    # Sprite_as_border variable has same parameters (excluding position) as above object,
    -** Processing line: ~    # but will appear differently on screen because it is added to args.outputs.borders~
    +    # render
    +** Processing line: ~    args.outputs.sprites << args.state.stars~
     - Inside source: true
     *** True Line Result
    -    # but will appear differently on screen because it is added to args.outputs.borders
    -** Processing line: ~    sprite_as_border = [100, 100, 50, 50, 'sprites/ship.png']~
    +    args.outputs.sprites << args.state.stars
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    sprite_as_border = [100, 100, 50, 50, 'sprites/ship.png']
    -** Processing line: ~    args.outputs.borders << sprite_as_border~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << sprite_as_border
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Sprite_as_solid variable has same parameters (excluding position) as above object,~
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -    # Sprite_as_solid variable has same parameters (excluding position) as above object,
    -** Processing line: ~    # but will appear differently on screen because it is added to args.outputs.solids~
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
     - Inside source: true
     *** True Line Result
    -    # but will appear differently on screen because it is added to args.outputs.solids
    -** Processing line: ~    sprite_as_solid = [100, 200, 50, 50, 'sprites/ship.png']~
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -    sprite_as_solid = [100, 200, 50, 50, 'sprites/ship.png']
    -** Processing line: ~    args.outputs.solids << sprite_as_solid~
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << sprite_as_solid
    +    $gtk.args.state.star_count = count
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -48420,110 +56595,118 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Holds and outputs a collection of borders and a collection of solids~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  # Holds and outputs a collection of borders and a collection of solids
    -** Processing line: ~  # Collections are created by using arrays to hold parameters of each individual object~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -  # Collections are created by using arrays to hold parameters of each individual object
    -** Processing line: ~  def collection_of_borders_and_solids args~
    -- Inside source: true
    +
    +** Processing line: ~*** Performance - Sprites As Classes - main.rb~
    +- Header detected.
     *** True Line Result
    -  def collection_of_borders_and_solids args
    -** Processing line: ~    collection_borders = [~
    +
    +*** True Line Result
    +*** Performance - Sprites As Classes - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/04_sprites_as_classes/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    collection_borders = [
    -** Processing line: ~      [~
    +  # ./samples/09_performance/04_sprites_as_classes/app/main.rb
    +** Processing line: ~  # Sprites represented as Classes using the queue ~args.outputs.sprites~.~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [200,  0, 50, 50],                    # black border~
    +  # Sprites represented as Classes using the queue ~args.outputs.sprites~.
    +** Processing line: ~  # gives you full control of property declaration and method invocation.~
     - Inside source: true
     *** True Line Result
    -        [200,  0, 50, 50],                    # black border
    -** Processing line: ~        [200,  100, 50, 50, 255, 0, 0],       # red border~
    +  # gives you full control of property declaration and method invocation.
    +** Processing line: ~  # They are more performant than OpenEntities and StrictEntities, but more code upfront.~
     - Inside source: true
     *** True Line Result
    -        [200,  100, 50, 50, 255, 0, 0],       # red border
    -** Processing line: ~        [200,  200, 50, 50, [0, 255, 0]],     # nested color~
    +  # They are more performant than OpenEntities and StrictEntities, but more code upfront.
    +** Processing line: ~  class Star~
     - Inside source: true
     *** True Line Result
    -        [200,  200, 50, 50, [0, 255, 0]],     # nested color
    -** Processing line: ~      ],~
    +  class Star
    +** Processing line: ~    attr_sprite~
     - Inside source: true
     *** True Line Result
    -      ],
    -** Processing line: ~      [[200, 300, 50, 50], 0, 0, 255],        # nested rect~
    +    attr_sprite
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [[200, 300, 50, 50], 0, 0, 255],        # nested rect
    -** Processing line: ~      [[200, 400, 50, 50], [255, 0, 255]]     # nested rect and nested color~
    +
    +** Processing line: ~    def initialize grid~
     - Inside source: true
     *** True Line Result
    -      [[200, 400, 50, 50], [255, 0, 255]]     # nested rect and nested color
    -** Processing line: ~    ]~
    +    def initialize grid
    +** Processing line: ~      @grid = grid~
     - Inside source: true
     *** True Line Result
    -    ]
    -** Processing line: ~~
    +      @grid = grid
    +** Processing line: ~      @x = (rand @grid.w) * -1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.borders << collection_borders~
    +      @x = (rand @grid.w) * -1
    +** Processing line: ~      @y = (rand @grid.h) * -1~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << collection_borders
    -** Processing line: ~~
    +      @y = (rand @grid.h) * -1
    +** Processing line: ~      @w    = 4~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    collection_solids = [~
    +      @w    = 4
    +** Processing line: ~      @h    = 4~
     - Inside source: true
     *** True Line Result
    -    collection_solids = [
    -** Processing line: ~      [~
    +      @h    = 4
    +** Processing line: ~      @s    = 1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [[300, 300, 50, 50], 0, 0, 255],      # nested rect~
    +      @s    = 1 + (4.randomize :ratio)
    +** Processing line: ~      @path = 'sprites/tiny-star.png'~
     - Inside source: true
     *** True Line Result
    -        [[300, 300, 50, 50], 0, 0, 255],      # nested rect
    -** Processing line: ~        [[300, 400, 50, 50], [255, 0, 255]]   # nested rect and nested color~
    +      @path = 'sprites/tiny-star.png'
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        [[300, 400, 50, 50], [255, 0, 255]]   # nested rect and nested color
    -** Processing line: ~      ],~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      ],
    -** Processing line: ~      [300,  0, 50, 50],~
    +
    +** Processing line: ~    def move~
     - Inside source: true
     *** True Line Result
    -      [300,  0, 50, 50],
    -** Processing line: ~      [300,  100, 50, 50, 255, 0, 0],~
    +    def move
    +** Processing line: ~      @x += @s~
     - Inside source: true
     *** True Line Result
    -      [300,  100, 50, 50, 255, 0, 0],
    -** Processing line: ~      [300,  200, 50, 50, [0, 255, 0]],       # nested color~
    +      @x += @s
    +** Processing line: ~      @y += @s~
     - Inside source: true
     *** True Line Result
    -      [300,  200, 50, 50, [0, 255, 0]],       # nested color
    -** Processing line: ~    ]~
    +      @y += @s
    +** Processing line: ~      @x = (rand @grid.w) * -1 if @x > @grid.right~
     - Inside source: true
     *** True Line Result
    -    ]
    -** Processing line: ~~
    +      @x = (rand @grid.w) * -1 if @x > @grid.right
    +** Processing line: ~      @y = (rand @grid.h) * -1 if @y > @grid.top~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.solids << collection_solids~
    +      @y = (rand @grid.h) * -1 if @y > @grid.top
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << collection_solids
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -48532,114 +56715,126 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Holds and outputs a collection of sprites by adding it to args.outputs.sprites~
    +** Processing line: ~  # calls methods needed for game to run properly~
     - Inside source: true
     *** True Line Result
    -  # Holds and outputs a collection of sprites by adding it to args.outputs.sprites
    -** Processing line: ~  # Also outputs a collection with same parameters (excluding position) by adding~
    +  # calls methods needed for game to run properly
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -  # Also outputs a collection with same parameters (excluding position) by adding
    -** Processing line: ~  # it to args.outputs.solids and another to args.outputs.borders~
    +  def tick args
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -  # it to args.outputs.solids and another to args.outputs.borders
    -** Processing line: ~  def collection_of_sprites args~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -  def collection_of_sprites args
    -** Processing line: ~    sprites_collection = [~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -    sprites_collection = [
    -** Processing line: ~      [~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [400, 0, 50, 50, 'sprites/ship.png'],~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -        [400, 0, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~        [400, 100, 50, 50, 'sprites/ship.png'],~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Sprites, Classes"~
     - Inside source: true
     *** True Line Result
    -        [400, 100, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~      ],~
    +      puts "* INFO: Sprites, Classes"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -      ],
    -** Processing line: ~      [400, 200, 50, 50, 'sprites/ship.png']~
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
     - Inside source: true
     *** True Line Result
    -      [400, 200, 50, 50, 'sprites/ship.png']
    -** Processing line: ~    ]~
    +      args.gtk.console.set_command "reset_with count: 100"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    ]
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.sprites << sprites_collection~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << sprites_collection
    -** Processing line: ~~
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.solids << [~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [
    -** Processing line: ~      [500, 0, 50, 50, 'sprites/ship.png'],~
    +      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      [500, 0, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~      [500, 100, 50, 50, 'sprites/ship.png'],~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [500, 100, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~      [[[500, 200, 50, 50, 'sprites/ship.png']]]~
    +
    +** Processing line: ~    # update~
     - Inside source: true
     *** True Line Result
    -      [[[500, 200, 50, 50, 'sprites/ship.png']]]
    -** Processing line: ~    ]~
    +    # update
    +** Processing line: ~    args.state.stars.each(&:move)~
     - Inside source: true
     *** True Line Result
    -    ]
    +    args.state.stars.each(&:move)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.borders << [~
    +** Processing line: ~    # render~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << [
    -** Processing line: ~      [~
    +    # render
    +** Processing line: ~    args.outputs.sprites << args.state.stars~
     - Inside source: true
     *** True Line Result
    -      [
    -** Processing line: ~        [600, 0, 50, 50, 'sprites/ship.png'],~
    +    args.outputs.sprites << args.state.stars
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -        [600, 0, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~        [600, 100, 50, 50, 'sprites/ship.png'],~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -        [600, 100, 50, 50, 'sprites/ship.png'],
    -** Processing line: ~      ],~
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      ],
    -** Processing line: ~      [600, 200, 50, 50, 'sprites/ship.png']~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [600, 200, 50, 50, 'sprites/ship.png']
    -** Processing line: ~    ]~
    +
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -    ]
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
    +- Inside source: true
    +*** True Line Result
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
    +- Inside source: true
    +*** True Line Result
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
    +- Inside source: true
    +*** True Line Result
    +    $gtk.args.state.star_count = count
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -48656,786 +56851,874 @@ 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 Primitives As Hash - main.rb~
    +** Processing line: ~*** Performance - Static Sprites As Classes - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Render Primitives As Hash - main.rb
    +*** Performance - Static Sprites As Classes - main.rb
     ** Processing line: ~#+begin_src ruby~
     - Line was identified as the beginning of a code block.
     *** True Line Result
     
     *** True Line Result
     #+begin_src ruby
    -** Processing line: ~  # ./samples/07_advanced_rendering/05_render_primitives_as_hash/app/main.rb~
    +** Processing line: ~  # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/05_render_primitives_as_hash/app/main.rb
    -** Processing line: ~  =begin~
    +  # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb
    +** Processing line: ~  # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +  # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.
    +** Processing line: ~  # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   Reminders:~
    +  # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held
    +** Processing line: ~  # by reference. You get better performance, but you are mutating state of held objects~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +  # by reference. You get better performance, but you are mutating state of held objects
    +** Processing line: ~  # which is less functional/data oriented.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The value can be found~
    +  # which is less functional/data oriented.
    +** Processing line: ~  class Star~
     - Inside source: true
     *** True Line Result
    -   - Hashes: Collection of unique keys and their corresponding values. The value can be found
    -** Processing line: ~     using their keys.~
    +  class Star
    +** Processing line: ~    attr_sprite~
     - Inside source: true
     *** True Line Result
    -     using their keys.
    +    attr_sprite
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~     For example, if we have a "numbers" hash that stores numbers in English as the~
    +** Processing line: ~    def initialize grid~
     - Inside source: true
     *** True Line Result
    -     For example, if we have a "numbers" hash that stores numbers in English as the
    -** Processing line: ~     key and numbers in Spanish as the value, we'd have a hash that looks like this...~
    +    def initialize grid
    +** Processing line: ~      @grid = grid~
     - Inside source: true
     *** True Line Result
    -     key and numbers in Spanish as the value, we'd have a hash that looks like this...
    -** Processing line: ~     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }~
    +      @grid = grid
    +** Processing line: ~      @x = (rand @grid.w) * -1~
     - Inside source: true
     *** True Line Result
    -     numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
    -** Processing line: ~     and on it goes.~
    +      @x = (rand @grid.w) * -1
    +** Processing line: ~      @y = (rand @grid.h) * -1~
     - Inside source: true
     *** True Line Result
    -     and on it goes.
    -** Processing line: ~~
    +      @y = (rand @grid.h) * -1
    +** Processing line: ~      @w    = 4~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~     Now if we wanted to find the corresponding value of the "one" key, we could say~
    +      @w    = 4
    +** Processing line: ~      @h    = 4~
     - Inside source: true
     *** True Line Result
    -     Now if we wanted to find the corresponding value of the "one" key, we could say
    -** Processing line: ~     puts numbers["one"]~
    +      @h    = 4
    +** Processing line: ~      @s    = 1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -     puts numbers["one"]
    -** Processing line: ~     which would print "uno" to the console.~
    +      @s    = 1 + (4.randomize :ratio)
    +** Processing line: ~      @path = 'sprites/tiny-star.png'~
     - Inside source: true
     *** True Line Result
    -     which would print "uno" to the console.
    +      @path = 'sprites/tiny-star.png'
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.sprites: An array. The values generate a sprite.~
    +** Processing line: ~    def move~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.sprites: An array. The values generate a sprite.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]~
    +    def move
    +** Processing line: ~      @x += @s~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
    -** Processing line: ~     For more information about sprites, go to mygame/documentation/05-sprites.md.~
    +      @x += @s
    +** Processing line: ~      @y += @s~
     - Inside source: true
     *** True Line Result
    -     For more information about sprites, go to mygame/documentation/05-sprites.md.
    -** Processing line: ~~
    +      @y += @s
    +** Processing line: ~      @x = (rand @grid.w) * -1 if @x > @grid.right~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
    +      @x = (rand @grid.w) * -1 if @x > @grid.right
    +** Processing line: ~      @y = (rand @grid.h) * -1 if @y > @grid.top~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. The values generate a label.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +      @y = (rand @grid.h) * -1 if @y > @grid.top
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
    +** Processing line: ~  # calls methods needed for game to run properly~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.solids: An array. The values generate a solid.
    -** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
    +  # calls methods needed for game to run properly
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    -** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
    +  def tick args
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    -** Processing line: ~~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.borders: An array. The values generate a border.~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.borders: An array. The values generate a border.
    -** Processing line: ~     The parameters are the same as a solid.~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -     The parameters are the same as a solid.
    -** Processing line: ~     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -     For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
    -** Processing line: ~~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Static Sprites, Classes"~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - args.outputs.lines: An array. The values generate a line.~
    +      puts "* INFO: Static Sprites, Classes"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.lines: An array. The values generate a line.
    -** Processing line: ~     The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]~
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +      args.gtk.console.set_command "reset_with count: 100"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -  =end
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
    +- Inside source: true
    +*** True Line Result
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~
    +- Inside source: true
    +*** True Line Result
    +      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
    +** Processing line: ~      args.outputs.static_sprites << args.state.stars~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.static_sprites << args.state.stars
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This sample app demonstrates how hashes can be used to output different kinds of objects.~
    +** Processing line: ~    # update~
     - Inside source: true
     *** True Line Result
    -  # This sample app demonstrates how hashes can be used to output different kinds of objects.
    +    # update
    +** Processing line: ~    args.state.stars.each(&:move)~
    +- Inside source: true
    +*** True Line Result
    +    args.state.stars.each(&:move)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~    # render~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.angle ||= 0 # initializes angle to 0~
    +    # render
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -    args.state.angle ||= 0 # initializes angle to 0
    -** Processing line: ~    args.state.angle  += 1 # increments angle by 1 every frame (60 times a second)~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -    args.state.angle  += 1 # increments angle by 1 every frame (60 times a second)
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs sprite using a hash~
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -    # Outputs sprite using a hash
    -** Processing line: ~    args.outputs.sprites << {~
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << {
    -** Processing line: ~      x: 30,                          # sprite position~
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -      x: 30,                          # sprite position
    -** Processing line: ~      y: 550,~
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
     - Inside source: true
     *** True Line Result
    -      y: 550,
    -** Processing line: ~      w: 128,                         # sprite size~
    +    $gtk.args.state.star_count = count
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      w: 128,                         # sprite size
    -** Processing line: ~      h: 101,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      h: 101,
    -** Processing line: ~      path: "dragonruby.png",         # image path~
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Performance - Static Sprites As Classes With Custom Drawing - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Performance - Static Sprites As Classes With Custom Drawing - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      path: "dragonruby.png",         # image path
    -** Processing line: ~      angle: args.state.angle,        # angle~
    +  # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb
    +** Processing line: ~  # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.~
     - Inside source: true
     *** True Line Result
    -      angle: args.state.angle,        # angle
    -** Processing line: ~      a: 255,                         # alpha (transparency)~
    +  # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.
    +** Processing line: ~  # is the fastest approach. This is comparable to what other game engines set as the default behavior.~
     - Inside source: true
     *** True Line Result
    -      a: 255,                         # alpha (transparency)
    -** Processing line: ~      r: 255,                         # color saturation~
    +  # is the fastest approach. This is comparable to what other game engines set as the default behavior.
    +** Processing line: ~  # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing~
     - Inside source: true
     *** True Line Result
    -      r: 255,                         # color saturation
    -** Processing line: ~      g: 255,~
    +  # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing
    +** Processing line: ~  # functional/data-oriented practices.~
     - Inside source: true
     *** True Line Result
    -      g: 255,
    -** Processing line: ~      b: 255,~
    +  # functional/data-oriented practices.
    +** Processing line: ~  class Star~
     - Inside source: true
     *** True Line Result
    -      b: 255,
    -** Processing line: ~      tile_x:  0,                     # sprite sub division/tile~
    +  class Star
    +** Processing line: ~    def initialize grid~
     - Inside source: true
     *** True Line Result
    -      tile_x:  0,                     # sprite sub division/tile
    -** Processing line: ~      tile_y:  0,~
    +    def initialize grid
    +** Processing line: ~      @grid = grid~
     - Inside source: true
     *** True Line Result
    -      tile_y:  0,
    -** Processing line: ~      tile_w: -1,~
    +      @grid = grid
    +** Processing line: ~      @x = (rand @grid.w) * -1~
     - Inside source: true
     *** True Line Result
    -      tile_w: -1,
    -** Processing line: ~      tile_h: -1,~
    +      @x = (rand @grid.w) * -1
    +** Processing line: ~      @y = (rand @grid.h) * -1~
     - Inside source: true
     *** True Line Result
    -      tile_h: -1,
    -** Processing line: ~      flip_vertically: false,         # don't flip sprite~
    +      @y = (rand @grid.h) * -1
    +** Processing line: ~      @w    = 4~
     - Inside source: true
     *** True Line Result
    -      flip_vertically: false,         # don't flip sprite
    -** Processing line: ~      flip_horizontally: false,~
    +      @w    = 4
    +** Processing line: ~      @h    = 4~
     - Inside source: true
     *** True Line Result
    -      flip_horizontally: false,
    -** Processing line: ~      angle_anchor_x: 0.5,            # rotation center set to middle~
    +      @h    = 4
    +** Processing line: ~      @s    = 1 + (4.randomize :ratio)~
     - Inside source: true
     *** True Line Result
    -      angle_anchor_x: 0.5,            # rotation center set to middle
    -** Processing line: ~      angle_anchor_y: 0.5~
    +      @s    = 1 + (4.randomize :ratio)
    +** Processing line: ~      @path = 'sprites/tiny-star.png'~
     - Inside source: true
     *** True Line Result
    -      angle_anchor_y: 0.5
    -** Processing line: ~    }~
    +      @path = 'sprites/tiny-star.png'
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    }
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs label using a hash~
    +** Processing line: ~    def move~
     - Inside source: true
     *** True Line Result
    -    # Outputs label using a hash
    -** Processing line: ~    args.outputs.labels << {~
    +    def move
    +** Processing line: ~      @x += @s~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << {
    -** Processing line: ~      x:              200,                 # label position~
    +      @x += @s
    +** Processing line: ~      @y += @s~
     - Inside source: true
     *** True Line Result
    -      x:              200,                 # label position
    -** Processing line: ~      y:              550,~
    +      @y += @s
    +** Processing line: ~      @x = (rand @grid.w) * -1 if @x > @grid.right~
     - Inside source: true
     *** True Line Result
    -      y:              550,
    -** Processing line: ~      text:           "dragonruby",        # label text~
    +      @x = (rand @grid.w) * -1 if @x > @grid.right
    +** Processing line: ~      @y = (rand @grid.h) * -1 if @y > @grid.top~
     - Inside source: true
     *** True Line Result
    -      text:           "dragonruby",        # label text
    -** Processing line: ~      size_enum:      2,~
    +      @y = (rand @grid.h) * -1 if @y > @grid.top
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      size_enum:      2,
    -** Processing line: ~      alignment_enum: 1,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      alignment_enum: 1,
    -** Processing line: ~      r:              155,                 # color saturation~
    +
    +** Processing line: ~    # if the object that is in args.outputs.sprites (or static_sprites)~
     - Inside source: true
     *** True Line Result
    -      r:              155,                 # color saturation
    -** Processing line: ~      g:              50,~
    +    # if the object that is in args.outputs.sprites (or static_sprites)
    +** Processing line: ~    # respond_to? :draw_override, then the method is invoked giving you~
     - Inside source: true
     *** True Line Result
    -      g:              50,
    -** Processing line: ~      b:              50,~
    +    # respond_to? :draw_override, then the method is invoked giving you
    +** Processing line: ~    # access to the class used to draw to the canvas.~
     - Inside source: true
     *** True Line Result
    -      b:              50,
    -** Processing line: ~      a:              255,                 # transparency~
    +    # access to the class used to draw to the canvas.
    +** Processing line: ~    def draw_override ffi_draw~
     - Inside source: true
     *** True Line Result
    -      a:              255,                 # transparency
    -** Processing line: ~      font:           "fonts/manaspc.ttf"  # font style; without mentioned file, label won't output correctly~
    +    def draw_override ffi_draw
    +** Processing line: ~      # first move then draw~
     - Inside source: true
     *** True Line Result
    -      font:           "fonts/manaspc.ttf"  # font style; without mentioned file, label won't output correctly
    -** Processing line: ~    }~
    +      # first move then draw
    +** Processing line: ~      move~
     - Inside source: true
     *** True Line Result
    -    }
    +      move
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs solid using a hash~
    +** Processing line: ~      # The argument order for ffi.draw_sprite is:~
     - Inside source: true
     *** True Line Result
    -    # Outputs solid using a hash
    -** Processing line: ~    # [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]~
    +      # The argument order for ffi.draw_sprite is:
    +** Processing line: ~      # x, y, w, h, path~
     - Inside source: true
     *** True Line Result
    -    # [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
    -** Processing line: ~    args.outputs.solids << {~
    +      # x, y, w, h, path
    +** Processing line: ~      ffi_draw.draw_sprite @x, @y, @w, @h, @path~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << {
    -** Processing line: ~      x: 400,                         # position~
    +      ffi_draw.draw_sprite @x, @y, @w, @h, @path
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      x: 400,                         # position
    -** Processing line: ~      y: 550,~
    +
    +** Processing line: ~      # The argument order for ffi_draw.draw_sprite_2 is (pass in nil for default value):~
     - Inside source: true
     *** True Line Result
    -      y: 550,
    -** Processing line: ~      w: 160,                         # size~
    +      # The argument order for ffi_draw.draw_sprite_2 is (pass in nil for default value):
    +** Processing line: ~      # x, y, w, h, path,~
     - Inside source: true
     *** True Line Result
    -      w: 160,                         # size
    -** Processing line: ~      h:  90,~
    +      # x, y, w, h, path,
    +** Processing line: ~      # angle, alpha~
     - Inside source: true
     *** True Line Result
    -      h:  90,
    -** Processing line: ~      r: 120,                         # color saturation~
    +      # angle, alpha
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      r: 120,                         # color saturation
    -** Processing line: ~      g:  50,~
    +
    +** Processing line: ~      # The argument order for ffi_draw.draw_sprite_3 is:~
     - Inside source: true
     *** True Line Result
    -      g:  50,
    -** Processing line: ~      b:  50,~
    +      # The argument order for ffi_draw.draw_sprite_3 is:
    +** Processing line: ~      # x, y, w, h,~
     - Inside source: true
     *** True Line Result
    -      b:  50,
    -** Processing line: ~      a: 255                          # transparency~
    +      # x, y, w, h,
    +** Processing line: ~      # path,~
     - Inside source: true
     *** True Line Result
    -      a: 255                          # transparency
    -** Processing line: ~    }~
    +      # path,
    +** Processing line: ~      # angle,~
     - Inside source: true
     *** True Line Result
    -    }
    +      # angle,
    +** Processing line: ~      # alpha, red_saturation, green_saturation, blue_saturation~
    +- Inside source: true
    +*** True Line Result
    +      # alpha, red_saturation, green_saturation, blue_saturation
    +** Processing line: ~      # tile_x, tile_y, tile_w, tile_h,~
    +- Inside source: true
    +*** True Line Result
    +      # tile_x, tile_y, tile_w, tile_h,
    +** Processing line: ~      # flip_horizontally, flip_vertically,~
    +- Inside source: true
    +*** True Line Result
    +      # flip_horizontally, flip_vertically,
    +** Processing line: ~      # angle_anchor_x, angle_anchor_y,~
    +- Inside source: true
    +*** True Line Result
    +      # angle_anchor_x, angle_anchor_y,
    +** Processing line: ~      # source_x, source_y, source_w, source_h~
    +- Inside source: true
    +*** True Line Result
    +      # source_x, source_y, source_w, source_h
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs border using a hash~
    +** Processing line: ~      # The argument order for ffi_draw.draw_sprite_4 is:~
     - Inside source: true
     *** True Line Result
    -    # Outputs border using a hash
    -** Processing line: ~    # Same parameters as a solid~
    +      # The argument order for ffi_draw.draw_sprite_4 is:
    +** Processing line: ~      # x, y, w, h,~
     - Inside source: true
     *** True Line Result
    -    # Same parameters as a solid
    -** Processing line: ~    args.outputs.borders << {~
    +      # x, y, w, h,
    +** Processing line: ~      # path,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << {
    -** Processing line: ~      x: 600,~
    +      # path,
    +** Processing line: ~      # angle,~
     - Inside source: true
     *** True Line Result
    -      x: 600,
    -** Processing line: ~      y: 550,~
    +      # angle,
    +** Processing line: ~      # alpha, red_saturation, green_saturation, blue_saturation~
     - Inside source: true
     *** True Line Result
    -      y: 550,
    -** Processing line: ~      w: 160,~
    +      # alpha, red_saturation, green_saturation, blue_saturation
    +** Processing line: ~      # tile_x, tile_y, tile_w, tile_h,~
     - Inside source: true
     *** True Line Result
    -      w: 160,
    -** Processing line: ~      h:  90,~
    +      # tile_x, tile_y, tile_w, tile_h,
    +** Processing line: ~      # flip_horizontally, flip_vertically,~
     - Inside source: true
     *** True Line Result
    -      h:  90,
    -** Processing line: ~      r: 120,~
    +      # flip_horizontally, flip_vertically,
    +** Processing line: ~      # angle_anchor_x, angle_anchor_y,~
     - Inside source: true
     *** True Line Result
    -      r: 120,
    -** Processing line: ~      g:  50,~
    +      # angle_anchor_x, angle_anchor_y,
    +** Processing line: ~      # source_x, source_y, source_w, source_h,~
     - Inside source: true
     *** True Line Result
    -      g:  50,
    -** Processing line: ~      b:  50,~
    +      # source_x, source_y, source_w, source_h,
    +** Processing line: ~      # blendmode_enum~
     - Inside source: true
     *** True Line Result
    -      b:  50,
    -** Processing line: ~      a: 255~
    +      # blendmode_enum
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      a: 255
    -** Processing line: ~    }~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    }
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs line using a hash~
    +** Processing line: ~  # calls methods needed for game to run properly~
     - Inside source: true
     *** True Line Result
    -    # Outputs line using a hash
    -** Processing line: ~    args.outputs.lines << {~
    +  # calls methods needed for game to run properly
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.lines << {
    -** Processing line: ~      x:  900,                        # starting position~
    +  def tick args
    +** Processing line: ~    # sets console command when sample app initially opens~
     - Inside source: true
     *** True Line Result
    -      x:  900,                        # starting position
    -** Processing line: ~      y:  550,~
    +    # sets console command when sample app initially opens
    +** Processing line: ~    if Kernel.global_tick_count == 0~
     - Inside source: true
     *** True Line Result
    -      y:  550,
    -** Processing line: ~      x2: 1200,                       # ending position~
    +    if Kernel.global_tick_count == 0
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -      x2: 1200,                       # ending position
    -** Processing line: ~      y2: 550,~
    +      puts ""
    +** Processing line: ~      puts ""~
     - Inside source: true
     *** True Line Result
    -      y2: 550,
    -** Processing line: ~      r:  120,                        # color saturation~
    +      puts ""
    +** Processing line: ~      puts "========================================================="~
     - Inside source: true
     *** True Line Result
    -      r:  120,                        # color saturation
    -** Processing line: ~      g:   50,~
    +      puts "========================================================="
    +** Processing line: ~      puts "* INFO: Static Sprites, Classes, Draw Override"~
     - Inside source: true
     *** True Line Result
    -      g:   50,
    -** Processing line: ~      b:   50,~
    +      puts "* INFO: Static Sprites, Classes, Draw Override"
    +** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
     - Inside source: true
     *** True Line Result
    -      b:   50,
    -** Processing line: ~      a:  255                         # transparency~
    +      puts "* INFO: Please specify the number of sprites to render."
    +** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
     - Inside source: true
     *** True Line Result
    -      a:  255                         # transparency
    -** Processing line: ~    }~
    +      args.gtk.console.set_command "reset_with count: 100"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    }
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs sprite as a primitive using a hash~
    +** Processing line: ~    # init~
     - Inside source: true
     *** True Line Result
    -    # Outputs sprite as a primitive using a hash
    -** Processing line: ~    args.outputs.primitives << {~
    +    # init
    +** Processing line: ~    if args.state.tick_count == 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << {
    -** Processing line: ~      x: 30,                          # position~
    +    if args.state.tick_count == 0
    +** Processing line: ~      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~
     - Inside source: true
     *** True Line Result
    -      x: 30,                          # position
    -** Processing line: ~      y: 200,~
    +      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
    +** Processing line: ~      args.outputs.static_sprites << args.state.stars~
     - Inside source: true
     *** True Line Result
    -      y: 200,
    -** Processing line: ~      w: 128,                         # size~
    +      args.outputs.static_sprites << args.state.stars
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      w: 128,                         # size
    -** Processing line: ~      h: 101,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      h: 101,
    -** Processing line: ~      path: "dragonruby.png",         # image path~
    +
    +** Processing line: ~    # render framerate~
     - Inside source: true
     *** True Line Result
    -      path: "dragonruby.png",         # image path
    -** Processing line: ~      angle: args.state.angle,        # angle~
    +    # render framerate
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -      angle: args.state.angle,        # angle
    -** Processing line: ~      a: 255,                         # transparency~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
     - Inside source: true
     *** True Line Result
    -      a: 255,                         # transparency
    -** Processing line: ~      r: 255,                         # color saturation~
    +    args.outputs.primitives << args.gtk.current_framerate_primitives
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      r: 255,                         # color saturation
    -** Processing line: ~      g: 255,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      g: 255,
    -** Processing line: ~      b: 255,~
    +
    +** Processing line: ~  # resets game, and assigns star count given by user~
     - Inside source: true
     *** True Line Result
    -      b: 255,
    -** Processing line: ~      tile_x:  0,                     # sprite sub division/tile~
    +  # resets game, and assigns star count given by user
    +** Processing line: ~  def reset_with count: count~
     - Inside source: true
     *** True Line Result
    -      tile_x:  0,                     # sprite sub division/tile
    -** Processing line: ~      tile_y:  0,~
    +  def reset_with count: count
    +** Processing line: ~    $gtk.reset~
     - Inside source: true
     *** True Line Result
    -      tile_y:  0,
    -** Processing line: ~      tile_w: -1,~
    +    $gtk.reset
    +** Processing line: ~    $gtk.args.state.star_count = count~
     - Inside source: true
     *** True Line Result
    -      tile_w: -1,
    -** Processing line: ~      tile_h: -1,~
    +    $gtk.args.state.star_count = count
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Performance - Collision Limits - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Performance - Collision Limits - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/09_performance/07_collision_limits/app/main.rb~
     - Inside source: true
     *** True Line Result
    -      tile_h: -1,
    -** Processing line: ~      flip_vertically: false,         # don't flip~
    +  # ./samples/09_performance/07_collision_limits/app/main.rb
    +** Processing line: ~  =begin~
     - Inside source: true
     *** True Line Result
    -      flip_vertically: false,         # don't flip
    -** Processing line: ~      flip_horizontally: false,~
    +  =begin
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      flip_horizontally: false,
    -** Processing line: ~      angle_anchor_x: 0.5,            # rotation center set to middle~
    +
    +** Processing line: ~   Reminders:~
     - Inside source: true
     *** True Line Result
    -      angle_anchor_x: 0.5,            # rotation center set to middle
    -** Processing line: ~      angle_anchor_y: 0.5~
    +   Reminders:
    +** Processing line: ~   - find_all: Finds all elements of a collection that meet certain requirements.~
     - Inside source: true
     *** True Line Result
    -      angle_anchor_y: 0.5
    -** Processing line: ~    }.sprite~
    +   - find_all: Finds all elements of a collection that meet certain requirements.
    +** Processing line: ~     In this sample app, we're finding all bodies that intersect with the center body.~
     - Inside source: true
     *** True Line Result
    -    }.sprite
    +     In this sample app, we're finding all bodies that intersect with the center body.
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs label as primitive using a hash~
    +** Processing line: ~   - args.outputs.solids: An array. The values generate a solid.~
     - Inside source: true
     *** True Line Result
    -    # Outputs label as primitive using a hash
    -** Processing line: ~    args.outputs.primitives << {~
    +   - args.outputs.solids: An array. The values generate a solid.
    +** Processing line: ~     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << {
    -** Processing line: ~      x:         200,                 # position~
    +     The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]
    +** Processing line: ~     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~
     - Inside source: true
     *** True Line Result
    -      x:         200,                 # position
    -** Processing line: ~      y:         200,~
    +     For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y:         200,
    -** Processing line: ~      text:      "dragonruby",        # text~
    +
    +** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
     - Inside source: true
     *** True Line Result
    -      text:      "dragonruby",        # text
    -** Processing line: ~      size:      2,~
    +   - args.outputs.labels: An array. The values generate a label.
    +** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
     - Inside source: true
     *** True Line Result
    -      size:      2,
    -** Processing line: ~      alignment: 1,~
    +     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    +** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
     - Inside source: true
     *** True Line Result
    -      alignment: 1,
    -** Processing line: ~      r:         155,                 # color saturation~
    +     For more information about labels, go to mygame/documentation/02-labels.md.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      r:         155,                 # color saturation
    -** Processing line: ~      g:         50,~
    +
    +** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~
     - Inside source: true
     *** True Line Result
    -      g:         50,
    -** Processing line: ~      b:         50,~
    +   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      b:         50,
    -** Processing line: ~      a:         255,                 # transparency~
    +
    +** Processing line: ~  =end~
     - Inside source: true
     *** True Line Result
    -      a:         255,                 # transparency
    -** Processing line: ~      font:      "fonts/manaspc.ttf"  # font style~
    +  =end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      font:      "fonts/manaspc.ttf"  # font style
    -** Processing line: ~    }.label~
    +
    +** Processing line: ~  # This code demonstrates moving objects that loop around once they exceed the scope of the screen,~
    +- Inside source: true
    +*** True Line Result
    +  # This code demonstrates moving objects that loop around once they exceed the scope of the screen,
    +** Processing line: ~  # which has dimensions of 1280 by 720, and also detects collisions between objects called "bodies".~
     - Inside source: true
     *** True Line Result
    -    }.label
    +  # which has dimensions of 1280 by 720, and also detects collisions between objects called "bodies".
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs solid as primitive using a hash~
    +** Processing line: ~  def body_count num~
     - Inside source: true
     *** True Line Result
    -    # Outputs solid as primitive using a hash
    -** Processing line: ~    args.outputs.primitives << {~
    +  def body_count num
    +** Processing line: ~    $gtk.args.state.other_bodies = num.map { [1280 * rand, 720 * rand, 10, 10] } # other_bodies set using num collection~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << {
    -** Processing line: ~      x: 400,                         # position~
    +    $gtk.args.state.other_bodies = num.map { [1280 * rand, 720 * rand, 10, 10] } # other_bodies set using num collection
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      x: 400,                         # position
    -** Processing line: ~      y: 200,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: 200,
    -** Processing line: ~      w: 160,                         # size~
    +
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -      w: 160,                         # size
    -** Processing line: ~      h:  90,~
    +  def tick args
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      h:  90,
    -** Processing line: ~      r: 120,                         # color saturation~
    +
    +** Processing line: ~    # Center body's values are set using an array~
     - Inside source: true
     *** True Line Result
    -      r: 120,                         # color saturation
    -** Processing line: ~      g:  50,~
    +    # Center body's values are set using an array
    +** Processing line: ~    # Map is used to set values of 2000 other bodies~
     - Inside source: true
     *** True Line Result
    -      g:  50,
    -** Processing line: ~      b:  50,~
    +    # Map is used to set values of 2000 other bodies
    +** Processing line: ~    # All bodies that intersect with center body are stored in collisions collection~
     - Inside source: true
     *** True Line Result
    -      b:  50,
    -** Processing line: ~      a: 255                          # transparency~
    +    # All bodies that intersect with center body are stored in collisions collection
    +** Processing line: ~    args.state.center_body  ||= [640 - 100, 360 - 100, 200, 200] # calculations done to place body in center~
     - Inside source: true
     *** True Line Result
    -      a: 255                          # transparency
    -** Processing line: ~    }.solid~
    +    args.state.center_body  ||= [640 - 100, 360 - 100, 200, 200] # calculations done to place body in center
    +** Processing line: ~    args.state.other_bodies ||= 2000.map { [1280 * rand, 720 * rand, 10, 10] } # 2000 bodies given random position on screen~
     - Inside source: true
     *** True Line Result
    -    }.solid
    +    args.state.other_bodies ||= 2000.map { [1280 * rand, 720 * rand, 10, 10] } # 2000 bodies given random position on screen
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs border as primitive using a hash~
    -- Inside source: true
    -*** True Line Result
    -    # Outputs border as primitive using a hash
    -** Processing line: ~    # Same parameters as solid~
    -- Inside source: true
    -*** True Line Result
    -    # Same parameters as solid
    -** Processing line: ~    args.outputs.primitives << {~
    +** Processing line: ~    # finds all bodies that intersect with center body, stores them in collisions~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << {
    -** Processing line: ~      x: 600,                         # position~
    +    # finds all bodies that intersect with center body, stores them in collisions
    +** Processing line: ~    collisions = args.state.other_bodies.find_all { |b| b.intersect_rect? args.state.center_body }~
     - Inside source: true
     *** True Line Result
    -      x: 600,                         # position
    -** Processing line: ~      y: 200,~
    +    collisions = args.state.other_bodies.find_all { |b| b.intersect_rect? args.state.center_body }
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: 200,
    -** Processing line: ~      w: 160,                         # size~
    +
    +** Processing line: ~    args.borders << args.state.center_body # outputs center body as a black border~
     - Inside source: true
     *** True Line Result
    -      w: 160,                         # size
    -** Processing line: ~      h:  90,~
    +    args.borders << args.state.center_body # outputs center body as a black border
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      h:  90,
    -** Processing line: ~      r: 120,                         # color saturation~
    +
    +** Processing line: ~    # transparency changes based on number of collisions; the more collisions, the redder (more transparent) the box becomes~
     - Inside source: true
     *** True Line Result
    -      r: 120,                         # color saturation
    -** Processing line: ~      g:  50,~
    +    # transparency changes based on number of collisions; the more collisions, the redder (more transparent) the box becomes
    +** Processing line: ~    args.solids  << [args.state.center_body, 255, 0, 0, collisions.length * 5] # center body is red solid~
     - Inside source: true
     *** True Line Result
    -      g:  50,
    -** Processing line: ~      b:  50,~
    +    args.solids  << [args.state.center_body, 255, 0, 0, collisions.length * 5] # center body is red solid
    +** Processing line: ~    args.solids  << args.state.other_bodies # other bodies are output as (black) solids, as well~
     - Inside source: true
     *** True Line Result
    -      b:  50,
    -** Processing line: ~      a: 255                          # transparency~
    +    args.solids  << args.state.other_bodies # other bodies are output as (black) solids, as well
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      a: 255                          # transparency
    -** Processing line: ~    }.border~
    +
    +** Processing line: ~    args.labels  << [10, 30, args.gtk.current_framerate] # outputs frame rate in bottom left corner~
     - Inside source: true
     *** True Line Result
    -    }.border
    +    args.labels  << [10, 30, args.gtk.current_framerate] # outputs frame rate in bottom left corner
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Outputs line as primitive using a hash~
    -- Inside source: true
    -*** True Line Result
    -    # Outputs line as primitive using a hash
    -** Processing line: ~    args.outputs.primitives << {~
    +** Processing line: ~    # Bodies are returned to bottom left corner if positions exceed scope of screen~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << {
    -** Processing line: ~      x:  900,                        # starting position~
    +    # Bodies are returned to bottom left corner if positions exceed scope of screen
    +** Processing line: ~    args.state.other_bodies.each do |b| # for each body in the other_bodies collection~
     - Inside source: true
     *** True Line Result
    -      x:  900,                        # starting position
    -** Processing line: ~      y:  200,~
    +    args.state.other_bodies.each do |b| # for each body in the other_bodies collection
    +** Processing line: ~      b.x += 5 # x and y are both incremented by 5~
     - Inside source: true
     *** True Line Result
    -      y:  200,
    -** Processing line: ~      x2: 1200,                       # ending position~
    +      b.x += 5 # x and y are both incremented by 5
    +** Processing line: ~      b.y += 5~
     - Inside source: true
     *** True Line Result
    -      x2: 1200,                       # ending position
    -** Processing line: ~      y2: 200,~
    +      b.y += 5
    +** Processing line: ~      b.x = 0 if b.x > 1280 # x becomes 0 if star exceeds scope of screen (goes too far right)~
     - Inside source: true
     *** True Line Result
    -      y2: 200,
    -** Processing line: ~      r:  120,                        # color saturation~
    +      b.x = 0 if b.x > 1280 # x becomes 0 if star exceeds scope of screen (goes too far right)
    +** Processing line: ~      b.y = 0 if b.y > 720 # y becomes 0 if star exceeds scope of screen (goes too far up)~
     - Inside source: true
     *** True Line Result
    -      r:  120,                        # color saturation
    -** Processing line: ~      g:   50,~
    +      b.y = 0 if b.y > 720 # y becomes 0 if star exceeds scope of screen (goes too far up)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      g:   50,
    -** Processing line: ~      b:   50,~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      b:   50,
    -** Processing line: ~      a:  255                         # transparency~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      a:  255                         # transparency
    -** Processing line: ~    }.line~
    +
    +** Processing line: ~  # Resets the game.~
     - Inside source: true
     *** True Line Result
    -    }.line
    -** Processing line: ~  end~
    +  # Resets the game.
    +** Processing line: ~  $gtk.reset~
     - Inside source: true
     *** True Line Result
    -  end
    +  $gtk.reset
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -49448,122 +57731,122 @@ 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 - Pixel Arrays - main.rb~
    +** Processing line: ~*** Advanced Debugging - Trace Debugging - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Pixel Arrays - main.rb
    +*** Advanced Debugging - Trace Debugging - 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/06_pixel_arrays/app/main.rb~
    +** Processing line: ~  # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/06_pixel_arrays/app/main.rb
    -** Processing line: ~  $gtk.reset~
    +  # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb
    +** Processing line: ~  class Game~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset
    -** Processing line: ~~
    +  class Game
    +** Processing line: ~    attr_gtk~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +    attr_gtk
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.posinc ||= 1~
    +
    +** Processing line: ~    def method1 num~
     - Inside source: true
     *** True Line Result
    -    args.state.posinc ||= 1
    -** Processing line: ~    args.state.pos ||= 0~
    +    def method1 num
    +** Processing line: ~      method2 num~
     - Inside source: true
     *** True Line Result
    -    args.state.pos ||= 0
    -** Processing line: ~    args.state.rotation ||= 0~
    +      method2 num
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.rotation ||= 0
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    dimension = 10  # keep it small and let the GPU scale it when rendering the sprite.~
    +** Processing line: ~    def method2 num~
     - Inside source: true
     *** True Line Result
    -    dimension = 10  # keep it small and let the GPU scale it when rendering the sprite.
    -** Processing line: ~~
    +    def method2 num
    +** Processing line: ~      method3 num~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Set up our "scanner" pixel array and fill it with black pixels.~
    +      method3 num
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    # Set up our "scanner" pixel array and fill it with black pixels.
    -** Processing line: ~    args.pixel_array(:scanner).width = dimension~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.pixel_array(:scanner).width = dimension
    -** Processing line: ~    args.pixel_array(:scanner).height = dimension~
    +
    +** Processing line: ~    def method3 num~
     - Inside source: true
     *** True Line Result
    -    args.pixel_array(:scanner).height = dimension
    -** Processing line: ~    args.pixel_array(:scanner).pixels.fill(0xFF000000, 0, dimension * dimension)  # black, full alpha~
    +    def method3 num
    +** Processing line: ~      method4 num~
     - Inside source: true
     *** True Line Result
    -    args.pixel_array(:scanner).pixels.fill(0xFF000000, 0, dimension * dimension)  # black, full alpha
    -** Processing line: ~~
    +      method4 num
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Draw a green line that bounces up and down the sprite.~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Draw a green line that bounces up and down the sprite.
    -** Processing line: ~    args.pixel_array(:scanner).pixels.fill(0xFF00FF00, dimension * args.state.pos, dimension)  # green, full alpha~
    +
    +** Processing line: ~    def method4 num~
     - Inside source: true
     *** True Line Result
    -    args.pixel_array(:scanner).pixels.fill(0xFF00FF00, dimension * args.state.pos, dimension)  # green, full alpha
    -** Processing line: ~~
    +    def method4 num
    +** Processing line: ~      if num == 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Adjust position for next frame.~
    +      if num == 1
    +** Processing line: ~        puts "UNLUCKY #{num}."~
     - Inside source: true
     *** True Line Result
    -    # Adjust position for next frame.
    -** Processing line: ~    args.state.pos += args.state.posinc~
    +        puts "UNLUCKY #{num}."
    +** Processing line: ~        state.unlucky_count += 1~
     - Inside source: true
     *** True Line Result
    -    args.state.pos += args.state.posinc
    -** Processing line: ~    if args.state.posinc > 0 && args.state.pos >= dimension~
    +        state.unlucky_count += 1
    +** Processing line: ~        if state.unlucky_count > 3~
     - Inside source: true
     *** True Line Result
    -    if args.state.posinc > 0 && args.state.pos >= dimension
    -** Processing line: ~      args.state.posinc = -1~
    +        if state.unlucky_count > 3
    +** Processing line: ~          raise "NAT 1 finally occurred. Check app/trace.txt for all method invocation history."~
     - Inside source: true
     *** True Line Result
    -      args.state.posinc = -1
    -** Processing line: ~      args.state.pos = dimension - 1~
    +          raise "NAT 1 finally occurred. Check app/trace.txt for all method invocation history."
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -      args.state.pos = dimension - 1
    -** Processing line: ~    elsif args.state.posinc < 0 && args.state.pos < 0~
    +        end
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -    elsif args.state.posinc < 0 && args.state.pos < 0
    -** Processing line: ~      args.state.posinc = 1~
    +      else
    +** Processing line: ~        puts "LUCKY #{num}."~
     - Inside source: true
     *** True Line Result
    -      args.state.posinc = 1
    -** Processing line: ~      args.state.pos = 1~
    +        puts "LUCKY #{num}."
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      args.state.pos = 1
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -49572,54 +57855,74 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # New/changed pixel arrays get uploaded to the GPU before we render~
    +** Processing line: ~    def tick~
     - Inside source: true
     *** True Line Result
    -    # New/changed pixel arrays get uploaded to the GPU before we render
    -** Processing line: ~    #  anything. At that point, they can be scaled, rotated, and otherwise~
    +    def tick
    +** Processing line: ~      state.roll_history ||= []~
     - Inside source: true
     *** True Line Result
    -    #  anything. At that point, they can be scaled, rotated, and otherwise
    -** Processing line: ~    #  used like any other sprite.~
    +      state.roll_history ||= []
    +** Processing line: ~      state.roll_history << rand(20) + 1~
     - Inside source: true
     *** True Line Result
    -    #  used like any other sprite.
    -** Processing line: ~    w = 100~
    +      state.roll_history << rand(20) + 1
    +** Processing line: ~      state.countdown ||= 600~
     - Inside source: true
     *** True Line Result
    -    w = 100
    -** Processing line: ~    h = 100~
    +      state.countdown ||= 600
    +** Processing line: ~      state.countdown  -= 1~
     - Inside source: true
     *** True Line Result
    -    h = 100
    -** Processing line: ~    x = (1280 - w) / 2~
    +      state.countdown  -= 1
    +** Processing line: ~      state.unlucky_count ||= 0~
     - Inside source: true
     *** True Line Result
    -    x = (1280 - w) / 2
    -** Processing line: ~    y = (720 - h) / 2~
    +      state.unlucky_count ||= 0
    +** Processing line: ~      outputs.labels << [640, 360, "A dice roll of 1 will cause an exception.", 0, 1]~
     - Inside source: true
     *** True Line Result
    -    y = (720 - h) / 2
    -** Processing line: ~    args.outputs.background_color = [64, 0, 128]~
    +      outputs.labels << [640, 360, "A dice roll of 1 will cause an exception.", 0, 1]
    +** Processing line: ~      if state.countdown > 0~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [64, 0, 128]
    -** Processing line: ~    args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite~
    +      if state.countdown > 0
    +** Processing line: ~        outputs.labels << [640, 340, "Dice roll countdown: #{state.countdown}", 0, 1]~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite
    -** Processing line: ~    args.state.rotation += 1~
    +        outputs.labels << [640, 340, "Dice roll countdown: #{state.countdown}", 0, 1]
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -    args.state.rotation += 1
    -** Processing line: ~~
    +      else
    +** Processing line: ~        state.attempts ||= 0~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
    +        state.attempts ||= 0
    +** Processing line: ~        state.attempts  += 1~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << args.gtk.current_framerate_primitives
    +        state.attempts  += 1
    +** Processing line: ~        outputs.labels << [640, 340, "ROLLING! #{state.attempts}", 0, 1]~
    +- Inside source: true
    +*** True Line Result
    +        outputs.labels << [640, 340, "ROLLING! #{state.attempts}", 0, 1]
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
    +** Processing line: ~      return if state.countdown > 0~
    +- Inside source: true
    +*** True Line Result
    +      return if state.countdown > 0
    +** Processing line: ~      method1 state.roll_history[-1]~
    +- Inside source: true
    +*** True Line Result
    +      method1 state.roll_history[-1]
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -49628,6 +57931,34 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~  $game = Game.new~
    +- Inside source: true
    +*** True Line Result
    +  $game = Game.new
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~  def tick args~
    +- Inside source: true
    +*** True Line Result
    +  def tick args
    +** Processing line: ~    trace! $game # <------------------- TRACING ENABLED FOR THIS OBJECT~
    +- Inside source: true
    +*** True Line Result
    +    trace! $game # <------------------- TRACING ENABLED FOR THIS OBJECT
    +** Processing line: ~    $game.args = args~
    +- Inside source: true
    +*** True Line Result
    +    $game.args = args
    +** Processing line: ~    $game.tick~
    +- Inside source: true
    +*** True Line Result
    +    $game.tick
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -49640,50 +57971,54 @@ 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 - Splitscreen Camera - main.rb~
    +** Processing line: ~*** Advanced Debugging - Trace Debugging Classes - main.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Splitscreen Camera - main.rb
    +*** Advanced Debugging - Trace Debugging Classes - main.rb
     ** Processing line: ~#+begin_src ruby~
     - Line was identified as the beginning of a code block.
     *** True Line Result
     
     *** True Line Result
     #+begin_src ruby
    -** Processing line: ~  # ./samples/07_advanced_rendering/07_splitscreen_camera/app/main.rb~
    +** Processing line: ~  # ./samples/10_advanced_debugging/02_trace_debugging_classes/app/main.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/07_splitscreen_camera/app/main.rb
    -** Processing line: ~  class CameraMovement~
    +  # ./samples/10_advanced_debugging/02_trace_debugging_classes/app/main.rb
    +** Processing line: ~  class Foobar~
     - Inside source: true
     *** True Line Result
    -  class CameraMovement
    -** Processing line: ~    attr_accessor :state, :inputs, :outputs, :grid~
    +  class Foobar
    +** Processing line: ~    def initialize~
     - Inside source: true
     *** True Line Result
    -    attr_accessor :state, :inputs, :outputs, :grid
    -** Processing line: ~~
    +    def initialize
    +** Processing line: ~      trace! # Trace is added to the constructor.~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #==============================================================================================~
    +      trace! # Trace is added to the constructor.
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Serialize~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #Serialize
    -** Processing line: ~    def serialize~
    +
    +** Processing line: ~    def clicky args~
     - Inside source: true
     *** True Line Result
    -    def serialize
    -** Processing line: ~      {state: state, inputs: inputs, outputs: outputs, grid: grid }~
    +    def clicky args
    +** Processing line: ~      return unless args.inputs.mouse.click~
     - Inside source: true
     *** True Line Result
    -      {state: state, inputs: inputs, outputs: outputs, grid: grid }
    +      return unless args.inputs.mouse.click
    +** Processing line: ~      try_rand rand~
    +- Inside source: true
    +*** True Line Result
    +      try_rand rand
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -49692,1018 +58027,1198 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def inspect~
    +** Processing line: ~    def try_rand num~
     - Inside source: true
     *** True Line Result
    -    def inspect
    -** Processing line: ~      serialize.to_s~
    +    def try_rand num
    +** Processing line: ~      return if num < 0.9~
     - Inside source: true
     *** True Line Result
    -      serialize.to_s
    +      return if num < 0.9
    +** Processing line: ~      raise "Exception finally occurred. Take a look at logs/trace.txt #{num}."~
    +- Inside source: true
    +*** True Line Result
    +      raise "Exception finally occurred. Take a look at logs/trace.txt #{num}."
     ** 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 to_s~
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    def to_s
    -** Processing line: ~      serialize.to_s~
    +  def tick args
    +** Processing line: ~    args.labels << [640, 360, "Start clicking. Eventually an exception will be thrown. Then look at logs/trace.txt.", 0, 1]~
     - Inside source: true
     *** True Line Result
    -      serialize.to_s
    -** Processing line: ~    end~
    +    args.labels << [640, 360, "Start clicking. Eventually an exception will be thrown. Then look at logs/trace.txt.", 0, 1]
    +** Processing line: ~    args.state.foobar = Foobar.new if args.tick_count~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.state.foobar = Foobar.new if args.tick_count
    +** Processing line: ~    return unless args.state.foobar~
    +- Inside source: true
    +*** True Line Result
    +    return unless args.state.foobar
    +** Processing line: ~    args.state.foobar.clicky args~
    +- Inside source: true
    +*** True Line Result
    +    args.state.foobar.clicky args
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #==============================================================================================~
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Advanced Debugging - Unit Tests - benchmark_api_tests.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - benchmark_api_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/benchmark_api_tests.rb~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Tick~
    +  # ./samples/10_advanced_debugging/03_unit_tests/benchmark_api_tests.rb
    +** Processing line: ~  def test_benchmark_api args, assert~
     - Inside source: true
     *** True Line Result
    -    #Tick
    -** Processing line: ~    def tick~
    +  def test_benchmark_api args, assert
    +** Processing line: ~    result = args.gtk.benchmark iterations: 100,~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +    result = args.gtk.benchmark iterations: 100,
    +** Processing line: ~                                only_one: -> () {~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      calc~
    +                                only_one: -> () {
    +** Processing line: ~                                  r = 0~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~      render~
    +                                  r = 0
    +** Processing line: ~                                  (1..100).each do |i|~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      input~
    +                                  (1..100).each do |i|
    +** Processing line: ~                                    r += 1~
     - Inside source: true
     *** True Line Result
    -      input
    -** Processing line: ~    end~
    +                                    r += 1
    +** Processing line: ~                                  end~
     - Inside source: true
     *** True Line Result
    -    end
    +                                  end
    +** Processing line: ~                                }~
    +- Inside source: true
    +*** True Line Result
    +                                }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #==============================================================================================~
    +** Processing line: ~    assert.equal! result.first_place.name, :only_one~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Default functions~
    +    assert.equal! result.first_place.name, :only_one
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    #Default functions
    -** Processing line: ~    def defaults~
    +
    +** Processing line: ~    result = args.gtk.benchmark iterations: 100,~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      outputs[:scene].background_color = [0,0,0]~
    +    result = args.gtk.benchmark iterations: 100,
    +** Processing line: ~                                iterations_100: -> () {~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].background_color = [0,0,0]
    -** Processing line: ~      state.trauma ||= 0.0~
    +                                iterations_100: -> () {
    +** Processing line: ~                                  r = 0~
     - Inside source: true
     *** True Line Result
    -      state.trauma ||= 0.0
    -** Processing line: ~      state.trauma_power ||= 2~
    +                                  r = 0
    +** Processing line: ~                                  (1..100).each do |i|~
     - Inside source: true
     *** True Line Result
    -      state.trauma_power ||= 2
    -** Processing line: ~      state.player_cyan ||= new_player_cyan~
    +                                  (1..100).each do |i|
    +** Processing line: ~                                    r += 1~
     - Inside source: true
     *** True Line Result
    -      state.player_cyan ||= new_player_cyan
    -** Processing line: ~      state.player_magenta ||= new_player_magenta~
    +                                    r += 1
    +** Processing line: ~                                  end~
     - Inside source: true
     *** True Line Result
    -      state.player_magenta ||= new_player_magenta
    -** Processing line: ~      state.camera_magenta ||= new_camera_magenta~
    +                                  end
    +** Processing line: ~                                },~
     - Inside source: true
     *** True Line Result
    -      state.camera_magenta ||= new_camera_magenta
    -** Processing line: ~      state.camera_cyan ||= new_camera_cyan~
    +                                },
    +** Processing line: ~                                iterations_50: -> () {~
     - Inside source: true
     *** True Line Result
    -      state.camera_cyan ||= new_camera_cyan
    -** Processing line: ~      state.camera_center ||= new_camera_center~
    +                                iterations_50: -> () {
    +** Processing line: ~                                  r = 0~
     - Inside source: true
     *** True Line Result
    -      state.camera_center ||= new_camera_center
    -** Processing line: ~      state.room ||= new_room~
    +                                  r = 0
    +** Processing line: ~                                  (1..50).each do |i|~
     - Inside source: true
     *** True Line Result
    -      state.room ||= new_room
    -** Processing line: ~    end~
    +                                  (1..50).each do |i|
    +** Processing line: ~                                    r += 1~
     - Inside source: true
     *** True Line Result
    -    end
    +                                    r += 1
    +** 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: ~    def default_player x, y, w, h, sprite_path~
    +** Processing line: ~    assert.equal! result.first_place.name, :iterations_50~
     - Inside source: true
     *** True Line Result
    -    def default_player x, y, w, h, sprite_path
    -** Processing line: ~      state.new_entity(:player,~
    +    assert.equal! result.first_place.name, :iterations_50
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      state.new_entity(:player,
    -** Processing line: ~                       { x: x,~
    +
    +** Processing line: ~    result = args.gtk.benchmark iterations: 1,~
     - Inside source: true
     *** True Line Result
    -                       { x: x,
    -** Processing line: ~                         y: y,~
    +    result = args.gtk.benchmark iterations: 1,
    +** Processing line: ~                                iterations_100: -> () {~
     - Inside source: true
     *** True Line Result
    -                         y: y,
    -** Processing line: ~                         dy: 0,~
    +                                iterations_100: -> () {
    +** Processing line: ~                                  r = 0~
     - Inside source: true
     *** True Line Result
    -                         dy: 0,
    -** Processing line: ~                         dx: 0,~
    +                                  r = 0
    +** Processing line: ~                                  (1..100).each do |i|~
     - Inside source: true
     *** True Line Result
    -                         dx: 0,
    -** Processing line: ~                         w: w,~
    +                                  (1..100).each do |i|
    +** Processing line: ~                                    r += 1~
     - Inside source: true
     *** True Line Result
    -                         w: w,
    -** Processing line: ~                         h: h,~
    +                                    r += 1
    +** Processing line: ~                                  end~
     - Inside source: true
     *** True Line Result
    -                         h: h,
    -** Processing line: ~                         damage: 0,~
    +                                  end
    +** Processing line: ~                                },~
     - Inside source: true
     *** True Line Result
    -                         damage: 0,
    -** Processing line: ~                         dead: false,~
    +                                },
    +** Processing line: ~                                iterations_50: -> () {~
     - Inside source: true
     *** True Line Result
    -                         dead: false,
    -** Processing line: ~                         orientation: "down",~
    +                                iterations_50: -> () {
    +** Processing line: ~                                  r = 0~
     - Inside source: true
     *** True Line Result
    -                         orientation: "down",
    -** Processing line: ~                         max_alpha: 255,~
    +                                  r = 0
    +** Processing line: ~                                  (1..50).each do |i|~
     - Inside source: true
     *** True Line Result
    -                         max_alpha: 255,
    -** Processing line: ~                         sprite_path: sprite_path})~
    +                                  (1..50).each do |i|
    +** Processing line: ~                                    r += 1~
     - Inside source: true
     *** True Line Result
    -                         sprite_path: sprite_path})
    -** Processing line: ~    end~
    +                                    r += 1
    +** Processing line: ~                                  end~
     - Inside source: true
     *** True Line Result
    -    end
    +                                  end
    +** Processing line: ~                                }~
    +- Inside source: true
    +*** True Line Result
    +                                }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def default_floor_tile x, y, w, h, sprite_path~
    +** Processing line: ~    assert.equal! result.too_small_to_measure, true~
     - Inside source: true
     *** True Line Result
    -    def default_floor_tile x, y, w, h, sprite_path
    -** Processing line: ~      state.new_entity(:room,~
    +    assert.equal! result.too_small_to_measure, true
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      state.new_entity(:room,
    -** Processing line: ~                       { x: x,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                       { x: x,
    -** Processing line: ~                         y: y,~
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Advanced Debugging - Unit Tests - exception_raising_tests.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - exception_raising_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb~
     - Inside source: true
     *** True Line Result
    -                         y: y,
    -** Processing line: ~                         w: w,~
    +  # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb
    +** Processing line: ~  begin :shared~
     - Inside source: true
     *** True Line Result
    -                         w: w,
    -** Processing line: ~                         h: h,~
    +  begin :shared
    +** Processing line: ~    class ExceptionalClass~
     - Inside source: true
     *** True Line Result
    -                         h: h,
    -** Processing line: ~                         sprite_path: sprite_path})~
    +    class ExceptionalClass
    +** Processing line: ~      def initialize exception_to_throw = nil~
     - Inside source: true
     *** True Line Result
    -                         sprite_path: sprite_path})
    -** Processing line: ~    end~
    +      def initialize exception_to_throw = nil
    +** Processing line: ~        raise exception_to_throw if exception_to_throw~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +        raise exception_to_throw if exception_to_throw
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def default_camera x, y, w, h~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    def default_camera x, y, w, h
    -** Processing line: ~      state.new_entity(:camera,~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      state.new_entity(:camera,
    -** Processing line: ~                       { x: x,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                       { x: x,
    -** Processing line: ~                         y: y,~
    +
    +** Processing line: ~  def test_exception_in_newing_object args, assert~
     - Inside source: true
     *** True Line Result
    -                         y: y,
    -** Processing line: ~                         dx: 0,~
    +  def test_exception_in_newing_object args, assert
    +** Processing line: ~    begin~
     - Inside source: true
     *** True Line Result
    -                         dx: 0,
    -** Processing line: ~                         dy: 0,~
    +    begin
    +** Processing line: ~      ExceptionalClass.new TypeError~
     - Inside source: true
     *** True Line Result
    -                         dy: 0,
    -** Processing line: ~                         w: w,~
    +      ExceptionalClass.new TypeError
    +** Processing line: ~      raise "Exception wasn't thrown!"~
     - Inside source: true
     *** True Line Result
    -                         w: w,
    -** Processing line: ~                         h: h})~
    +      raise "Exception wasn't thrown!"
    +** Processing line: ~    rescue Exception => e~
     - Inside source: true
     *** True Line Result
    -                         h: h})
    +    rescue Exception => e
    +** Processing line: ~      assert.equal! e.class, TypeError, "Exceptions within constructor should be retained."~
    +- Inside source: true
    +*** True Line Result
    +      assert.equal! e.class, TypeError, "Exceptions within constructor should be retained."
     ** 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 new_player_cyan~
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -    def new_player_cyan
    -** Processing line: ~      default_player(0, 0, 64, 64,~
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
     - Inside source: true
     *** True Line Result
    -      default_player(0, 0, 64, 64,
    -** Processing line: ~                     "sprites/player/player_#{state.player_cyan.orientation}_standing.png")~
    +  $gtk.log_level = :off
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                     "sprites/player/player_#{state.player_cyan.orientation}_standing.png")
    -** Processing line: ~    end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    def new_player_magenta~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - fn_tests.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - fn_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/fn_tests.rb~
     - Inside source: true
     *** True Line Result
    -    def new_player_magenta
    -** Processing line: ~      default_player(64, 0, 64, 64,~
    +  # ./samples/10_advanced_debugging/03_unit_tests/fn_tests.rb
    +** Processing line: ~  def infinity~
     - Inside source: true
     *** True Line Result
    -      default_player(64, 0, 64, 64,
    -** Processing line: ~                     "sprites/player/player_#{state.player_magenta.orientation}_standing.png")~
    +  def infinity
    +** Processing line: ~    1 / 0~
     - Inside source: true
     *** True Line Result
    -                     "sprites/player/player_#{state.player_magenta.orientation}_standing.png")
    -** Processing line: ~    end~
    +    1 / 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def new_camera_magenta~
    +** Processing line: ~  def neg_infinity~
     - Inside source: true
     *** True Line Result
    -    def new_camera_magenta
    -** Processing line: ~      default_camera(0,0,720,720)~
    +  def neg_infinity
    +** Processing line: ~    -1 / 0~
     - Inside source: true
     *** True Line Result
    -      default_camera(0,0,720,720)
    -** Processing line: ~    end~
    +    -1 / 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def new_camera_cyan~
    +** Processing line: ~  def nan~
     - Inside source: true
     *** True Line Result
    -    def new_camera_cyan
    -** Processing line: ~      default_camera(0,0,720,720)~
    +  def nan
    +** Processing line: ~    0.0 / 0~
     - Inside source: true
     *** True Line Result
    -      default_camera(0,0,720,720)
    -** Processing line: ~    end~
    +    0.0 / 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def new_camera_center~
    +** Processing line: ~  def test_add args, assert~
     - Inside source: true
     *** True Line Result
    -    def new_camera_center
    -** Processing line: ~      default_camera(0,0,1280,720)~
    +  def test_add args, assert
    +** Processing line: ~    assert.equal! (args.fn.add), 0~
     - Inside source: true
     *** True Line Result
    -      default_camera(0,0,1280,720)
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.add), 0
    +** Processing line: ~    assert.equal! (args.fn.+), 0~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.+), 0
    +** Processing line: ~    assert.equal! (args.fn.+ 1, 2, 3), 6~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def new_room~
    +    assert.equal! (args.fn.+ 1, 2, 3), 6
    +** Processing line: ~    assert.equal! (args.fn.+ 0), 0~
     - Inside source: true
     *** True Line Result
    -    def new_room
    -** Processing line: ~      default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')~
    +    assert.equal! (args.fn.+ 0), 0
    +** Processing line: ~    assert.equal! (args.fn.+ 0, nil), 0~
     - Inside source: true
     *** True Line Result
    -      default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.+ 0, nil), 0
    +** Processing line: ~    assert.equal! (args.fn.+ 0, nan), nil~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! (args.fn.+ 0, nan), nil
    +** Processing line: ~    assert.equal! (args.fn.+ 0, nil, infinity), nil~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.+ 0, nil, infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.+ [1, 2, 3, [4, 5, 6]]), 21~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.+ [1, 2, 3, [4, 5, 6]]), 21
    +** Processing line: ~    assert.equal! (args.fn.+ [nil, [4, 5, 6]]), 15~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.+ [nil, [4, 5, 6]]), 15
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #==============================================================================================~
    +** Processing line: ~  def test_sub args, assert~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Calculation functions~
    +  def test_sub args, assert
    +** Processing line: ~    neg_infinity = infinity * -1~
     - Inside source: true
     *** True Line Result
    -    #Calculation functions
    -** Processing line: ~    def calc~
    +    neg_infinity = infinity * -1
    +** Processing line: ~    assert.equal! (args.fn.+), 0~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      calc_camera_magenta~
    +    assert.equal! (args.fn.+), 0
    +** Processing line: ~    assert.equal! (args.fn.- 1, 2, 3), -4~
     - Inside source: true
     *** True Line Result
    -      calc_camera_magenta
    -** Processing line: ~      calc_camera_cyan~
    +    assert.equal! (args.fn.- 1, 2, 3), -4
    +** Processing line: ~    assert.equal! (args.fn.- 4), -4~
     - Inside source: true
     *** True Line Result
    -      calc_camera_cyan
    -** Processing line: ~      calc_camera_center~
    +    assert.equal! (args.fn.- 4), -4
    +** Processing line: ~    assert.equal! (args.fn.- 4, nan), nil~
     - Inside source: true
     *** True Line Result
    -      calc_camera_center
    -** Processing line: ~      calc_player_cyan~
    +    assert.equal! (args.fn.- 4, nan), nil
    +** Processing line: ~    assert.equal! (args.fn.- 0, nil), 0~
     - Inside source: true
     *** True Line Result
    -      calc_player_cyan
    -** Processing line: ~      calc_player_magenta~
    +    assert.equal! (args.fn.- 0, nil), 0
    +** Processing line: ~    assert.equal! (args.fn.- 0, nil, infinity), nil~
     - Inside source: true
     *** True Line Result
    -      calc_player_magenta
    -** Processing line: ~      calc_trauma_decay~
    +    assert.equal! (args.fn.- 0, nil, infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.- [0, 1, 2, 3, [4, 5, 6]]), -21~
     - Inside source: true
     *** True Line Result
    -      calc_trauma_decay
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.- [0, 1, 2, 3, [4, 5, 6]]), -21
    +** Processing line: ~    assert.equal! (args.fn.- [nil, 0, [4, 5, 6]]), -15~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! (args.fn.- [nil, 0, [4, 5, 6]]), -15
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def center_camera_tolerance~
    +** Processing line: ~  def test_div args, assert~
     - Inside source: true
     *** True Line Result
    -    def center_camera_tolerance
    -** Processing line: ~      return Math.sqrt(((state.player_magenta.x - state.player_cyan.x) ** 2) +~
    +  def test_div args, assert
    +** Processing line: ~    assert.equal! (args.fn.div), 1~
     - Inside source: true
     *** True Line Result
    -      return Math.sqrt(((state.player_magenta.x - state.player_cyan.x) ** 2) +
    -** Processing line: ~                ((state.player_magenta.y - state.player_cyan.y) ** 2)) > 640~
    +    assert.equal! (args.fn.div), 1
    +** Processing line: ~    assert.equal! (args.fn./), 1~
     - Inside source: true
     *** True Line Result
    -                ((state.player_magenta.y - state.player_cyan.y) ** 2)) > 640
    -** Processing line: ~    end~
    +    assert.equal! (args.fn./), 1
    +** Processing line: ~    assert.equal! (args.fn./ 6, 3), 2~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn./ 6, 3), 2
    +** Processing line: ~    assert.equal! (args.fn./ 6, infinity), nil~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_player_cyan~
    +    assert.equal! (args.fn./ 6, infinity), nil
    +** Processing line: ~    assert.equal! (args.fn./ 6, nan), nil~
     - Inside source: true
     *** True Line Result
    -    def calc_player_cyan
    -** Processing line: ~      state.player_cyan.x += state.player_cyan.dx~
    +    assert.equal! (args.fn./ 6, nan), nil
    +** Processing line: ~    assert.equal! (args.fn./ infinity), nil~
     - Inside source: true
     *** True Line Result
    -      state.player_cyan.x += state.player_cyan.dx
    -** Processing line: ~      state.player_cyan.y += state.player_cyan.dy~
    +    assert.equal! (args.fn./ infinity), nil
    +** Processing line: ~    assert.equal! (args.fn./ 0), nil~
     - Inside source: true
     *** True Line Result
    -      state.player_cyan.y += state.player_cyan.dy
    -** Processing line: ~    end~
    +    assert.equal! (args.fn./ 0), nil
    +** Processing line: ~    assert.equal! (args.fn./ 6, [3]), 2~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! (args.fn./ 6, [3]), 2
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_player_magenta~
    +** Processing line: ~  def test_idiv args, assert~
     - Inside source: true
     *** True Line Result
    -    def calc_player_magenta
    -** Processing line: ~      state.player_magenta.x += state.player_magenta.dx~
    +  def test_idiv args, assert
    +** Processing line: ~    assert.equal! (args.fn.idiv), 1~
     - Inside source: true
     *** True Line Result
    -      state.player_magenta.x += state.player_magenta.dx
    -** Processing line: ~      state.player_magenta.y += state.player_magenta.dy~
    +    assert.equal! (args.fn.idiv), 1
    +** Processing line: ~    assert.equal! (args.fn.idiv 7, 3), 2~
     - Inside source: true
     *** True Line Result
    -      state.player_magenta.y += state.player_magenta.dy
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.idiv 7, 3), 2
    +** Processing line: ~    assert.equal! (args.fn.idiv 6, infinity), nil~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! (args.fn.idiv 6, infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.idiv 6, nan), nil~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.idiv 6, nan), nil
    +** Processing line: ~    assert.equal! (args.fn.idiv infinity), nil~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.idiv infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.idiv 0), nil~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.idiv 0), nil
    +** Processing line: ~    assert.equal! (args.fn.idiv 7, [3]), 2~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.idiv 7, [3]), 2
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_camera_center~
    +** Processing line: ~  def test_mul args, assert~
     - Inside source: true
     *** True Line Result
    -    def calc_camera_center
    -** Processing line: ~      timeScale = 1~
    +  def test_mul args, assert
    +** Processing line: ~    assert.equal! (args.fn.mul), 1~
     - Inside source: true
     *** True Line Result
    -      timeScale = 1
    -** Processing line: ~      midX = (state.player_magenta.x + state.player_cyan.x)/2~
    +    assert.equal! (args.fn.mul), 1
    +** Processing line: ~    assert.equal! (args.fn.*), 1~
     - Inside source: true
     *** True Line Result
    -      midX = (state.player_magenta.x + state.player_cyan.x)/2
    -** Processing line: ~      midY = (state.player_magenta.y + state.player_cyan.y)/2~
    +    assert.equal! (args.fn.*), 1
    +** Processing line: ~    assert.equal! (args.fn.* 7, 3), 21~
     - Inside source: true
     *** True Line Result
    -      midY = (state.player_magenta.y + state.player_cyan.y)/2
    -** Processing line: ~      targetX = midX - state.camera_center.w/2~
    +    assert.equal! (args.fn.* 7, 3), 21
    +** Processing line: ~    assert.equal! (args.fn.* 6, nan), nil~
     - Inside source: true
     *** True Line Result
    -      targetX = midX - state.camera_center.w/2
    -** Processing line: ~      targetY = midY - state.camera_center.h/2~
    +    assert.equal! (args.fn.* 6, nan), nil
    +** Processing line: ~    assert.equal! (args.fn.* 6, infinity), nil~
     - Inside source: true
     *** True Line Result
    -      targetY = midY - state.camera_center.h/2
    -** Processing line: ~      state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale~
    +    assert.equal! (args.fn.* 6, infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.* infinity), nil~
     - Inside source: true
     *** True Line Result
    -      state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale
    -** Processing line: ~      state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale~
    +    assert.equal! (args.fn.* infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.* 0), 0~
     - Inside source: true
     *** True Line Result
    -      state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.* 0), 0
    +** Processing line: ~    assert.equal! (args.fn.* 7, [3]), 21~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.* 7, [3]), 21
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_camera_magenta~
    +** Processing line: ~  def test_lt args, assert~
     - Inside source: true
     *** True Line Result
    -    def calc_camera_magenta
    -** Processing line: ~      timeScale = 1~
    +  def test_lt args, assert
    +** Processing line: ~    assert.equal! (args.fn.lt 1), 1~
     - Inside source: true
     *** True Line Result
    -      timeScale = 1
    -** Processing line: ~      targetX = state.player_magenta.x + state.player_magenta.w - state.camera_magenta.w/2~
    +    assert.equal! (args.fn.lt 1), 1
    +** Processing line: ~    assert.equal! (args.fn.lt), nil~
     - Inside source: true
     *** True Line Result
    -      targetX = state.player_magenta.x + state.player_magenta.w - state.camera_magenta.w/2
    -** Processing line: ~      targetY = state.player_magenta.y + state.player_magenta.h - state.camera_magenta.h/2~
    +    assert.equal! (args.fn.lt), nil
    +** Processing line: ~    assert.equal! (args.fn.lt infinity), nil~
     - Inside source: true
     *** True Line Result
    -      targetY = state.player_magenta.y + state.player_magenta.h - state.camera_magenta.h/2
    -** Processing line: ~      state.camera_magenta.x += (targetX - state.camera_magenta.x) * 0.1 * timeScale~
    +    assert.equal! (args.fn.lt infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.lt nan), nil~
     - Inside source: true
     *** True Line Result
    -      state.camera_magenta.x += (targetX - state.camera_magenta.x) * 0.1 * timeScale
    -** Processing line: ~      state.camera_magenta.y += (targetY - state.camera_magenta.y) * 0.1 * timeScale~
    +    assert.equal! (args.fn.lt nan), nil
    +** Processing line: ~    assert.equal! (args.fn.lt 10, 9, 8), 8~
     - Inside source: true
     *** True Line Result
    -      state.camera_magenta.y += (targetY - state.camera_magenta.y) * 0.1 * timeScale
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.lt 10, 9, 8), 8
    +** Processing line: ~    assert.equal! (args.fn.< 10, 9, 8), 8~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! (args.fn.< 10, 9, 8), 8
    +** Processing line: ~    assert.equal! (args.fn.< [10, 9, [8]]), 8~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.< [10, 9, [8]]), 8
    +** Processing line: ~    assert.equal! (args.fn.< 10, 10), nil~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.< 10, 10), nil
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_camera_cyan~
    +** Processing line: ~  def test_lte args, assert~
     - Inside source: true
     *** True Line Result
    -    def calc_camera_cyan
    -** Processing line: ~      timeScale = 1~
    +  def test_lte args, assert
    +** Processing line: ~    assert.equal! (args.fn.lte 1), 1~
     - Inside source: true
     *** True Line Result
    -      timeScale = 1
    -** Processing line: ~      targetX = state.player_cyan.x + state.player_cyan.w - state.camera_cyan.w/2~
    +    assert.equal! (args.fn.lte 1), 1
    +** Processing line: ~    assert.equal! (args.fn.lte), nil~
     - Inside source: true
     *** True Line Result
    -      targetX = state.player_cyan.x + state.player_cyan.w - state.camera_cyan.w/2
    -** Processing line: ~      targetY = state.player_cyan.y + state.player_cyan.h - state.camera_cyan.h/2~
    +    assert.equal! (args.fn.lte), nil
    +** Processing line: ~    assert.equal! (args.fn.lte infinity), nil~
     - Inside source: true
     *** True Line Result
    -      targetY = state.player_cyan.y + state.player_cyan.h - state.camera_cyan.h/2
    -** Processing line: ~      state.camera_cyan.x += (targetX - state.camera_cyan.x) * 0.1 * timeScale~
    +    assert.equal! (args.fn.lte infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.lte nan), nil~
     - Inside source: true
     *** True Line Result
    -      state.camera_cyan.x += (targetX - state.camera_cyan.x) * 0.1 * timeScale
    -** Processing line: ~      state.camera_cyan.y += (targetY - state.camera_cyan.y) * 0.1 * timeScale~
    +    assert.equal! (args.fn.lte nan), nil
    +** Processing line: ~    assert.equal! (args.fn.lte 10, 9, 8), 8~
     - Inside source: true
     *** True Line Result
    -      state.camera_cyan.y += (targetY - state.camera_cyan.y) * 0.1 * timeScale
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.lte 10, 9, 8), 8
    +** Processing line: ~    assert.equal! (args.fn.lte 10, 10), 10~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.lte 10, 10), 10
    +** Processing line: ~    assert.equal! (args.fn.lte  10, 9, [8]), 8~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_player_quadrant angle~
    +    assert.equal! (args.fn.lte  10, 9, [8]), 8
    +** Processing line: ~    assert.equal! (args.fn.<=  10, 9, 8), 8~
     - Inside source: true
     *** True Line Result
    -    def calc_player_quadrant angle
    -** Processing line: ~      if angle < 45 and angle > -45 and state.player_cyan.x < state.player_magenta.x~
    +    assert.equal! (args.fn.<=  10, 9, 8), 8
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      if angle < 45 and angle > -45 and state.player_cyan.x < state.player_magenta.x
    -** Processing line: ~        return 1~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        return 1
    -** Processing line: ~      elsif angle < 45 and angle > -45 and state.player_cyan.x > state.player_magenta.x~
    +
    +** Processing line: ~  def test_gt args, assert~
     - Inside source: true
     *** True Line Result
    -      elsif angle < 45 and angle > -45 and state.player_cyan.x > state.player_magenta.x
    -** Processing line: ~        return 3~
    +  def test_gt args, assert
    +** Processing line: ~    assert.equal! (args.fn.gt 1), 1~
     - Inside source: true
     *** True Line Result
    -        return 3
    -** Processing line: ~      elsif (angle > 45 or angle < -45) and state.player_cyan.y < state.player_magenta.y~
    +    assert.equal! (args.fn.gt 1), 1
    +** Processing line: ~    assert.equal! (args.fn.gt), nil~
     - Inside source: true
     *** True Line Result
    -      elsif (angle > 45 or angle < -45) and state.player_cyan.y < state.player_magenta.y
    -** Processing line: ~        return 2~
    +    assert.equal! (args.fn.gt), nil
    +** Processing line: ~    assert.equal! (args.fn.gt infinity), nil~
     - Inside source: true
     *** True Line Result
    -        return 2
    -** Processing line: ~      elsif (angle > 45 or angle < -45) and state.player_cyan.y > state.player_magenta.y~
    +    assert.equal! (args.fn.gt infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.gt nan), nil~
     - Inside source: true
     *** True Line Result
    -      elsif (angle > 45 or angle < -45) and state.player_cyan.y > state.player_magenta.y
    -** Processing line: ~        return 4~
    +    assert.equal! (args.fn.gt nan), nil
    +** Processing line: ~    assert.equal! (args.fn.gt 8, 9, 10), 10~
     - Inside source: true
     *** True Line Result
    -        return 4
    -** Processing line: ~      end~
    +    assert.equal! (args.fn.gt 8, 9, 10), 10
    +** Processing line: ~    assert.equal! (args.fn.gt [8, 9, [10]]), 10~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.gt [8, 9, [10]]), 10
    +** Processing line: ~    assert.equal! (args.fn.gt 10, 10), nil~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.gt 10, 10), nil
    +** Processing line: ~    assert.equal! (args.fn.gt 10, 10), nil~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_camera_shake~
    +    assert.equal! (args.fn.gt 10, 10), nil
    +** Processing line: ~    assert.equal! (args.fn.gt 10, 9), nil~
     - Inside source: true
     *** True Line Result
    -    def calc_camera_shake
    -** Processing line: ~      state.trauma~
    +    assert.equal! (args.fn.gt 10, 9), nil
    +** Processing line: ~    assert.equal! (args.fn.>  8, 9, 10), 10~
     - Inside source: true
     *** True Line Result
    -      state.trauma
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.>  8, 9, 10), 10
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def calc_trauma_decay~
    +** Processing line: ~  def test_gte args, assert~
     - Inside source: true
     *** True Line Result
    -    def calc_trauma_decay
    -** Processing line: ~      state.trauma = state.trauma * 0.9~
    +  def test_gte args, assert
    +** Processing line: ~    assert.equal! (args.fn.gte 1), 1~
     - Inside source: true
     *** True Line Result
    -      state.trauma = state.trauma * 0.9
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.gte 1), 1
    +** Processing line: ~    assert.equal! (args.fn.gte), nil~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.gte), nil
    +** Processing line: ~    assert.equal! (args.fn.gte infinity), nil~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc_random_float_range(min, max)~
    +    assert.equal! (args.fn.gte infinity), nil
    +** Processing line: ~    assert.equal! (args.fn.gte nan), nil~
     - Inside source: true
     *** True Line Result
    -    def calc_random_float_range(min, max)
    -** Processing line: ~      rand * (max-min) + min~
    +    assert.equal! (args.fn.gte nan), nil
    +** Processing line: ~    assert.equal! (args.fn.gte 8, 9, 10), 10~
     - Inside source: true
     *** True Line Result
    -      rand * (max-min) + min
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.gte 8, 9, 10), 10
    +** Processing line: ~    assert.equal! (args.fn.gte 10, 10), 10~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    assert.equal! (args.fn.gte 10, 10), 10
    +** Processing line: ~    assert.equal! (args.fn.gte 8, 9, [10]), 10~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    #==============================================================================================~
    +    assert.equal! (args.fn.gte 8, 9, [10]), 10
    +** Processing line: ~    assert.equal! (args.fn.gte 10, 9), nil~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Render Functions~
    +    assert.equal! (args.fn.gte 10, 9), nil
    +** Processing line: ~    assert.equal! (args.fn.>=  8, 9, 10), 10~
     - Inside source: true
     *** True Line Result
    -    #Render Functions
    -** Processing line: ~    def render~
    +    assert.equal! (args.fn.>=  8, 9, 10), 10
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      render_floor~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      render_floor
    -** Processing line: ~      render_player_cyan~
    +
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      render_player_cyan
    -** Processing line: ~      render_player_magenta~
    +
    +** Processing line: ~  def test_acopy args, assert~
     - Inside source: true
     *** True Line Result
    -      render_player_magenta
    -** Processing line: ~      if center_camera_tolerance~
    +  def test_acopy args, assert
    +** Processing line: ~    orig  = [1, 2, 3]~
     - Inside source: true
     *** True Line Result
    -      if center_camera_tolerance
    -** Processing line: ~        render_split_camera_scene~
    +    orig  = [1, 2, 3]
    +** Processing line: ~    clone = args.fn.acopy orig~
     - Inside source: true
     *** True Line Result
    -        render_split_camera_scene
    -** Processing line: ~      else~
    +    clone = args.fn.acopy orig
    +** Processing line: ~    assert.equal! clone, [1, 2, 3]~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        render_camera_center_scene~
    +    assert.equal! clone, [1, 2, 3]
    +** Processing line: ~    assert.equal! clone, orig~
     - Inside source: true
     *** True Line Result
    -        render_camera_center_scene
    -** Processing line: ~      end~
    +    assert.equal! clone, orig
    +** Processing line: ~    assert.not_equal! clone.object_id, orig.object_id~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    assert.not_equal! clone.object_id, orig.object_id
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_player_cyan~
    +** Processing line: ~  def test_aget args, assert~
     - Inside source: true
     *** True Line Result
    -    def render_player_cyan
    -** Processing line: ~      outputs[:scene].sprites << {x: state.player_cyan.x,~
    +  def test_aget args, assert
    +** Processing line: ~    assert.equal! (args.fn.aget [:a, :b, :c], 1), :b~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].sprites << {x: state.player_cyan.x,
    -** Processing line: ~                                  y: state.player_cyan.y,~
    +    assert.equal! (args.fn.aget [:a, :b, :c], 1), :b
    +** Processing line: ~    assert.equal! (args.fn.aget [:a, :b, :c], nil), nil~
     - Inside source: true
     *** True Line Result
    -                                  y: state.player_cyan.y,
    -** Processing line: ~                                  w: state.player_cyan.w,~
    +    assert.equal! (args.fn.aget [:a, :b, :c], nil), nil
    +** Processing line: ~    assert.equal! (args.fn.aget nil, 1), nil~
     - Inside source: true
     *** True Line Result
    -                                  w: state.player_cyan.w,
    -** Processing line: ~                                  h: state.player_cyan.h,~
    +    assert.equal! (args.fn.aget nil, 1), nil
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                                  h: state.player_cyan.h,
    -** Processing line: ~                                  path: "sprites/player/player_#{state.player_cyan.orientation}_standing.png",~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                  path: "sprites/player/player_#{state.player_cyan.orientation}_standing.png",
    -** Processing line: ~                                  r: 0,~
    +
    +** Processing line: ~  def test_alength args, assert~
     - Inside source: true
     *** True Line Result
    -                                  r: 0,
    -** Processing line: ~                                  g: 255,~
    +  def test_alength args, assert
    +** Processing line: ~    assert.equal! (args.fn.alength [:a, :b, :c]), 3~
     - Inside source: true
     *** True Line Result
    -                                  g: 255,
    -** Processing line: ~                                  b: 255}~
    +    assert.equal! (args.fn.alength [:a, :b, :c]), 3
    +** Processing line: ~    assert.equal! (args.fn.alength nil), nil~
     - Inside source: true
     *** True Line Result
    -                                  b: 255}
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.alength nil), nil
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_player_magenta~
    -- Inside source: true
    -*** True Line Result
    -    def render_player_magenta
    -** Processing line: ~      outputs[:scene].sprites << {x: state.player_magenta.x,~
    -- Inside source: true
    -*** True Line Result
    -      outputs[:scene].sprites << {x: state.player_magenta.x,
    -** Processing line: ~                                  y: state.player_magenta.y,~
    +** Processing line: ~  def test_amap args, assert~
     - Inside source: true
     *** True Line Result
    -                                  y: state.player_magenta.y,
    -** Processing line: ~                                  w: state.player_magenta.w,~
    +  def test_amap args, assert
    +** Processing line: ~    inc = lambda { |i| i + 1 }~
     - Inside source: true
     *** True Line Result
    -                                  w: state.player_magenta.w,
    -** Processing line: ~                                  h: state.player_magenta.h,~
    +    inc = lambda { |i| i + 1 }
    +** Processing line: ~    ary = [1, 2, 3]~
     - Inside source: true
     *** True Line Result
    -                                  h: state.player_magenta.h,
    -** Processing line: ~                                  path: "sprites/player/player_#{state.player_magenta.orientation}_standing.png",~
    +    ary = [1, 2, 3]
    +** Processing line: ~    assert.equal! (args.fn.amap ary, inc), [2, 3, 4]~
     - Inside source: true
     *** True Line Result
    -                                  path: "sprites/player/player_#{state.player_magenta.orientation}_standing.png",
    -** Processing line: ~                                  r: 255,~
    +    assert.equal! (args.fn.amap ary, inc), [2, 3, 4]
    +** Processing line: ~    assert.equal! (args.fn.amap nil, inc), nil~
     - Inside source: true
     *** True Line Result
    -                                  r: 255,
    -** Processing line: ~                                  g: 0,~
    +    assert.equal! (args.fn.amap nil, inc), nil
    +** Processing line: ~    assert.equal! (args.fn.amap ary, nil), nil~
     - Inside source: true
     *** True Line Result
    -                                  g: 0,
    -** Processing line: ~                                  b: 255}~
    +    assert.equal! (args.fn.amap ary, nil), nil
    +** Processing line: ~    assert.equal! (args.fn.amap ary, inc).class, Array~
     - Inside source: true
     *** True Line Result
    -                                  b: 255}
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.amap ary, inc).class, Array
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_floor~
    +** Processing line: ~  def test_and args, assert~
     - Inside source: true
     *** True Line Result
    -    def render_floor
    -** Processing line: ~      outputs[:scene].sprites << [state.room.x, state.room.y,~
    +  def test_and args, assert
    +** Processing line: ~    assert.equal! (args.fn.and 1, 2, 3, 4), 4~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].sprites << [state.room.x, state.room.y,
    -** Processing line: ~                                  state.room.w, state.room.h,~
    +    assert.equal! (args.fn.and 1, 2, 3, 4), 4
    +** Processing line: ~    assert.equal! (args.fn.and 1, 2, nil, 4), nil~
     - Inside source: true
     *** True Line Result
    -                                  state.room.w, state.room.h,
    -** Processing line: ~                                  state.room.sprite_path]~
    +    assert.equal! (args.fn.and 1, 2, nil, 4), nil
    +** Processing line: ~    assert.equal! (args.fn.and), true~
     - Inside source: true
     *** True Line Result
    -                                  state.room.sprite_path]
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.and), true
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_camera_center_scene~
    +** Processing line: ~  def test_or args, assert~
     - Inside source: true
     *** True Line Result
    -    def render_camera_center_scene
    -** Processing line: ~      zoomFactor = 1~
    +  def test_or args, assert
    +** Processing line: ~    assert.equal! (args.fn.or 1, 2, 3, 4), 1~
     - Inside source: true
     *** True Line Result
    -      zoomFactor = 1
    -** Processing line: ~      outputs[:scene].width = state.room.w~
    +    assert.equal! (args.fn.or 1, 2, 3, 4), 1
    +** Processing line: ~    assert.equal! (args.fn.or 1, 2, nil, 4), 1~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].width = state.room.w
    -** Processing line: ~      outputs[:scene].height = state.room.h~
    +    assert.equal! (args.fn.or 1, 2, nil, 4), 1
    +** Processing line: ~    assert.equal! (args.fn.or), nil~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].height = state.room.h
    +    assert.equal! (args.fn.or), nil
    +** Processing line: ~    assert.equal! (args.fn.or nil, nil, false, 5, 10), 5~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.or nil, nil, false, 5, 10), 5
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      maxAngle = 10.0~
    +** Processing line: ~  def test_eq_eq args, assert~
     - Inside source: true
     *** True Line Result
    -      maxAngle = 10.0
    -** Processing line: ~      maxOffset = 20.0~
    +  def test_eq_eq args, assert
    +** Processing line: ~    assert.equal! (args.fn.eq?), true~
     - Inside source: true
     *** True Line Result
    -      maxOffset = 20.0
    -** Processing line: ~      angle = maxAngle * calc_camera_shake * calc_random_float_range(-1,1)~
    +    assert.equal! (args.fn.eq?), true
    +** Processing line: ~    assert.equal! (args.fn.eq? 1, 0), false~
     - Inside source: true
     *** True Line Result
    -      angle = maxAngle * calc_camera_shake * calc_random_float_range(-1,1)
    -** Processing line: ~      offsetX = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))~
    +    assert.equal! (args.fn.eq? 1, 0), false
    +** Processing line: ~    assert.equal! (args.fn.eq? 1, 1, 1), true~
     - Inside source: true
     *** True Line Result
    -      offsetX = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))
    -** Processing line: ~      offsetY = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))~
    +    assert.equal! (args.fn.eq? 1, 1, 1), true
    +** Processing line: ~    assert.equal! (args.fn.== 1, 1, 1), true~
     - Inside source: true
     *** True Line Result
    -      offsetY = 32 - (maxOffset * calc_camera_shake * calc_random_float_range(-1,1))
    +    assert.equal! (args.fn.== 1, 1, 1), true
    +** Processing line: ~    assert.equal! (args.fn.== nil, nil), true~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! (args.fn.== nil, nil), true
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.sprites << {x: (-state.camera_center.x - offsetX)/zoomFactor,~
    +** Processing line: ~  def test_apply args, assert~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << {x: (-state.camera_center.x - offsetX)/zoomFactor,
    -** Processing line: ~                          y: (-state.camera_center.y - offsetY)/zoomFactor,~
    +  def test_apply args, assert
    +** Processing line: ~    assert.equal! (args.fn.and [nil, nil, nil]), [nil, nil, nil]~
     - Inside source: true
     *** True Line Result
    -                          y: (-state.camera_center.y - offsetY)/zoomFactor,
    -** Processing line: ~                          w: outputs[:scene].width/zoomFactor,~
    +    assert.equal! (args.fn.and [nil, nil, nil]), [nil, nil, nil]
    +** Processing line: ~    assert.equal! (args.fn.apply [nil, nil, nil], args.fn.method(:and)), nil~
     - Inside source: true
     *** True Line Result
    -                          w: outputs[:scene].width/zoomFactor,
    -** Processing line: ~                          h: outputs[:scene].height/zoomFactor,~
    +    assert.equal! (args.fn.apply [nil, nil, nil], args.fn.method(:and)), nil
    +** Processing line: ~    and_lambda = lambda {|*xs| args.fn.and(*xs)}~
     - Inside source: true
     *** True Line Result
    -                          h: outputs[:scene].height/zoomFactor,
    -** Processing line: ~                          path: :scene,~
    +    and_lambda = lambda {|*xs| args.fn.and(*xs)}
    +** Processing line: ~    assert.equal! (args.fn.apply [nil, nil, nil], and_lambda), nil~
     - Inside source: true
     *** True Line Result
    -                          path: :scene,
    -** Processing line: ~                          angle: angle,~
    +    assert.equal! (args.fn.apply [nil, nil, nil], and_lambda), nil
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                          angle: angle,
    -** Processing line: ~                          source_w: -1,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                          source_w: -1,
    -** Processing line: ~                          source_h: -1}~
    +
    +** Processing line: ~  def test_areduce args, assert~
     - Inside source: true
     *** True Line Result
    -                          source_h: -1}
    -** Processing line: ~      outputs.labels << [128,64,"#{state.trauma.round(1)}",8,2,255,0,255,255]~
    +  def test_areduce args, assert
    +** Processing line: ~    assert.equal! (args.fn.areduce [1, 2, 3], 0, lambda { |i, a| i + a }), 6~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [128,64,"#{state.trauma.round(1)}",8,2,255,0,255,255]
    -** Processing line: ~    end~
    +    assert.equal! (args.fn.areduce [1, 2, 3], 0, lambda { |i, a| i + a }), 6
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_split_camera_scene~
    +** Processing line: ~  def test_array_hash args, assert~
     - Inside source: true
     *** True Line Result
    -    def render_split_camera_scene
    -** Processing line: ~       outputs[:scene].width = state.room.w~
    +  def test_array_hash args, assert
    +** Processing line: ~    assert.equal! (args.fn.array_hash :a, 1, :b, 2), { a: 1, b: 2 }~
     - Inside source: true
     *** True Line Result
    -       outputs[:scene].width = state.room.w
    -** Processing line: ~       outputs[:scene].height = state.room.h~
    +    assert.equal! (args.fn.array_hash :a, 1, :b, 2), { a: 1, b: 2 }
    +** Processing line: ~    assert.equal! (args.fn.array_hash), { }~
     - Inside source: true
     *** True Line Result
    -       outputs[:scene].height = state.room.h
    -** Processing line: ~       render_camera_magenta_scene~
    +    assert.equal! (args.fn.array_hash), { }
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -       render_camera_magenta_scene
    -** Processing line: ~       render_camera_cyan_scene~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -       render_camera_cyan_scene
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - gen_docs.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - gen_docs.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/gen_docs.rb~
     - Inside source: true
     *** True Line Result
    -       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI
    -** Processing line: ~       output_split_camera angle~
    +  # ./samples/10_advanced_debugging/03_unit_tests/gen_docs.rb
    +** Processing line: ~  # ./dragonruby mygame --eval samples/99_zz_gtk_unit_tests/gen_docs.rb --no-tick~
     - Inside source: true
     *** True Line Result
    -       output_split_camera angle
    +  # ./dragonruby mygame --eval samples/99_zz_gtk_unit_tests/gen_docs.rb --no-tick
    +** Processing line: ~  Kernel.export_docs!~
    +- Inside source: true
    +*** True Line Result
    +  Kernel.export_docs!
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    end~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    def render_camera_magenta_scene~
    -- Inside source: true
    +** Processing line: ~*** Advanced Debugging - Unit Tests - geometry_tests.rb~
    +- Header detected.
     *** True Line Result
    -    def render_camera_magenta_scene
    -** Processing line: ~       zoomFactor = 1~
    -- Inside source: true
    +
     *** True Line Result
    -       zoomFactor = 1
    -** Processing line: ~       offsetX = 32~
    -- Inside source: true
    +*** Advanced Debugging - Unit Tests - geometry_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -       offsetX = 32
    -** Processing line: ~       offsetY = 32~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/geometry_tests.rb~
     - Inside source: true
     *** True Line Result
    -       offsetY = 32
    -** Processing line: ~~
    +  # ./samples/10_advanced_debugging/03_unit_tests/geometry_tests.rb
    +** Processing line: ~  begin :shared~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~       outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2),~
    +  begin :shared
    +** Processing line: ~    def primitive_representations x, y, w, h~
     - Inside source: true
     *** True Line Result
    -       outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2),
    -** Processing line: ~                                           y: (-state.camera_magenta.y),~
    +    def primitive_representations x, y, w, h
    +** Processing line: ~      [~
     - Inside source: true
     *** True Line Result
    -                                           y: (-state.camera_magenta.y),
    -** Processing line: ~                                           w: outputs[:scene].width*2,~
    +      [
    +** Processing line: ~        [x, y, w, h],~
     - Inside source: true
     *** True Line Result
    -                                           w: outputs[:scene].width*2,
    -** Processing line: ~                                           h: outputs[:scene].height,~
    +        [x, y, w, h],
    +** Processing line: ~        { x: x, y: y, w: w, h: h },~
     - Inside source: true
     *** True Line Result
    -                                           h: outputs[:scene].height,
    -** Processing line: ~                                           path: :scene}~
    +        { x: x, y: y, w: w, h: h },
    +** Processing line: ~        RectForTest.new(x, y, w, h)~
     - Inside source: true
     *** True Line Result
    -                                           path: :scene}
    -** Processing line: ~~
    +        RectForTest.new(x, y, w, h)
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -
    +      ]
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -50712,206 +59227,202 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render_camera_cyan_scene~
    -- Inside source: true
    -*** True Line Result
    -    def render_camera_cyan_scene
    -** Processing line: ~      zoomFactor = 1~
    +** Processing line: ~    class RectForTest~
     - Inside source: true
     *** True Line Result
    -      zoomFactor = 1
    -** Processing line: ~      offsetX = 32~
    +    class RectForTest
    +** Processing line: ~      attr_sprite~
     - Inside source: true
     *** True Line Result
    -      offsetX = 32
    -** Processing line: ~      offsetY = 32~
    +      attr_sprite
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      offsetY = 32
    -** Processing line: ~      outputs[:scene_cyan].sprites << {x: (-state.camera_cyan.x*2),~
    +
    +** Processing line: ~      def initialize x, y, w, h~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene_cyan].sprites << {x: (-state.camera_cyan.x*2),
    -** Processing line: ~                                       y: (-state.camera_cyan.y),~
    +      def initialize x, y, w, h
    +** Processing line: ~        @x = x~
     - Inside source: true
     *** True Line Result
    -                                       y: (-state.camera_cyan.y),
    -** Processing line: ~                                       w: outputs[:scene].width*2,~
    +        @x = x
    +** Processing line: ~        @y = y~
     - Inside source: true
     *** True Line Result
    -                                       w: outputs[:scene].width*2,
    -** Processing line: ~                                       h: outputs[:scene].height,~
    +        @y = y
    +** Processing line: ~        @w = w~
     - Inside source: true
     *** True Line Result
    -                                       h: outputs[:scene].height,
    -** Processing line: ~                                       path: :scene}~
    +        @w = w
    +** Processing line: ~        @h = h~
     - Inside source: true
     *** True Line Result
    -                                       path: :scene}
    -** Processing line: ~    end~
    +        @h = h
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    end
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def output_split_camera angle~
    -- Inside source: true
    -*** True Line Result
    -    def output_split_camera angle
    -** Processing line: ~      #TODO: Clean this up!~
    +** Processing line: ~      def to_s~
     - Inside source: true
     *** True Line Result
    -      #TODO: Clean this up!
    -** Processing line: ~      quadrant = calc_player_quadrant angle~
    +      def to_s
    +** Processing line: ~        "RectForTest: #{[x, y, w, h]}"~
     - Inside source: true
     *** True Line Result
    -      quadrant = calc_player_quadrant angle
    -** Processing line: ~      outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255]~
    +        "RectForTest: #{[x, y, w, h]}"
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255]
    -** Processing line: ~      if quadrant == 1~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      if quadrant == 1
    -** Processing line: ~        set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0)~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0)
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      elsif quadrant == 2~
    +** Processing line: ~  begin :intersect_rect?~
     - Inside source: true
     *** True Line Result
    -      elsif quadrant == 2
    -** Processing line: ~        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0)~
    +  begin :intersect_rect?
    +** Processing line: ~    def test_intersect_rect_point args, assert~
     - Inside source: true
     *** True Line Result
    -        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0)
    +    def test_intersect_rect_point args, assert
    +** Processing line: ~      assert.true! [16, 13].intersect_rect?([13, 12, 4, 4]), "point intersects with rect."~
    +- Inside source: true
    +*** True Line Result
    +      assert.true! [16, 13].intersect_rect?([13, 12, 4, 4]), "point intersects with rect."
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      elsif quadrant == 3~
    +** Processing line: ~    def test_intersect_rect args, assert~
     - Inside source: true
     *** True Line Result
    -      elsif quadrant == 3
    -** Processing line: ~        set_camera_attributes(w: 640, h: 720, m_x: 0, m_y: 0, c_x: 640, c_y: 0)~
    +    def test_intersect_rect args, assert
    +** Processing line: ~      intersecting = primitive_representations(0, 0, 100, 100) +~
     - Inside source: true
     *** True Line Result
    -        set_camera_attributes(w: 640, h: 720, m_x: 0, m_y: 0, c_x: 640, c_y: 0)
    +      intersecting = primitive_representations(0, 0, 100, 100) +
    +** Processing line: ~                     primitive_representations(20, 20, 20, 20)~
    +- Inside source: true
    +*** True Line Result
    +                     primitive_representations(20, 20, 20, 20)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      elsif quadrant == 4~
    +** Processing line: ~      intersecting.product(intersecting).each do |rect_one, rect_two|~
     - Inside source: true
     *** True Line Result
    -      elsif quadrant == 4
    -** Processing line: ~        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 0, c_x: 0, c_y: 360)~
    +      intersecting.product(intersecting).each do |rect_one, rect_two|
    +** Processing line: ~        assert.true! rect_one.intersect_rect?(rect_two),~
     - Inside source: true
     *** True Line Result
    -        set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 0, c_x: 0, c_y: 360)
    -** Processing line: ~~
    +        assert.true! rect_one.intersect_rect?(rect_two),
    +** Processing line: ~                     "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected true)."~
     - Inside source: true
     *** True Line Result
    -
    +                     "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected true)."
     ** 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 set_camera_attributes(w: 0, h: 0, m_x: 0, m_y: 0, c_x: 0, c_y: 0)~
    +** Processing line: ~      not_intersecting = [~
     - Inside source: true
     *** True Line Result
    -    def set_camera_attributes(w: 0, h: 0, m_x: 0, m_y: 0, c_x: 0, c_y: 0)
    -** Processing line: ~      state.camera_cyan.w = w + 64~
    +      not_intersecting = [
    +** Processing line: ~        [ 0, 0, 5, 5],~
     - Inside source: true
     *** True Line Result
    -      state.camera_cyan.w = w + 64
    -** Processing line: ~      state.camera_cyan.h = h + 64~
    +        [ 0, 0, 5, 5],
    +** Processing line: ~        { x: 10, y: 10, w: 5, h: 5 },~
     - Inside source: true
     *** True Line Result
    -      state.camera_cyan.h = h + 64
    -** Processing line: ~      outputs[:scene_cyan].width = (w) * 2~
    +        { x: 10, y: 10, w: 5, h: 5 },
    +** Processing line: ~        RectForTest.new(20, 20, 5, 5)~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene_cyan].width = (w) * 2
    -** Processing line: ~      outputs[:scene_cyan].height = h~
    +        RectForTest.new(20, 20, 5, 5)
    +** Processing line: ~      ]~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene_cyan].height = h
    +      ]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      state.camera_magenta.w = w + 64~
    -- Inside source: true
    -*** True Line Result
    -      state.camera_magenta.w = w + 64
    -** Processing line: ~      state.camera_magenta.h = h + 64~
    +** Processing line: ~      not_intersecting.product(not_intersecting)~
     - Inside source: true
     *** True Line Result
    -      state.camera_magenta.h = h + 64
    -** Processing line: ~      outputs[:scene_magenta].width = (w) * 2~
    +      not_intersecting.product(not_intersecting)
    +** Processing line: ~        .reject { |rect_one, rect_two| rect_one == rect_two }~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene_magenta].width = (w) * 2
    -** Processing line: ~      outputs[:scene_magenta].height = h~
    +        .reject { |rect_one, rect_two| rect_one == rect_two }
    +** Processing line: ~        .each do |rect_one, rect_two|~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene_magenta].height = h
    -** Processing line: ~      outputs.sprites << {x: m_x,~
    +        .each do |rect_one, rect_two|
    +** Processing line: ~        assert.false! rect_one.intersect_rect?(rect_two),~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << {x: m_x,
    -** Processing line: ~                          y: m_y,~
    +        assert.false! rect_one.intersect_rect?(rect_two),
    +** Processing line: ~                      "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected false)."~
     - Inside source: true
     *** True Line Result
    -                          y: m_y,
    -** Processing line: ~                          w: w,~
    +                      "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected false)."
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -                          w: w,
    -** Processing line: ~                          h: h,~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -                          h: h,
    -** Processing line: ~                          path: :scene_magenta}~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -                          path: :scene_magenta}
    -** Processing line: ~      outputs.sprites << {x: c_x,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << {x: c_x,
    -** Processing line: ~                          y: c_y,~
    +
    +** Processing line: ~  begin :inside_rect?~
     - Inside source: true
     *** True Line Result
    -                          y: c_y,
    -** Processing line: ~                          w: w,~
    +  begin :inside_rect?
    +** Processing line: ~    def assert_inside_rect outer: nil, inner: nil, expected: nil, assert: nil~
     - Inside source: true
     *** True Line Result
    -                          w: w,
    -** Processing line: ~                          h: h,~
    +    def assert_inside_rect outer: nil, inner: nil, expected: nil, assert: nil
    +** Processing line: ~      assert.true! inner.inside_rect?(outer) == expected,~
     - Inside source: true
     *** True Line Result
    -                          h: h,
    -** Processing line: ~                          path: :scene_cyan}~
    +      assert.true! inner.inside_rect?(outer) == expected,
    +** Processing line: ~                   "inside_rect? assertion failed for outer: #{outer} inner: #{inner} (expected #{expected})."~
     - Inside source: true
     *** True Line Result
    -                          path: :scene_cyan}
    +                   "inside_rect? assertion failed for outer: #{outer} inner: #{inner} (expected #{expected})."
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -50920,322 +59431,338 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def add_trauma amount~
    +** Processing line: ~    def test_inside_rect args, assert~
     - Inside source: true
     *** True Line Result
    -    def add_trauma amount
    -** Processing line: ~      state.trauma = [state.trauma + amount, 1.0].min~
    +    def test_inside_rect args, assert
    +** Processing line: ~      outer_rects = primitive_representations(0, 0, 10, 10)~
     - Inside source: true
     *** True Line Result
    -      state.trauma = [state.trauma + amount, 1.0].min
    -** Processing line: ~    end~
    +      outer_rects = primitive_representations(0, 0, 10, 10)
    +** Processing line: ~      inner_rects = primitive_representations(1, 1, 5, 5)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      inner_rects = primitive_representations(1, 1, 5, 5)
    +** Processing line: ~      primitive_representations(0, 0, 10, 10).product(primitive_representations(1, 1, 5, 5))~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def remove_trauma amount~
    +      primitive_representations(0, 0, 10, 10).product(primitive_representations(1, 1, 5, 5))
    +** Processing line: ~        .each do |outer, inner|~
     - Inside source: true
     *** True Line Result
    -    def remove_trauma amount
    -** Processing line: ~      state.trauma = [state.trauma - amount, 0.0].max~
    +        .each do |outer, inner|
    +** Processing line: ~        assert_inside_rect outer: outer, inner: inner,~
     - Inside source: true
     *** True Line Result
    -      state.trauma = [state.trauma - amount, 0.0].max
    -** Processing line: ~    end~
    +        assert_inside_rect outer: outer, inner: inner,
    +** Processing line: ~                           expected: true, assert: assert~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    #==============================================================================================~
    +                           expected: true, assert: assert
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    #==============================================================================================
    -** Processing line: ~    #Input functions~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    #Input functions
    -** Processing line: ~    def input~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    def input
    -** Processing line: ~      input_move_cyan~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      input_move_cyan
    -** Processing line: ~      input_move_magenta~
    +
    +** Processing line: ~  begin :angle_to~
     - Inside source: true
     *** True Line Result
    -      input_move_magenta
    -** Processing line: ~~
    +  begin :angle_to
    +** Processing line: ~    def test_angle_to args, assert~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      if inputs.keyboard.key_down.t~
    +    def test_angle_to args, assert
    +** Processing line: ~      origins = primitive_representations(0, 0, 0, 0)~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_down.t
    -** Processing line: ~        add_trauma(0.5)~
    +      origins = primitive_representations(0, 0, 0, 0)
    +** Processing line: ~      rights = primitive_representations(1, 0, 0, 0)~
     - Inside source: true
     *** True Line Result
    -        add_trauma(0.5)
    -** Processing line: ~      elsif inputs.keyboard.key_down.y~
    +      rights = primitive_representations(1, 0, 0, 0)
    +** Processing line: ~      aboves = primitive_representations(0, 1, 0, 0)~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_down.y
    -** Processing line: ~        remove_trauma(0.1)~
    +      aboves = primitive_representations(0, 1, 0, 0)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        remove_trauma(0.1)
    -** Processing line: ~      end~
    +
    +** Processing line: ~      origins.product(aboves).each do |origin, above|~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +      origins.product(aboves).each do |origin, above|
    +** Processing line: ~        assert.equal! origin.angle_to(above), 90,~
     - Inside source: true
     *** True Line Result
    -    end
    +        assert.equal! origin.angle_to(above), 90,
    +** Processing line: ~                      "A point directly above should be 90 degrees."~
    +- Inside source: true
    +*** True Line Result
    +                      "A point directly above should be 90 degrees."
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def input_move_cyan~
    +** Processing line: ~        assert.equal! above.angle_from(origin), 90,~
     - Inside source: true
     *** True Line Result
    -    def input_move_cyan
    -** Processing line: ~      if inputs.keyboard.key_held.up~
    +        assert.equal! above.angle_from(origin), 90,
    +** Processing line: ~                      "A point coming from above should be 90 degrees."~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.up
    -** Processing line: ~        state.player_cyan.dy = 5~
    +                      "A point coming from above should be 90 degrees."
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dy = 5
    -** Processing line: ~        state.player_cyan.orientation = "up"~
    +      end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.orientation = "up"
    -** Processing line: ~      elsif inputs.keyboard.key_held.down~
    +
    +** Processing line: ~      origins.product(rights).each do |origin, right|~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.down
    -** Processing line: ~        state.player_cyan.dy = -5~
    +      origins.product(rights).each do |origin, right|
    +** Processing line: ~        assert.equal! origin.angle_to(right) % 360, 0,~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dy = -5
    -** Processing line: ~        state.player_cyan.orientation = "down"~
    +        assert.equal! origin.angle_to(right) % 360, 0,
    +** Processing line: ~                      "A point directly to the right should be 0 degrees."~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.orientation = "down"
    -** Processing line: ~      else~
    +                      "A point directly to the right should be 0 degrees."
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        state.player_cyan.dy *= 0.8~
    +
    +** Processing line: ~        assert.equal! right.angle_from(origin) % 360, 0,~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dy *= 0.8
    -** Processing line: ~      end~
    +        assert.equal! right.angle_from(origin) % 360, 0,
    +** Processing line: ~                      "A point coming from the right should be 0 degrees."~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      if inputs.keyboard.key_held.left~
    +                      "A point coming from the right should be 0 degrees."
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.left
    -** Processing line: ~        state.player_cyan.dx = -5~
    +
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dx = -5
    -** Processing line: ~        state.player_cyan.orientation = "left"~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.orientation = "left"
    -** Processing line: ~      elsif inputs.keyboard.key_held.right~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.right
    -** Processing line: ~        state.player_cyan.dx = 5~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dx = 5
    -** Processing line: ~        state.player_cyan.orientation = "right"~
    +
    +** Processing line: ~  begin :scale_rect~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.orientation = "right"
    -** Processing line: ~      else~
    +  begin :scale_rect
    +** Processing line: ~    def test_scale_rect args, assert~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        state.player_cyan.dx *= 0.8~
    +    def test_scale_rect args, assert
    +** Processing line: ~      assert.equal! [0, 0, 100, 100].scale_rect(0.5, 0.5),~
     - Inside source: true
     *** True Line Result
    -        state.player_cyan.dx *= 0.8
    -** Processing line: ~      end~
    +      assert.equal! [0, 0, 100, 100].scale_rect(0.5, 0.5),
    +** Processing line: ~                    [25.0, 25.0, 50.0, 50.0]~
     - Inside source: true
     *** True Line Result
    -      end
    +                    [25.0, 25.0, 50.0, 50.0]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255]~
    -- Inside source: true
    -*** True Line Result
    -      outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255]
    -** Processing line: ~      outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255]~
    +** Processing line: ~      assert.equal! [0, 0, 100, 100].scale_rect(0.5),~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255]
    -** Processing line: ~    end~
    +      assert.equal! [0, 0, 100, 100].scale_rect(0.5),
    +** Processing line: ~                    [0.0, 0.0, 50.0, 50.0]~
     - Inside source: true
     *** True Line Result
    -    end
    +                    [0.0, 0.0, 50.0, 50.0]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def input_move_magenta~
    +** Processing line: ~      assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0.5, anchor_y: 0.5),~
     - Inside source: true
     *** True Line Result
    -    def input_move_magenta
    -** Processing line: ~      if inputs.keyboard.key_held.w~
    +      assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0.5, anchor_y: 0.5),
    +** Processing line: ~                    [25.0, 25.0, 50.0, 50.0]~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.w
    -** Processing line: ~        state.player_magenta.dy = 5~
    +                    [25.0, 25.0, 50.0, 50.0]
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dy = 5
    -** Processing line: ~        state.player_magenta.orientation = "up"~
    +
    +** Processing line: ~      assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0, anchor_y: 0),~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.orientation = "up"
    -** Processing line: ~      elsif inputs.keyboard.key_held.s~
    +      assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0, anchor_y: 0),
    +** Processing line: ~                    [0.0, 0.0, 50.0, 50.0]~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.s
    -** Processing line: ~        state.player_magenta.dy = -5~
    +                    [0.0, 0.0, 50.0, 50.0]
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dy = -5
    -** Processing line: ~        state.player_magenta.orientation = "down"~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.orientation = "down"
    -** Processing line: ~      else~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        state.player_magenta.dy *= 0.8~
    +
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dy *= 0.8
    -** Processing line: ~      end~
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~      if inputs.keyboard.key_held.a~
    +  $gtk.log_level = :off
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      if inputs.keyboard.key_held.a
    -** Processing line: ~        state.player_magenta.dx = -5~
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Advanced Debugging - Unit Tests - http_tests.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - http_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/http_tests.rb~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dx = -5
    -** Processing line: ~        state.player_magenta.orientation = "left"~
    +  # ./samples/10_advanced_debugging/03_unit_tests/http_tests.rb
    +** Processing line: ~  def try_assert_or_schedule args, assert~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.orientation = "left"
    -** Processing line: ~      elsif inputs.keyboard.key_held.d~
    +  def try_assert_or_schedule args, assert
    +** Processing line: ~    if $result[:complete]~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.keyboard.key_held.d
    -** Processing line: ~        state.player_magenta.dx = 5~
    +    if $result[:complete]
    +** Processing line: ~      log_info "Request completed! Verifying."~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dx = 5
    -** Processing line: ~        state.player_magenta.orientation = "right"~
    +      log_info "Request completed! Verifying."
    +** Processing line: ~      if $result[:http_response_code] != 200~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.orientation = "right"
    -** Processing line: ~      else~
    +      if $result[:http_response_code] != 200
    +** Processing line: ~        log_info "The request yielded a result of #{$result[:http_response_code]} instead of 200."~
     - Inside source: true
     *** True Line Result
    -      else
    -** Processing line: ~        state.player_magenta.dx *= 0.8~
    +        log_info "The request yielded a result of #{$result[:http_response_code]} instead of 200."
    +** Processing line: ~        exit~
     - Inside source: true
     *** True Line Result
    -        state.player_magenta.dx *= 0.8
    +        exit
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
           end
    -** Processing line: ~~
    +** Processing line: ~      log_info ":try_assert_or_schedule succeeded!"~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~      outputs.labels << [128,360,"#{state.player_magenta.x.round()}",8,2,255,0,255,255]~
    +      log_info ":try_assert_or_schedule succeeded!"
    +** Processing line: ~    else~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [128,360,"#{state.player_magenta.x.round()}",8,2,255,0,255,255]
    -** Processing line: ~      outputs.labels << [128,328,"#{state.player_magenta.y.round()}",8,2,255,0,255,255]~
    +    else
    +** Processing line: ~      args.gtk.schedule_callback Kernel.tick_count + 10 do~
     - Inside source: true
     *** True Line Result
    -      outputs.labels << [128,328,"#{state.player_magenta.y.round()}",8,2,255,0,255,255]
    -** Processing line: ~    end~
    +      args.gtk.schedule_callback Kernel.tick_count + 10 do
    +** Processing line: ~        try_assert_or_schedule args, assert~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +        try_assert_or_schedule args, assert
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  $camera_movement = CameraMovement.new~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  $camera_movement = CameraMovement.new
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    -- Inside source: true
    -*** True Line Result
    -  def tick args
    -** Processing line: ~    args.outputs.background_color = [0,0,0]~
    +** Processing line: ~  def test_http args, assert~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [0,0,0]
    -** Processing line: ~    $camera_movement.inputs  = args.inputs~
    +  def test_http args, assert
    +** Processing line: ~    $result = $gtk.http_get 'http://dragonruby.org'~
     - Inside source: true
     *** True Line Result
    -    $camera_movement.inputs  = args.inputs
    -** Processing line: ~    $camera_movement.outputs = args.outputs~
    +    $result = $gtk.http_get 'http://dragonruby.org'
    +** Processing line: ~    try_assert_or_schedule args, assert~
     - Inside source: true
     *** True Line Result
    -    $camera_movement.outputs = args.outputs
    -** Processing line: ~    $camera_movement.state   = args.state~
    +    try_assert_or_schedule args, assert
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    $camera_movement.state   = args.state
    -** Processing line: ~    $camera_movement.grid    = args.grid~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    $camera_movement.grid    = args.grid
    -** Processing line: ~    $camera_movement.tick~
    +
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -    $camera_movement.tick
    -** Processing line: ~  end~
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
     - Inside source: true
     *** True Line Result
    -  end
    +  $gtk.log_level = :off
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -51248,410 +59775,442 @@ 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 - Z Targeting Camera - main.rb~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - nil_coercion_tests.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Advanced Rendering - Z Targeting Camera - main.rb
    +*** Advanced Debugging - Unit Tests - nil_coercion_tests.rb
     ** Processing line: ~#+begin_src ruby~
     - Line was identified as the beginning of a code block.
     *** True Line Result
     
     *** True Line Result
     #+begin_src ruby
    -** Processing line: ~  # ./samples/07_advanced_rendering/08_z_targeting_camera/app/main.rb~
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/nil_coercion_tests.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/07_advanced_rendering/08_z_targeting_camera/app/main.rb
    -** Processing line: ~  class Game~
    +  # ./samples/10_advanced_debugging/03_unit_tests/nil_coercion_tests.rb
    +** Processing line: ~  # numbers~
     - Inside source: true
     *** True Line Result
    -  class Game
    -** Processing line: ~    attr_gtk~
    +  # numbers
    +** Processing line: ~  def test_open_entity_add_number args, assert~
     - Inside source: true
     *** True Line Result
    -    attr_gtk
    +  def test_open_entity_add_number args, assert
    +** Processing line: ~    assert.nil! args.state.i_value~
    +- Inside source: true
    +*** True Line Result
    +    assert.nil! args.state.i_value
    +** Processing line: ~    args.state.i_value += 5~
    +- Inside source: true
    +*** True Line Result
    +    args.state.i_value += 5
    +** Processing line: ~    assert.equal! args.state.i_value, 5~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! args.state.i_value, 5
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def tick~
    +** Processing line: ~    assert.nil! args.state.f_value~
     - Inside source: true
     *** True Line Result
    -    def tick
    -** Processing line: ~      defaults~
    +    assert.nil! args.state.f_value
    +** Processing line: ~    args.state.f_value += 5.5~
     - Inside source: true
     *** True Line Result
    -      defaults
    -** Processing line: ~      render~
    +    args.state.f_value += 5.5
    +** Processing line: ~    assert.equal! args.state.f_value, 5.5~
     - Inside source: true
     *** True Line Result
    -      render
    -** Processing line: ~      input~
    +    assert.equal! args.state.f_value, 5.5
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      input
    -** Processing line: ~      calc~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      calc
    -** Processing line: ~    end~
    +
    +** Processing line: ~  def test_open_entity_subtract_number args, assert~
     - Inside source: true
     *** True Line Result
    -    end
    +  def test_open_entity_subtract_number args, assert
    +** Processing line: ~    assert.nil! args.state.i_value~
    +- Inside source: true
    +*** True Line Result
    +    assert.nil! args.state.i_value
    +** Processing line: ~    args.state.i_value -= 5~
    +- Inside source: true
    +*** True Line Result
    +    args.state.i_value -= 5
    +** Processing line: ~    assert.equal! args.state.i_value, -5~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! args.state.i_value, -5
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def defaults~
    +** Processing line: ~    assert.nil! args.state.f_value~
     - Inside source: true
     *** True Line Result
    -    def defaults
    -** Processing line: ~      outputs.background_color = [219, 208, 191]~
    +    assert.nil! args.state.f_value
    +** Processing line: ~    args.state.f_value -= 5.5~
     - Inside source: true
     *** True Line Result
    -      outputs.background_color = [219, 208, 191]
    -** Processing line: ~      player.x        ||= 634~
    +    args.state.f_value -= 5.5
    +** Processing line: ~    assert.equal! args.state.f_value, -5.5~
     - Inside source: true
     *** True Line Result
    -      player.x        ||= 634
    -** Processing line: ~      player.y        ||= 153~
    +    assert.equal! args.state.f_value, -5.5
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      player.y        ||= 153
    -** Processing line: ~      player.angle    ||= 90~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      player.angle    ||= 90
    -** Processing line: ~      player.distance ||= arena_radius~
    +
    +** Processing line: ~  def test_open_entity_multiply_number args, assert~
     - Inside source: true
     *** True Line Result
    -      player.distance ||= arena_radius
    -** Processing line: ~      target.x        ||= 634~
    +  def test_open_entity_multiply_number args, assert
    +** Processing line: ~    assert.nil! args.state.i_value~
     - Inside source: true
     *** True Line Result
    -      target.x        ||= 634
    -** Processing line: ~      target.y        ||= 359~
    +    assert.nil! args.state.i_value
    +** Processing line: ~    args.state.i_value *= 5~
     - Inside source: true
     *** True Line Result
    -      target.y        ||= 359
    -** Processing line: ~    end~
    +    args.state.i_value *= 5
    +** Processing line: ~    assert.equal! args.state.i_value, 0~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! args.state.i_value, 0
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def render~
    +** Processing line: ~    assert.nil! args.state.f_value~
     - Inside source: true
     *** True Line Result
    -    def render
    -** Processing line: ~      outputs[:scene].sprites << ([0, 0, 933, 700, 'sprites/arena.png'].center_inside_rect grid.rect)~
    +    assert.nil! args.state.f_value
    +** Processing line: ~    args.state.f_value *= 5.5~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].sprites << ([0, 0, 933, 700, 'sprites/arena.png'].center_inside_rect grid.rect)
    -** Processing line: ~      outputs[:scene].sprites << target_sprite~
    +    args.state.f_value *= 5.5
    +** Processing line: ~    assert.equal! args.state.f_value, 0~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].sprites << target_sprite
    -** Processing line: ~      outputs[:scene].sprites << player_sprite~
    +    assert.equal! args.state.f_value, 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      outputs[:scene].sprites << player_sprite
    -** Processing line: ~      outputs.sprites << scene~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      outputs.sprites << scene
    -** Processing line: ~    end~
    +
    +** Processing line: ~  def test_open_entity_divide_number args, assert~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  def test_open_entity_divide_number args, assert
    +** Processing line: ~    assert.nil! args.state.i_value~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def target_sprite~
    +    assert.nil! args.state.i_value
    +** Processing line: ~    args.state.i_value /= 5~
     - Inside source: true
     *** True Line Result
    -    def target_sprite
    -** Processing line: ~      {~
    +    args.state.i_value /= 5
    +** Processing line: ~    assert.equal! args.state.i_value, 0~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x: target.x, y: target.y,~
    +    assert.equal! args.state.i_value, 0
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        x: target.x, y: target.y,
    -** Processing line: ~        w: 10, h: 10,~
    +
    +** Processing line: ~    assert.nil! args.state.f_value~
     - Inside source: true
     *** True Line Result
    -        w: 10, h: 10,
    -** Processing line: ~        path: 'sprites/square/black.png'~
    +    assert.nil! args.state.f_value
    +** Processing line: ~    args.state.f_value /= 5.5~
     - Inside source: true
     *** True Line Result
    -        path: 'sprites/square/black.png'
    -** Processing line: ~      }.anchor_rect 0.5, 0.5~
    +    args.state.f_value /= 5.5
    +** Processing line: ~    assert.equal! args.state.f_value, 0~
     - Inside source: true
     *** True Line Result
    -      }.anchor_rect 0.5, 0.5
    -** Processing line: ~    end~
    +    assert.equal! args.state.f_value, 0
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def input~
    +** Processing line: ~  # array~
     - Inside source: true
     *** True Line Result
    -    def input
    -** Processing line: ~      if inputs.up && player.distance > 30~
    +  # array
    +** Processing line: ~  def test_open_entity_add_array args, assert~
     - Inside source: true
     *** True Line Result
    -      if inputs.up && player.distance > 30
    -** Processing line: ~        player.distance -= 2~
    +  def test_open_entity_add_array args, assert
    +** Processing line: ~    assert.nil! args.state.values~
     - Inside source: true
     *** True Line Result
    -        player.distance -= 2
    -** Processing line: ~      elsif inputs.down && player.distance < 200~
    +    assert.nil! args.state.values
    +** Processing line: ~    args.state.values += [:a, :b, :c]~
     - Inside source: true
     *** True Line Result
    -      elsif inputs.down && player.distance < 200
    -** Processing line: ~        player.distance += 2~
    +    args.state.values += [:a, :b, :c]
    +** Processing line: ~    assert.equal! args.state.values, [:a, :b, :c]~
     - Inside source: true
     *** True Line Result
    -        player.distance += 2
    -** Processing line: ~      end~
    +    assert.equal! args.state.values, [:a, :b, :c]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~      player.angle += inputs.left_right * -1~
    -- Inside source: true
    -*** True Line Result
    -      player.angle += inputs.left_right * -1
    -** Processing line: ~    end~
    -- Inside source: true
    -*** True Line Result
    -    end
    -** Processing line: ~~
    +** Processing line: ~  def test_open_entity_subtract_array args, assert~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def calc~
    +  def test_open_entity_subtract_array args, assert
    +** Processing line: ~    assert.nil! args.state.values~
     - Inside source: true
     *** True Line Result
    -    def calc
    -** Processing line: ~      player.x = target.x + ((player.angle *  1).vector_x player.distance)~
    +    assert.nil! args.state.values
    +** Processing line: ~    args.state.values -= [:a, :b, :c]~
     - Inside source: true
     *** True Line Result
    -      player.x = target.x + ((player.angle *  1).vector_x player.distance)
    -** Processing line: ~      player.y = target.y + ((player.angle * -1).vector_y player.distance)~
    +    args.state.values -= [:a, :b, :c]
    +** Processing line: ~    assert.equal! args.state.values, []~
     - Inside source: true
     *** True Line Result
    -      player.y = target.y + ((player.angle * -1).vector_y player.distance)
    -** Processing line: ~    end~
    +    assert.equal! args.state.values, []
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def player_sprite~
    +** Processing line: ~  def test_open_entity_shovel_array args, assert~
     - Inside source: true
     *** True Line Result
    -    def player_sprite
    -** Processing line: ~      {~
    +  def test_open_entity_shovel_array args, assert
    +** Processing line: ~    assert.nil! args.state.values~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x: player.x,~
    +    assert.nil! args.state.values
    +** Processing line: ~    args.state.values << :a~
     - Inside source: true
     *** True Line Result
    -        x: player.x,
    -** Processing line: ~        y: player.y,~
    +    args.state.values << :a
    +** Processing line: ~    assert.equal! args.state.values, [:a]~
     - Inside source: true
     *** True Line Result
    -        y: player.y,
    -** Processing line: ~        w: 50,~
    +    assert.equal! args.state.values, [:a]
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        w: 50,
    -** Processing line: ~        h: 100,~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        h: 100,
    -** Processing line: ~        path: 'sprites/player.png',~
    +
    +** Processing line: ~  def test_open_entity_enumerate args, assert~
     - Inside source: true
     *** True Line Result
    -        path: 'sprites/player.png',
    -** Processing line: ~        angle: (player.angle * -1) + 90~
    +  def test_open_entity_enumerate args, assert
    +** Processing line: ~    assert.nil! args.state.values~
     - Inside source: true
     *** True Line Result
    -        angle: (player.angle * -1) + 90
    -** Processing line: ~      }.anchor_rect 0.5, 0~
    +    assert.nil! args.state.values
    +** Processing line: ~    args.state.values = args.state.values.map_with_index { |i| i }~
     - Inside source: true
     *** True Line Result
    -      }.anchor_rect 0.5, 0
    -** Processing line: ~    end~
    +    args.state.values = args.state.values.map_with_index { |i| i }
    +** Processing line: ~    assert.equal! args.state.values, []~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! args.state.values, []
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def center_map~
    +** Processing line: ~    assert.nil! args.state.values_2~
     - Inside source: true
     *** True Line Result
    -    def center_map
    -** Processing line: ~      { x: 634, y: 359 }~
    +    assert.nil! args.state.values_2
    +** Processing line: ~    args.state.values_2 = args.state.values_2.map { |i| i }~
     - Inside source: true
     *** True Line Result
    -      { x: 634, y: 359 }
    -** Processing line: ~    end~
    +    args.state.values_2 = args.state.values_2.map { |i| i }
    +** Processing line: ~    assert.equal! args.state.values_2, []~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! args.state.values_2, []
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def zoom_factor_single~
    +** Processing line: ~    assert.nil! args.state.values_3~
     - Inside source: true
     *** True Line Result
    -    def zoom_factor_single
    -** Processing line: ~      2 - ((args.geometry.distance player, center_map).fdiv arena_radius)~
    +    assert.nil! args.state.values_3
    +** Processing line: ~    args.state.values_3 = args.state.values_3.flat_map { |i| i }~
     - Inside source: true
     *** True Line Result
    -      2 - ((args.geometry.distance player, center_map).fdiv arena_radius)
    -** Processing line: ~    end~
    +    args.state.values_3 = args.state.values_3.flat_map { |i| i }
    +** Processing line: ~    assert.equal! args.state.values_3, []~
     - Inside source: true
     *** True Line Result
    -    end
    +    assert.equal! args.state.values_3, []
    +** Processing line: ~  end~
    +- Inside source: true
    +*** True Line Result
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def zoom_factor~
    +** Processing line: ~  # hashes~
     - Inside source: true
     *** True Line Result
    -    def zoom_factor
    -** Processing line: ~      zoom_factor_single ** 2~
    +  # hashes
    +** Processing line: ~  def test_open_entity_indexer args, assert~
     - Inside source: true
     *** True Line Result
    -      zoom_factor_single ** 2
    -** Processing line: ~    end~
    +  def test_open_entity_indexer args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    assert.nil! args.state.values~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def arena_radius~
    +    assert.nil! args.state.values
    +** Processing line: ~    args.state.values[:test] = :value~
     - Inside source: true
     *** True Line Result
    -    def arena_radius
    -** Processing line: ~      206~
    +    args.state.values[:test] = :value
    +** Processing line: ~    assert.equal! args.state.values.to_s, { entity_id: 1, entity_name: :values, entity_keys_by_ref: {}, test: :value }.to_s~
     - Inside source: true
     *** True Line Result
    -      206
    -** Processing line: ~    end~
    +    assert.equal! args.state.values.to_s, { entity_id: 1, entity_name: :values, entity_keys_by_ref: {}, test: :value }.to_s
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def scene~
    +** Processing line: ~  # bug~
     - Inside source: true
     *** True Line Result
    -    def scene
    -** Processing line: ~      {~
    +  # bug
    +** Processing line: ~  def test_open_entity_nil_bug args, assert~
     - Inside source: true
     *** True Line Result
    -      {
    -** Processing line: ~        x:    (640 - player.x) + (640 - (640 * zoom_factor)),~
    +  def test_open_entity_nil_bug args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -        x:    (640 - player.x) + (640 - (640 * zoom_factor)),
    -** Processing line: ~        y:    (360 - player.y - (75 * zoom_factor)) + (320 - (320 * zoom_factor)),~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.foo.a~
     - Inside source: true
     *** True Line Result
    -        y:    (360 - player.y - (75 * zoom_factor)) + (320 - (320 * zoom_factor)),
    -** Processing line: ~        w:    1280 * zoom_factor,~
    +    args.state.foo.a
    +** Processing line: ~    args.state.foo.b~
     - Inside source: true
     *** True Line Result
    -        w:    1280 * zoom_factor,
    -** Processing line: ~        h:     720 * zoom_factor,~
    +    args.state.foo.b
    +** Processing line: ~    @hello[:foobar]~
     - Inside source: true
     *** True Line Result
    -        h:     720 * zoom_factor,
    -** Processing line: ~        path: :scene,~
    +    @hello[:foobar]
    +** Processing line: ~    assert.nil! args.state.foo.a, "a was not nil."~
     - Inside source: true
     *** True Line Result
    -        path: :scene,
    -** Processing line: ~        angle: player.angle - 90,~
    +    assert.nil! args.state.foo.a, "a was not nil."
    +** Processing line: ~    # the line below fails~
     - Inside source: true
     *** True Line Result
    -        angle: player.angle - 90,
    -** Processing line: ~        angle_anchor_x: (player.x.fdiv 1280),~
    +    # the line below fails
    +** Processing line: ~    # assert.nil! args.state.foo.b, "b was not nil."~
     - Inside source: true
     *** True Line Result
    -        angle_anchor_x: (player.x.fdiv 1280),
    -** Processing line: ~        angle_anchor_y: (player.y.fdiv 720)~
    +    # assert.nil! args.state.foo.b, "b was not nil."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        angle_anchor_y: (player.y.fdiv 720)
    -** Processing line: ~      }~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      }
    -** Processing line: ~    end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    def player~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - object_to_primitive_tests.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Advanced Debugging - Unit Tests - object_to_primitive_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/object_to_primitive_tests.rb~
     - Inside source: true
     *** True Line Result
    -    def player
    -** Processing line: ~      state.player~
    +  # ./samples/10_advanced_debugging/03_unit_tests/object_to_primitive_tests.rb
    +** Processing line: ~  class PlayerSpriteForTest~
     - Inside source: true
     *** True Line Result
    -      state.player
    -** Processing line: ~    end~
    +  class PlayerSpriteForTest
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def target~
    +** Processing line: ~  def test_array_to_sprite args, assert~
     - Inside source: true
     *** True Line Result
    -    def target
    -** Processing line: ~      state.target~
    +  def test_array_to_sprite args, assert
    +** Processing line: ~    array = [[0, 0, 100, 100, "test.png"]].sprites~
     - Inside source: true
     *** True Line Result
    -      state.target
    -** Processing line: ~    end~
    +    array = [[0, 0, 100, 100, "test.png"]].sprites
    +** Processing line: ~    puts "No exception was thrown. Sweet!"~
     - Inside source: true
     *** True Line Result
    -    end
    +    puts "No exception was thrown. Sweet!"
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -51660,22 +60219,22 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def tick args~
    +** Processing line: ~  def test_class_to_sprite args, assert~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    $game ||= Game.new~
    +  def test_class_to_sprite args, assert
    +** Processing line: ~    array = [PlayerSprite.new].sprites~
     - Inside source: true
     *** True Line Result
    -    $game ||= Game.new
    -** Processing line: ~    $game.args = args~
    +    array = [PlayerSprite.new].sprites
    +** Processing line: ~    assert.true! array.first.is_a?(PlayerSprite)~
     - Inside source: true
     *** True Line Result
    -    $game.args = args
    -** Processing line: ~    $game.tick~
    +    assert.true! array.first.is_a?(PlayerSprite)
    +** Processing line: ~    puts "No exception was thrown. Sweet!"~
     - Inside source: true
     *** True Line Result
    -    $game.tick
    +    puts "No exception was thrown. Sweet!"
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -51684,10 +60243,14 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  $gtk.reset~
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -  $gtk.reset
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
    +- Inside source: true
    +*** True Line Result
    +  $gtk.log_level = :off
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -51700,546 +60263,522 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Tweening Lerping Easing Functions - Easing Functions - main.rb~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - parsing_tests.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Tweening Lerping Easing Functions - Easing Functions - main.rb
    +*** Advanced Debugging - Unit Tests - parsing_tests.rb
     ** Processing line: ~#+begin_src ruby~
     - Line was identified as the beginning of a code block.
     *** True Line Result
     
     *** True Line Result
     #+begin_src ruby
    -** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb~
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/parsing_tests.rb~
     - Inside source: true
     *** True Line Result
    -  # ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb
    -** Processing line: ~  def tick args~
    +  # ./samples/10_advanced_debugging/03_unit_tests/parsing_tests.rb
    +** Processing line: ~  def test_parse_json args, assert~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    # STOP! Watch the following presentation first!!!!~
    +  def test_parse_json args, assert
    +** Processing line: ~    result = args.gtk.parse_json '{ "name": "John Doe", "aliases": ["JD"] }'~
     - Inside source: true
     *** True Line Result
    -    # STOP! Watch the following presentation first!!!!
    -** Processing line: ~    # Math for Game Programmers: Fast and Funky 1D Nonlinear Transformations~
    +    result = args.gtk.parse_json '{ "name": "John Doe", "aliases": ["JD"] }'
    +** Processing line: ~    assert.equal! result, { "name"=>"John Doe", "aliases"=>["JD"] }, "Parsing JSON failed."~
     - Inside source: true
     *** True Line Result
    -    # Math for Game Programmers: Fast and Funky 1D Nonlinear Transformations
    -** Processing line: ~    # https://www.youtube.com/watch?v=mr5xkf6zSzk~
    +    assert.equal! result, { "name"=>"John Doe", "aliases"=>["JD"] }, "Parsing JSON failed."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # https://www.youtube.com/watch?v=mr5xkf6zSzk
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # You've watched the talk, yes? YES???~
    +** Processing line: ~  def test_parse_xml args, assert~
     - Inside source: true
     *** True Line Result
    -    # You've watched the talk, yes? YES???
    -** Processing line: ~~
    +  def test_parse_xml args, assert
    +** Processing line: ~    result = args.gtk.parse_xml <<-S~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # define starting and ending points of properties to animate~
    +    result = args.gtk.parse_xml <<-S
    +** Processing line: ~  ~
     - Inside source: true
     *** True Line Result
    -    # define starting and ending points of properties to animate
    -** Processing line: ~    args.state.target_x = 1180~
    +  
    +** Processing line: ~    John Doe~
     - Inside source: true
     *** True Line Result
    -    args.state.target_x = 1180
    -** Processing line: ~    args.state.target_y = 620~
    +    John Doe
    +** Processing line: ~  ~
     - Inside source: true
     *** True Line Result
    -    args.state.target_y = 620
    -** Processing line: ~    args.state.target_w = 100~
    +  
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    args.state.target_w = 100
    -** Processing line: ~    args.state.target_h = 100~
    +  S
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.target_h = 100
    -** Processing line: ~    args.state.starting_x = 0~
    +
    +** Processing line: ~   expected = {:type=>:element,~
     - Inside source: true
     *** True Line Result
    -    args.state.starting_x = 0
    -** Processing line: ~    args.state.starting_y = 0~
    +   expected = {:type=>:element,
    +** Processing line: ~               :name=>nil,~
     - Inside source: true
     *** True Line Result
    -    args.state.starting_y = 0
    -** Processing line: ~    args.state.starting_w = 300~
    +               :name=>nil,
    +** Processing line: ~               :children=>[{:type=>:element,~
     - Inside source: true
     *** True Line Result
    -    args.state.starting_w = 300
    -** Processing line: ~    args.state.starting_h = 300~
    +               :children=>[{:type=>:element,
    +** Processing line: ~                            :name=>"Person",~
     - Inside source: true
     *** True Line Result
    -    args.state.starting_h = 300
    -** Processing line: ~~
    +                            :name=>"Person",
    +** Processing line: ~                            :children=>[{:type=>:element,~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # define start time and duration of animation~
    +                            :children=>[{:type=>:element,
    +** Processing line: ~                                         :name=>"Name",~
     - Inside source: true
     *** True Line Result
    -    # define start time and duration of animation
    -** Processing line: ~    args.state.start_animate_at = 3.seconds # this is the same as writing 60 * 5 (or 300)~
    +                                         :name=>"Name",
    +** Processing line: ~                                         :children=>[{:type=>:content,~
     - Inside source: true
     *** True Line Result
    -    args.state.start_animate_at = 3.seconds # this is the same as writing 60 * 5 (or 300)
    -** Processing line: ~    args.state.duration = 2.seconds # this is the same as writing 60 * 2 (or 120)~
    +                                         :children=>[{:type=>:content,
    +** Processing line: ~                                                      :data=>"John Doe"}]}],~
     - Inside source: true
     *** True Line Result
    -    args.state.duration = 2.seconds # this is the same as writing 60 * 2 (or 120)
    -** Processing line: ~~
    +                                                      :data=>"John Doe"}]}],
    +** Processing line: ~                            :attributes=>{"id"=>"100"}}]}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # define type of animations~
    +                            :attributes=>{"id"=>"100"}}]}
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # define type of animations
    -** Processing line: ~    # Here are all the options you have for values you can put in the array:~
    +
    +** Processing line: ~   assert.equal! result, expected, "Parsing xml failed."~
     - Inside source: true
     *** True Line Result
    -    # Here are all the options you have for values you can put in the array:
    -** Processing line: ~    # :identity, :quad, :cube, :quart, :quint, :flip~
    +   assert.equal! result, expected, "Parsing xml failed."
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # :identity, :quad, :cube, :quart, :quint, :flip
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Linear is defined as:~
    -- Inside source: true
    -*** True Line Result
    -    # Linear is defined as:
    -** Processing line: ~    # [:identity]~
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -    # [:identity]
    -** Processing line: ~    #~
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
     - Inside source: true
     *** True Line Result
    -    #
    -** Processing line: ~    # Smooth start variations are:~
    +  $gtk.log_level = :off
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Smooth start variations are:
    -** Processing line: ~    # [:quad]~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -    # [:quad]
    -** Processing line: ~    # [:cube]~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -    # [:cube]
    -** Processing line: ~    # [:quart]~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Debugging - Unit Tests - pretty_format_tests.rb~
    +- Header detected.
     *** True Line Result
    -    # [:quart]
    -** Processing line: ~    # [:quint]~
    -- Inside source: true
    +
     *** True Line Result
    -    # [:quint]
    -** Processing line: ~~
    -- Inside source: true
    +*** Advanced Debugging - Unit Tests - pretty_format_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~    # Linear reversed, and smooth stop are the same as the animations defined above, but reversed:~
    -- Inside source: true
    -*** True Line Result
    -    # Linear reversed, and smooth stop are the same as the animations defined above, but reversed:
    -** Processing line: ~    # [:flip, :identity]~
    -- Inside source: true
     *** True Line Result
    -    # [:flip, :identity]
    -** Processing line: ~    # [:flip, :quad, :flip]~
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/pretty_format_tests.rb~
     - Inside source: true
     *** True Line Result
    -    # [:flip, :quad, :flip]
    -** Processing line: ~    # [:flip, :cube, :flip]~
    +  # ./samples/10_advanced_debugging/03_unit_tests/pretty_format_tests.rb
    +** Processing line: ~  def H opts~
     - Inside source: true
     *** True Line Result
    -    # [:flip, :cube, :flip]
    -** Processing line: ~    # [:flip, :quart, :flip]~
    +  def H opts
    +** Processing line: ~    opts~
     - Inside source: true
     *** True Line Result
    -    # [:flip, :quart, :flip]
    -** Processing line: ~    # [:flip, :quint, :flip]~
    +    opts
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # [:flip, :quint, :flip]
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # You can also do custom definitions. See the bottom of the file details~
    -- Inside source: true
    -*** True Line Result
    -    # You can also do custom definitions. See the bottom of the file details
    -** Processing line: ~    # on how to do that. I've defined a couple for you:~
    +** Processing line: ~  def A *opts~
     - Inside source: true
     *** True Line Result
    -    # on how to do that. I've defined a couple for you:
    -** Processing line: ~    # [:smoothest_start]~
    +  def A *opts
    +** Processing line: ~    opts~
     - Inside source: true
     *** True Line Result
    -    # [:smoothest_start]
    -** Processing line: ~    # [:smoothest_stop]~
    +    opts
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # [:smoothest_stop]
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # CHANGE THIS LINE TO ONE OF THE LINES ABOVE TO SEE VARIATIONS~
    -- Inside source: true
    -*** True Line Result
    -    # CHANGE THIS LINE TO ONE OF THE LINES ABOVE TO SEE VARIATIONS
    -** Processing line: ~    args.state.animation_type = [:identity]~
    +** Processing line: ~  def assert_format args, assert, hash, expected~
     - Inside source: true
     *** True Line Result
    -    args.state.animation_type = [:identity]
    -** Processing line: ~    # args.state.animation_type = [:quad]~
    +  def assert_format args, assert, hash, expected
    +** Processing line: ~    actual = args.fn.pretty_format hash~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:quad]
    -** Processing line: ~    # args.state.animation_type = [:cube]~
    +    actual = args.fn.pretty_format hash
    +** Processing line: ~    assert.are_equal! actual, expected~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:cube]
    -** Processing line: ~    # args.state.animation_type = [:quart]~
    +    assert.are_equal! actual, expected
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:quart]
    -** Processing line: ~    # args.state.animation_type = [:quint]~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:quint]
    -** Processing line: ~    # args.state.animation_type = [:flip, :identity]~
    +
    +** Processing line: ~  def test_pretty_print args, assert~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:flip, :identity]
    -** Processing line: ~    # args.state.animation_type = [:flip, :quad, :flip]~
    +  def test_pretty_print args, assert
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:flip, :quad, :flip]
    -** Processing line: ~    # args.state.animation_type = [:flip, :cube, :flip]~
    +    # =============================
    +** Processing line: ~    # hash with single value~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:flip, :cube, :flip]
    -** Processing line: ~    # args.state.animation_type = [:flip, :quart, :flip]~
    +    # hash with single value
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:flip, :quart, :flip]
    -** Processing line: ~    # args.state.animation_type = [:flip, :quint, :flip]~
    +    # =============================
    +** Processing line: ~    input = (H first_name: "John")~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:flip, :quint, :flip]
    -** Processing line: ~    # args.state.animation_type = [:smoothest_start]~
    +    input = (H first_name: "John")
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:smoothest_start]
    -** Processing line: ~    # args.state.animation_type = [:smoothest_stop]~
    +    expected = <<-S
    +** Processing line: ~  {:first_name "John"}~
     - Inside source: true
     *** True Line Result
    -    # args.state.animation_type = [:smoothest_stop]
    -** Processing line: ~~
    +  {:first_name "John"}
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # THIS IS WHERE THE MAGIC HAPPENS!~
    +  S
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    # THIS IS WHERE THE MAGIC HAPPENS!
    -** Processing line: ~    # Numeric#ease~
    +    (assert_format args, assert, input, expected)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # Numeric#ease
    -** Processing line: ~    progress = args.state.start_animate_at.ease(args.state.duration, args.state.animation_type)~
    +
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    progress = args.state.start_animate_at.ease(args.state.duration, args.state.animation_type)
    -** Processing line: ~~
    +    # =============================
    +** Processing line: ~    # hash with two values~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # Numeric#ease needs to called:~
    +    # hash with two values
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    # Numeric#ease needs to called:
    -** Processing line: ~    # 1. On the number that represents the point in time you want to start, and takes two parameters:~
    +    # =============================
    +** Processing line: ~    input = (H first_name: "John", last_name: "Smith")~
     - Inside source: true
     *** True Line Result
    -    # 1. On the number that represents the point in time you want to start, and takes two parameters:
    -** Processing line: ~    #   a. The first parameter is how long the animation should take.~
    +    input = (H first_name: "John", last_name: "Smith")
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -    #   a. The first parameter is how long the animation should take.
    -** Processing line: ~    #   b. The second parameter represents the functions that need to be called.~
    +    expected = <<-S
    +** Processing line: ~  {:first_name "John"~
     - Inside source: true
     *** True Line Result
    -    #   b. The second parameter represents the functions that need to be called.
    -** Processing line: ~    #~
    +  {:first_name "John"
    +** Processing line: ~   :last_name "Smith"}~
     - Inside source: true
     *** True Line Result
    -    #
    -** Processing line: ~    # For example, if I wanted an animate to start 3 seconds in, and last for 10 seconds,~
    +   :last_name "Smith"}
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    # For example, if I wanted an animate to start 3 seconds in, and last for 10 seconds,
    -** Processing line: ~    # and I want to animation to start fast and end slow, I would do:~
    +  S
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    # and I want to animation to start fast and end slow, I would do:
    -** Processing line: ~    # (60 * 3).ease(60 * 10, :flip, :quint, :flip)~
    +
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    # (60 * 3).ease(60 * 10, :flip, :quint, :flip)
    +    (assert_format args, assert, input, expected)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    #        initial value           delta to the final value~
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    #        initial value           delta to the final value
    -** Processing line: ~    calc_x = args.state.starting_x + (args.state.target_x - args.state.starting_x) * progress~
    +    # =============================
    +** Processing line: ~    # hash with inner hash~
     - Inside source: true
     *** True Line Result
    -    calc_x = args.state.starting_x + (args.state.target_x - args.state.starting_x) * progress
    -** Processing line: ~    calc_y = args.state.starting_y + (args.state.target_y - args.state.starting_y) * progress~
    +    # hash with inner hash
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    calc_y = args.state.starting_y + (args.state.target_y - args.state.starting_y) * progress
    -** Processing line: ~    calc_w = args.state.starting_w + (args.state.target_w - args.state.starting_w) * progress~
    +    # =============================
    +** Processing line: ~    input = (H first_name: "John",~
     - Inside source: true
     *** True Line Result
    -    calc_w = args.state.starting_w + (args.state.target_w - args.state.starting_w) * progress
    -** Processing line: ~    calc_h = args.state.starting_h + (args.state.target_h - args.state.starting_h) * progress~
    +    input = (H first_name: "John",
    +** Processing line: ~               last_name: "Smith",~
     - Inside source: true
     *** True Line Result
    -    calc_h = args.state.starting_h + (args.state.target_h - args.state.starting_h) * progress
    -** Processing line: ~~
    +               last_name: "Smith",
    +** Processing line: ~               middle_initial: "I",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.solids << [calc_x, calc_y, calc_w, calc_h, 0, 0, 0]~
    +               middle_initial: "I",
    +** Processing line: ~               so: (H first_name: "Pocahontas",~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [calc_x, calc_y, calc_w, calc_h, 0, 0, 0]
    -** Processing line: ~~
    +               so: (H first_name: "Pocahontas",
    +** Processing line: ~                      last_name: "Tsenacommacah"),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # count down~
    +                      last_name: "Tsenacommacah"),
    +** Processing line: ~               friends: (A (H first_name: "Side", last_name: "Kick"),~
     - Inside source: true
     *** True Line Result
    -    # count down
    -** Processing line: ~    count_down = args.state.start_animate_at - args.state.tick_count~
    +               friends: (A (H first_name: "Side", last_name: "Kick"),
    +** Processing line: ~                           (H first_name: "Tim", last_name: "Wizard")))~
     - Inside source: true
     *** True Line Result
    -    count_down = args.state.start_animate_at - args.state.tick_count
    -** Processing line: ~    if count_down > 0~
    +                           (H first_name: "Tim", last_name: "Wizard")))
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -    if count_down > 0
    -** Processing line: ~      args.outputs.labels << [640, 375, "Running: #{args.state.animation_type} in...", 3, 1]~
    +    expected = <<-S
    +** Processing line: ~  {:first_name "John"~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [640, 375, "Running: #{args.state.animation_type} in...", 3, 1]
    -** Processing line: ~      args.outputs.labels << [640, 345, "%.2f" % count_down.fdiv(60), 3, 1]~
    +  {:first_name "John"
    +** Processing line: ~   :last_name "Smith"~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [640, 345, "%.2f" % count_down.fdiv(60), 3, 1]
    -** Processing line: ~    elsif progress >= 1~
    +   :last_name "Smith"
    +** Processing line: ~   :middle_initial "I"~
     - Inside source: true
     *** True Line Result
    -    elsif progress >= 1
    -** Processing line: ~      args.outputs.labels << [640, 360, "Click screen to reset.", 3, 1]~
    +   :middle_initial "I"
    +** Processing line: ~   :so {:first_name "Pocahontas"~
     - Inside source: true
     *** True Line Result
    -      args.outputs.labels << [640, 360, "Click screen to reset.", 3, 1]
    -** Processing line: ~      if args.inputs.click~
    +   :so {:first_name "Pocahontas"
    +** Processing line: ~        :last_name "Tsenacommacah"}~
     - Inside source: true
     *** True Line Result
    -      if args.inputs.click
    -** Processing line: ~        $gtk.reset~
    +        :last_name "Tsenacommacah"}
    +** Processing line: ~   :friends [{:first_name "Side"~
     - Inside source: true
     *** True Line Result
    -        $gtk.reset
    -** Processing line: ~      end~
    +   :friends [{:first_name "Side"
    +** Processing line: ~              :last_name "Kick"}~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +              :last_name "Kick"}
    +** Processing line: ~             {:first_name "Tim"~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +             {:first_name "Tim"
    +** Processing line: ~              :last_name "Wizard"}]}~
     - Inside source: true
     *** True Line Result
    -  end
    +              :last_name "Wizard"}]}
    +** Processing line: ~  S~
    +- Inside source: true
    +*** True Line Result
    +  S
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # $gtk.reset~
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -  # $gtk.reset
    +    (assert_format args, assert, input, expected)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # you can make own variations of animations using this~
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -  # you can make own variations of animations using this
    -** Processing line: ~  module Easing~
    +    # =============================
    +** Processing line: ~    # array with one value~
     - Inside source: true
     *** True Line Result
    -  module Easing
    -** Processing line: ~    # you have access to all the built in functions: identity, flip, quad, cube, quart, quint~
    +    # array with one value
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    # you have access to all the built in functions: identity, flip, quad, cube, quart, quint
    -** Processing line: ~    def self.smoothest_start x~
    +    # =============================
    +** Processing line: ~    input = (A 1)~
     - Inside source: true
     *** True Line Result
    -    def self.smoothest_start x
    -** Processing line: ~      quad(quint(x))~
    +    input = (A 1)
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -      quad(quint(x))
    -** Processing line: ~    end~
    +    expected = <<-S
    +** Processing line: ~  [1]~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  [1]
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def self.smoothest_stop x~
    +  S
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    def self.smoothest_stop x
    -** Processing line: ~      flip(quad(quint(flip(x))))~
    +    (assert_format args, assert, input, expected)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      flip(quad(quint(flip(x))))
    -** Processing line: ~    end~
    +
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    # =============================
    +** Processing line: ~    # array with multiple values~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # this is the source for the existing easing functions~
    +    # array with multiple values
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    # this is the source for the existing easing functions
    -** Processing line: ~    def self.identity x~
    +    # =============================
    +** Processing line: ~    input = (A 1, 2, 3)~
     - Inside source: true
     *** True Line Result
    -    def self.identity x
    -** Processing line: ~      x~
    +    input = (A 1, 2, 3)
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -      x
    -** Processing line: ~    end~
    +    expected = <<-S
    +** Processing line: ~  [1~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  [1
    +** Processing line: ~   2~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def self.flip x~
    +   2
    +** Processing line: ~   3]~
     - Inside source: true
     *** True Line Result
    -    def self.flip x
    -** Processing line: ~      1 - x~
    +   3]
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -      1 - x
    -** Processing line: ~    end~
    +  S
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    end
    +    (assert_format args, assert, input, expected)
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def self.quad x~
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    def self.quad x
    -** Processing line: ~      x * x~
    +    # =============================
    +** Processing line: ~    # array with multiple values hashes~
     - Inside source: true
     *** True Line Result
    -      x * x
    -** Processing line: ~    end~
    +    # array with multiple values hashes
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    # =============================
    +** Processing line: ~    input = (A (H first_name: "Side", last_name: "Kick"),~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def self.cube x~
    +    input = (A (H first_name: "Side", last_name: "Kick"),
    +** Processing line: ~               (H first_name: "Tim", last_name: "Wizard"))~
     - Inside source: true
     *** True Line Result
    -    def self.cube x
    -** Processing line: ~      x * x * x~
    +               (H first_name: "Tim", last_name: "Wizard"))
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -      x * x * x
    -** Processing line: ~    end~
    +    expected = <<-S
    +** Processing line: ~  [{:first_name "Side"~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +  [{:first_name "Side"
    +** Processing line: ~    :last_name "Kick"}~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    def self.quart x~
    +    :last_name "Kick"}
    +** Processing line: ~   {:first_name "Tim"~
     - Inside source: true
     *** True Line Result
    -    def self.quart x
    -** Processing line: ~      x * x * x * x * x~
    +   {:first_name "Tim"
    +** Processing line: ~    :last_name "Wizard"}]~
     - Inside source: true
     *** True Line Result
    -      x * x * x * x * x
    -** Processing line: ~    end~
    +    :last_name "Wizard"}]
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    end
    +  S
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    def self.quint x~
    -- Inside source: true
    -*** True Line Result
    -    def self.quint x
    -** Processing line: ~      x * x * x * x * x * x~
    -- Inside source: true
    -*** True Line Result
    -      x * x * x * x * x * x
    -** Processing line: ~    end~
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    end
    +    (assert_format args, assert, input, expected)
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52248,126 +60787,102 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Tweening Lerping Easing Functions - Cubic Bezier - main.rb~
    -- Header detected.
    -*** True Line Result
    -
    -*** True Line Result
    -*** Tweening Lerping Easing Functions - Cubic Bezier - 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/08_tweening_lerping_easing_functions/02_cubic_bezier/app/main.rb~
    -- Inside source: true
    -*** True Line Result
    -  # ./samples/08_tweening_lerping_easing_functions/02_cubic_bezier/app/main.rb
    -** Processing line: ~  def tick args~
    +** Processing line: ~  def test_nested_nested args, assert~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.outputs.background_color = [33, 33, 33]~
    +  def test_nested_nested args, assert
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [33, 33, 33]
    -** Processing line: ~    args.outputs.lines << bezier(100, 100,~
    +    # =============================
    +** Processing line: ~    # nested array in nested hash~
     - Inside source: true
     *** True Line Result
    -    args.outputs.lines << bezier(100, 100,
    -** Processing line: ~                                 100, 620,~
    +    # nested array in nested hash
    +** Processing line: ~    # =============================~
     - Inside source: true
     *** True Line Result
    -                                 100, 620,
    -** Processing line: ~                                 1180, 620,~
    +    # =============================
    +** Processing line: ~    input = (H type: :root,~
     - Inside source: true
     *** True Line Result
    -                                 1180, 620,
    -** Processing line: ~                                 1180, 100,~
    +    input = (H type: :root,
    +** Processing line: ~               text: "Root",~
     - Inside source: true
     *** True Line Result
    -                                 1180, 100,
    -** Processing line: ~                                 0)~
    +               text: "Root",
    +** Processing line: ~               children: (A (H level: 1,~
     - Inside source: true
     *** True Line Result
    -                                 0)
    -** Processing line: ~~
    +               children: (A (H level: 1,
    +** Processing line: ~                               text: "Level 1",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.lines << bezier(100, 100,~
    +                               text: "Level 1",
    +** Processing line: ~                               children: (A (H level: 2,~
     - Inside source: true
     *** True Line Result
    -    args.outputs.lines << bezier(100, 100,
    -** Processing line: ~                                 100, 620,~
    +                               children: (A (H level: 2,
    +** Processing line: ~                                               text: "Level 2",~
     - Inside source: true
     *** True Line Result
    -                                 100, 620,
    -** Processing line: ~                                 1180, 620,~
    +                                               text: "Level 2",
    +** Processing line: ~                                               children: [])))))~
     - Inside source: true
     *** True Line Result
    -                                 1180, 620,
    -** Processing line: ~                                 1180, 100,~
    +                                               children: [])))))
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -                                 1180, 100,
    -** Processing line: ~                                 20)~
    +
    +** Processing line: ~    expected = <<-S~
     - Inside source: true
     *** True Line Result
    -                                 20)
    -** Processing line: ~  end~
    +    expected = <<-S
    +** Processing line: ~  {:type :root~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +  {:type :root
    +** Processing line: ~   :text "Root"~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~~
    +   :text "Root"
    +** Processing line: ~   :children [{:level 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def bezier x1, y1, x2, y2, x3, y3, x4, y4, step~
    +   :children [{:level 1
    +** Processing line: ~               :text "Level 1"~
     - Inside source: true
     *** True Line Result
    -  def bezier x1, y1, x2, y2, x3, y3, x4, y4, step
    -** Processing line: ~    step ||= 0~
    +               :text "Level 1"
    +** Processing line: ~               :children [{:level 2~
     - Inside source: true
     *** True Line Result
    -    step ||= 0
    -** Processing line: ~    color = [200, 200, 200]~
    +               :children [{:level 2
    +** Processing line: ~                           :text "Level 2"~
     - Inside source: true
     *** True Line Result
    -    color = [200, 200, 200]
    -** Processing line: ~    points = points_for_bezier [x1, y1], [x2, y2], [x3, y3], [x4, y4], step~
    +                           :text "Level 2"
    +** Processing line: ~                           :children []}]}]}~
     - Inside source: true
     *** True Line Result
    -    points = points_for_bezier [x1, y1], [x2, y2], [x3, y3], [x4, y4], step
    +                           :children []}]}]}
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    points.each_cons(2).map do |p1, p2|~
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    points.each_cons(2).map do |p1, p2|
    -** Processing line: ~      [p1, p2, color]~
    +  S
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [p1, p2, color]
    -** Processing line: ~    end~
    +
    +** Processing line: ~    (assert_format args, assert, input, expected)~
     - Inside source: true
     *** True Line Result
    -    end
    +    (assert_format args, assert, input, expected)
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52376,98 +60891,86 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def points_for_bezier p1, p2, p3, p4, step~
    -- Inside source: true
    -*** True Line Result
    -  def points_for_bezier p1, p2, p3, p4, step
    -** Processing line: ~    points = []~
    -- Inside source: true
    -*** True Line Result
    -    points = []
    -** Processing line: ~    if step == 0~
    -- Inside source: true
    -*** True Line Result
    -    if step == 0
    -** Processing line: ~      [p1, p2, p3, p4]~
    +** Processing line: ~  def test_scene args, assert~
     - Inside source: true
     *** True Line Result
    -      [p1, p2, p3, p4]
    -** Processing line: ~    else~
    +  def test_scene args, assert
    +** Processing line: ~    script = <<-S~
     - Inside source: true
     *** True Line Result
    -    else
    -** Processing line: ~      t_step = 1.fdiv(step + 1)~
    +    script = <<-S
    +** Processing line: ~  * Scene 1~
     - Inside source: true
     *** True Line Result
    -      t_step = 1.fdiv(step + 1)
    -** Processing line: ~      t = 0~
    +  * Scene 1
    +** Processing line: ~  ** Narrator~
     - Inside source: true
     *** True Line Result
    -      t = 0
    -** Processing line: ~      t += t_step~
    +  ** Narrator
    +** Processing line: ~  They say happy endings don't exist.~
     - Inside source: true
     *** True Line Result
    -      t += t_step
    -** Processing line: ~      points = []~
    +  They say happy endings don't exist.
    +** Processing line: ~  ** Narrator~
     - Inside source: true
     *** True Line Result
    -      points = []
    -** Processing line: ~      while t < 1~
    +  ** Narrator
    +** Processing line: ~  They say true love is a lie.~
     - Inside source: true
     *** True Line Result
    -      while t < 1
    -** Processing line: ~        points << [~
    +  They say true love is a lie.
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -        points << [
    -** Processing line: ~          b_for_t(p1.x, p2.x, p3.x, p4.x, t),~
    +  S
    +** Processing line: ~    input = parse_org args, script~
     - Inside source: true
     *** True Line Result
    -          b_for_t(p1.x, p2.x, p3.x, p4.x, t),
    -** Processing line: ~          b_for_t(p1.y, p2.y, p3.y, p4.y, t),~
    +    input = parse_org args, script
    +** Processing line: ~    puts (args.fn.pretty_format input)~
     - Inside source: true
     *** True Line Result
    -          b_for_t(p1.y, p2.y, p3.y, p4.y, t),
    -** Processing line: ~        ]~
    +    puts (args.fn.pretty_format input)
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -        ]
    -** Processing line: ~        t += t_step~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        t += t_step
    -** Processing line: ~      end~
    -- Inside source: true
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -      end
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~      [~
    -- Inside source: true
    +** Processing line: ~*** Advanced Debugging - Unit Tests - require_tests.rb~
    +- Header detected.
     *** True Line Result
    -      [
    -** Processing line: ~        p1,~
    -- Inside source: true
    +
     *** True Line Result
    -        p1,
    -** Processing line: ~        *points,~
    -- Inside source: true
    +*** Advanced Debugging - Unit Tests - require_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
    -        *points,
    -** Processing line: ~        p4~
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb~
     - Inside source: true
     *** True Line Result
    -        p4
    -** Processing line: ~      ]~
    +  # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb
    +** Processing line: ~  def write_src path, src~
     - Inside source: true
     *** True Line Result
    -      ]
    -** Processing line: ~    end~
    +  def write_src path, src
    +** Processing line: ~    $gtk.write_file path, src~
     - Inside source: true
     *** True Line Result
    -    end
    +    $gtk.write_file path, src
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52476,142 +60979,138 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def b_for_t v0, v1, v2, v3, t~
    -- Inside source: true
    -*** True Line Result
    -  def b_for_t v0, v1, v2, v3, t
    -** Processing line: ~    pow(1 - t, 3) * v0 +~
    +** Processing line: ~  write_src 'app/unit_testing_game.rb', <<-S~
     - Inside source: true
     *** True Line Result
    -    pow(1 - t, 3) * v0 +
    -** Processing line: ~    3 * pow(1 - t, 2) * t * v1 +~
    +  write_src 'app/unit_testing_game.rb', <<-S
    +** Processing line: ~  module UnitTesting~
     - Inside source: true
     *** True Line Result
    -    3 * pow(1 - t, 2) * t * v1 +
    -** Processing line: ~    3 * (1 - t) * pow(t, 2) * v2 +~
    +  module UnitTesting
    +** Processing line: ~    class Game~
     - Inside source: true
     *** True Line Result
    -    3 * (1 - t) * pow(t, 2) * v2 +
    -** Processing line: ~    pow(t, 3) * v3~
    +    class Game
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    pow(t, 3) * v3
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
       end
    +** Processing line: ~  S~
    +- Inside source: true
    +*** True Line Result
    +  S
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def pow n, to~
    +** Processing line: ~  write_src 'lib/unit_testing_lib.rb', <<-S~
     - Inside source: true
     *** True Line Result
    -  def pow n, to
    -** Processing line: ~    n ** to~
    +  write_src 'lib/unit_testing_lib.rb', <<-S
    +** Processing line: ~  module UnitTesting~
     - Inside source: true
     *** True Line Result
    -    n ** to
    +  module UnitTesting
    +** Processing line: ~    class Lib~
    +- Inside source: true
    +*** True Line Result
    +    class Lib
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
       end
    -** Processing line: ~~
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +  S
     ** Processing line: ~~
    -- End of paragraph detected.
    -*** True Line Result
    -
    -** Processing line: ~*** Tweening Lerping Easing Functions - Easing Using Spline - main.rb~
    -- Header detected.
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~  write_src 'app/nested/unit_testing_nested.rb', <<-S~
    +- Inside source: true
     *** True Line Result
    -*** Tweening Lerping Easing Functions - Easing Using Spline - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    -*** True Line Result
    -
    +  write_src 'app/nested/unit_testing_nested.rb', <<-S
    +** Processing line: ~  module UnitTesting~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/03_easing_using_spline/app/main.rb~
    +  module UnitTesting
    +** Processing line: ~    class Nested~
     - Inside source: true
     *** True Line Result
    -  # ./samples/08_tweening_lerping_easing_functions/03_easing_using_spline/app/main.rb
    -** Processing line: ~  def tick args~
    +    class Nested
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.duration = 10.seconds~
    +    end
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.state.duration = 10.seconds
    -** Processing line: ~    args.state.spline = [~
    +  end
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    args.state.spline = [
    -** Processing line: ~      [0.0, 0.33, 0.66, 1.0],~
    +  S
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      [0.0, 0.33, 0.66, 1.0],
    -** Processing line: ~      [1.0, 1.0,  1.0,  1.0],~
    +
    +** Processing line: ~  require 'app/unit_testing_game.rb'~
     - Inside source: true
     *** True Line Result
    -      [1.0, 1.0,  1.0,  1.0],
    -** Processing line: ~      [1.0, 0.66, 0.33, 0.0],~
    +  require 'app/unit_testing_game.rb'
    +** Processing line: ~  require 'app/nested/unit_testing_nested.rb'~
     - Inside source: true
     *** True Line Result
    -      [1.0, 0.66, 0.33, 0.0],
    -** Processing line: ~    ]~
    +  require 'app/nested/unit_testing_nested.rb'
    +** Processing line: ~  require 'lib/unit_testing_lib.rb'~
     - Inside source: true
     *** True Line Result
    -    ]
    +  require 'lib/unit_testing_lib.rb'
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.simulation_tick = args.state.tick_count % args.state.duration~
    -- Inside source: true
    -*** True Line Result
    -    args.state.simulation_tick = args.state.tick_count % args.state.duration
    -** Processing line: ~    progress = 0.ease_spline_extended args.state.simulation_tick, args.state.duration, args.state.spline~
    +** Processing line: ~  def test_require args, assert~
     - Inside source: true
     *** True Line Result
    -    progress = 0.ease_spline_extended args.state.simulation_tick, args.state.duration, args.state.spline
    -** Processing line: ~    args.outputs.borders << args.grid.rect~
    +  def test_require args, assert
    +** Processing line: ~    UnitTesting::Game.new~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.grid.rect
    -** Processing line: ~    args.outputs.solids << [20 + 1240 * progress,~
    +    UnitTesting::Game.new
    +** Processing line: ~    UnitTesting::Lib.new~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << [20 + 1240 * progress,
    -** Processing line: ~                            20 +  680 * progress,~
    +    UnitTesting::Lib.new
    +** Processing line: ~    UnitTesting::Nested.new~
     - Inside source: true
     *** True Line Result
    -                            20 +  680 * progress,
    -** Processing line: ~                            20, 20].anchor_rect(0.5, 0.5)~
    +    UnitTesting::Nested.new
    +** Processing line: ~    $gtk.exec 'rm ./mygame/app/unit_testing_game.rb'~
     - Inside source: true
     *** True Line Result
    -                            20, 20].anchor_rect(0.5, 0.5)
    -** Processing line: ~    args.outputs.labels << [10,~
    +    $gtk.exec 'rm ./mygame/app/unit_testing_game.rb'
    +** Processing line: ~    $gtk.exec 'rm ./mygame/app/nested/unit_testing_nested.rb'~
     - Inside source: true
     *** True Line Result
    -    args.outputs.labels << [10,
    -** Processing line: ~                            710,~
    +    $gtk.exec 'rm ./mygame/app/nested/unit_testing_nested.rb'
    +** Processing line: ~    $gtk.exec 'rm ./mygame/lib/unit_testing_lib.rb'~
     - Inside source: true
     *** True Line Result
    -                            710,
    -** Processing line: ~                            "perc: #{"%.2f" % (args.state.simulation_tick / args.state.duration)} t: #{args.state.simulation_tick}"]~
    +    $gtk.exec 'rm ./mygame/lib/unit_testing_lib.rb'
    +** Processing line: ~    assert.ok!~
     - Inside source: true
     *** True Line Result
    -                            "perc: #{"%.2f" % (args.state.simulation_tick / args.state.duration)} t: #{args.state.simulation_tick}"]
    +    assert.ok!
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52628,66 +61127,106 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +*** Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb
    +** Processing line: ~  def test_serialize args, assert~
    +- Inside source: true
    +*** True Line Result
    +  def test_serialize args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
    +- Inside source: true
    +*** True Line Result
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.player_one = "test"~
    +- Inside source: true
    +*** True Line Result
    +    args.state.player_one = "test"
    +** 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.equal! result, "{:entity_id=>3, :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\"}"
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    GTK::Entity.__reset_id__!~
    +- Inside source: true
    +*** True Line Result
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.gtk.write_file 'state.txt', ''~
    +- Inside source: true
     *** True Line Result
    -
    +    args.gtk.write_file 'state.txt', ''
    +** Processing line: ~    result = args.gtk.serialize_state 'state.txt', args.state~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/08_tweening_lerping_easing_functions/04_parametric_enemy_movement/app/main.rb~
    +    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\"}"~
     - Inside source: true
     *** True Line Result
    -  # ./samples/08_tweening_lerping_easing_functions/04_parametric_enemy_movement/app/main.rb
    -** Processing line: ~  def new_star args~
    +    assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -  def new_star args
    -** Processing line: ~    { x: 1280.randomize(:ratio),~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    { x: 1280.randomize(:ratio),
    -** Processing line: ~      starting_y: 800,~
    +
    +** Processing line: ~  def test_deserialize args, assert~
     - Inside source: true
     *** True Line Result
    -      starting_y: 800,
    -** Processing line: ~      distance_to_travel: 900 + 100.randomize(:ratio),~
    +  def test_deserialize args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      distance_to_travel: 900 + 100.randomize(:ratio),
    -** Processing line: ~      duration: 100.randomize(:ratio) + 60,~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    result = args.gtk.deserialize_state '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'~
     - Inside source: true
     *** True Line Result
    -      duration: 100.randomize(:ratio) + 60,
    -** Processing line: ~      created_at: args.state.tick_count,~
    +    result = args.gtk.deserialize_state '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'
    +** Processing line: ~    assert.equal! result.player_one, "test"~
     - Inside source: true
     *** True Line Result
    -      created_at: args.state.tick_count,
    -** Processing line: ~      max_alpha: 128.randomize(:ratio) + 128,~
    +    assert.equal! result.player_one, "test"
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      max_alpha: 128.randomize(:ratio) + 128,
    -** Processing line: ~      b: 255.randomize(:ratio),~
    +
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      b: 255.randomize(:ratio),
    -** Processing line: ~      g: 200.randomize(:ratio),~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.gtk.write_file 'state.txt',  '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'~
     - Inside source: true
     *** True Line Result
    -      g: 200.randomize(:ratio),
    -** Processing line: ~      w: 1.randomize(:ratio) + 1,~
    +    args.gtk.write_file 'state.txt',  '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'
    +** Processing line: ~    result = args.gtk.deserialize_state 'state.txt'~
     - Inside source: true
     *** True Line Result
    -      w: 1.randomize(:ratio) + 1,
    -** Processing line: ~      h: 1.randomize(:ratio) + 1 }~
    +    result = args.gtk.deserialize_state 'state.txt'
    +** Processing line: ~    assert.equal! result.player_one, "test"~
     - Inside source: true
     *** True Line Result
    -      h: 1.randomize(:ratio) + 1 }
    +    assert.equal! result.player_one, "test"
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52696,42 +61235,42 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def new_enemy args~
    +** Processing line: ~  def test_very_large_serialization args, assert~
     - Inside source: true
     *** True Line Result
    -  def new_enemy args
    -** Processing line: ~    { x: 1280.randomize(:ratio),~
    +  def test_very_large_serialization args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    { x: 1280.randomize(:ratio),
    -** Processing line: ~      starting_y: 800,~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    size = 3000~
     - Inside source: true
     *** True Line Result
    -      starting_y: 800,
    -** Processing line: ~      distance_to_travel: -900,~
    +    size = 3000
    +** Processing line: ~    size.map_with_index do |i|~
     - Inside source: true
     *** True Line Result
    -      distance_to_travel: -900,
    -** Processing line: ~      duration: 60.randomize(:ratio) + 180,~
    +    size.map_with_index do |i|
    +** Processing line: ~      args.state.send("k#{i}=".to_sym, i)~
     - Inside source: true
     *** True Line Result
    -      duration: 60.randomize(:ratio) + 180,
    -** Processing line: ~      created_at: args.state.tick_count,~
    +      args.state.send("k#{i}=".to_sym, i)
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      created_at: args.state.tick_count,
    -** Processing line: ~      w: 32,~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      w: 32,
    -** Processing line: ~      h: 32,~
    +
    +** Processing line: ~    result = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -      h: 32,
    -** Processing line: ~      fire_rate: (30.randomize(:ratio) + (60 - args.state.score)).to_i }~
    +    result = args.gtk.serialize_state args.state
    +** Processing line: ~    assert.true! (args.gtk.console.log.join.include? "unlikely a string this large will deserialize correctly")~
     - Inside source: true
     *** True Line Result
    -      fire_rate: (30.randomize(:ratio) + (60 - args.state.score)).to_i }
    +    assert.true! (args.gtk.console.log.join.include? "unlikely a string this large will deserialize correctly")
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52740,78 +61279,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def new_bullet args, starting_x, starting_y, enemy_speed~
    -- Inside source: true
    -*** True Line Result
    -  def new_bullet args, starting_x, starting_y, enemy_speed
    -** Processing line: ~    { x: starting_x,~
    -- Inside source: true
    -*** True Line Result
    -    { x: starting_x,
    -** Processing line: ~      starting_y: starting_y,~
    +** Processing line: ~  def test_strict_entity_serialization args, assert~
     - Inside source: true
     *** True Line Result
    -      starting_y: starting_y,
    -** Processing line: ~      distance_to_travel: -900,~
    +  def test_strict_entity_serialization args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      distance_to_travel: -900,
    -** Processing line: ~      created_at: args.state.tick_count,~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.player_one = args.state.new_entity(:player, name: "Ryu")~
     - Inside source: true
     *** True Line Result
    -      created_at: args.state.tick_count,
    -** Processing line: ~      duration: 900 / (enemy_speed.abs + 2.0 + (5.0 * args.state.score.fdiv(100))).abs,~
    +    args.state.player_one = args.state.new_entity(:player, name: "Ryu")
    +** Processing line: ~    args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken")~
     - Inside source: true
     *** True Line Result
    -      duration: 900 / (enemy_speed.abs + 2.0 + (5.0 * args.state.score.fdiv(100))).abs,
    -** Processing line: ~      w: 5,~
    +    args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      w: 5,
    -** Processing line: ~      h: 5 }~
    +
    +** Processing line: ~    serialized_state = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -      h: 5 }
    -** Processing line: ~  end~
    +    serialized_state = args.gtk.serialize_state args.state
    +** Processing line: ~    assert.equal! serialized_state, '{:entity_id=>1, :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=>3, :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"}}'~
     - Inside source: true
     *** True Line Result
    -  end
    +    assert.equal! serialized_state, '{:entity_id=>1, :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=>3, :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"}}'
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def new_player_bullet args, starting_x, starting_y, player_speed~
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -  def new_player_bullet args, starting_x, starting_y, player_speed
    -** Processing line: ~    { x: starting_x,~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    deserialize_state = args.gtk.deserialize_state serialized_state~
     - Inside source: true
     *** True Line Result
    -    { x: starting_x,
    -** Processing line: ~      starting_y: starting_y,~
    +    deserialize_state = args.gtk.deserialize_state serialized_state
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      starting_y: starting_y,
    -** Processing line: ~      distance_to_travel: 900,~
    +
    +** Processing line: ~    assert.equal! args.state.player_one.name, deserialize_state.player_one.name~
     - Inside source: true
     *** True Line Result
    -      distance_to_travel: 900,
    -** Processing line: ~      created_at: args.state.tick_count,~
    +    assert.equal! args.state.player_one.name, deserialize_state.player_one.name
    +** Processing line: ~    assert.true! args.state.player_one.is_a? GTK::OpenEntity~
     - Inside source: true
     *** True Line Result
    -      created_at: args.state.tick_count,
    -** Processing line: ~      duration: 900 / (player_speed + 2.0),~
    +    assert.true! args.state.player_one.is_a? GTK::OpenEntity
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      duration: 900 / (player_speed + 2.0),
    -** Processing line: ~      w: 5,~
    +
    +** Processing line: ~    assert.equal! args.state.player_two.name, deserialize_state.player_two.name~
     - Inside source: true
     *** True Line Result
    -      w: 5,
    -** Processing line: ~      h: 5 }~
    +    assert.equal! args.state.player_two.name, deserialize_state.player_two.name
    +** Processing line: ~    assert.true! args.state.player_two.is_a? GTK::StrictEntity~
     - Inside source: true
     *** True Line Result
    -      h: 5 }
    +    assert.true! args.state.player_two.is_a? GTK::StrictEntity
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52820,130 +61351,146 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def defaults args~
    +** Processing line: ~  def test_strict_entity_serialization_with_nil args, assert~
     - Inside source: true
     *** True Line Result
    -  def defaults args
    -** Processing line: ~    args.outputs.background_color  = [0, 0, 0]~
    +  def test_strict_entity_serialization_with_nil args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color  = [0, 0, 0]
    -** Processing line: ~    args.state.score             ||= 0~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.player_one = args.state.new_entity(:player, name: "Ryu")~
     - Inside source: true
     *** True Line Result
    -    args.state.score             ||= 0
    -** Processing line: ~    args.state.stars             ||= []~
    +    args.state.player_one = args.state.new_entity(:player, name: "Ryu")
    +** Processing line: ~    args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)~
     - Inside source: true
     *** True Line Result
    -    args.state.stars             ||= []
    -** Processing line: ~    args.state.enemies           ||= []~
    +    args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.enemies           ||= []
    -** Processing line: ~    args.state.bullets           ||= []~
    +
    +** Processing line: ~    serialized_state = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets           ||= []
    -** Processing line: ~    args.state.player_bullets    ||= []~
    +    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}}'~
     - Inside source: true
     *** True Line Result
    -    args.state.player_bullets    ||= []
    -** Processing line: ~    args.state.max_stars           = 50~
    +    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: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.max_stars           = 50
    -** Processing line: ~    args.state.max_enemies         = 10~
    +
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    args.state.max_enemies         = 10
    -** Processing line: ~    args.state.player.x          ||= 640~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    deserialized_state = args.gtk.deserialize_state serialized_state~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x          ||= 640
    -** Processing line: ~    args.state.player.y          ||= 100~
    +    deserialized_state = args.gtk.deserialize_state serialized_state
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y          ||= 100
    -** Processing line: ~    args.state.player.w          ||= 32~
    +
    +** Processing line: ~    assert.equal! args.state.player_one.name, deserialized_state.player_one.name~
     - Inside source: true
     *** True Line Result
    -    args.state.player.w          ||= 32
    -** Processing line: ~    args.state.player.h          ||= 32~
    +    assert.equal! args.state.player_one.name, deserialized_state.player_one.name
    +** Processing line: ~    assert.true! args.state.player_one.is_a? GTK::OpenEntity~
     - Inside source: true
     *** True Line Result
    -    args.state.player.h          ||= 32
    +    assert.true! args.state.player_one.is_a? GTK::OpenEntity
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.tick_count == 0~
    +** Processing line: ~    assert.equal! args.state.player_two.name, deserialized_state.player_two.name~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count == 0
    -** Processing line: ~      args.state.stars.clear~
    +    assert.equal! args.state.player_two.name, deserialized_state.player_two.name
    +** Processing line: ~    assert.equal! args.state.player_two.blood_type, deserialized_state.player_two.blood_type~
     - Inside source: true
     *** True Line Result
    -      args.state.stars.clear
    -** Processing line: ~      args.state.max_stars.times do~
    +    assert.equal! args.state.player_two.blood_type, deserialized_state.player_two.blood_type
    +** Processing line: ~    assert.equal! deserialized_state.player_two.blood_type, nil~
     - Inside source: true
     *** True Line Result
    -      args.state.max_stars.times do
    -** Processing line: ~        s = new_star args~
    +    assert.equal! deserialized_state.player_two.blood_type, nil
    +** Processing line: ~    assert.true! args.state.player_two.is_a? GTK::StrictEntity~
     - Inside source: true
     *** True Line Result
    -        s = new_star args
    -** Processing line: ~        s[:created_at] += s[:duration].randomize(:ratio)~
    +    assert.true! args.state.player_two.is_a? GTK::StrictEntity
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s[:created_at] += s[:duration].randomize(:ratio)
    -** Processing line: ~        args.state.stars << s~
    +
    +** Processing line: ~    deserialized_state.player_two.blood_type = :O~
     - Inside source: true
     *** True Line Result
    -        args.state.stars << s
    -** Processing line: ~      end~
    +    deserialized_state.player_two.blood_type = :O
    +** Processing line: ~    assert.equal! deserialized_state.player_two.blood_type, :O~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +    assert.equal! deserialized_state.player_two.blood_type, :O
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.state.tick_count == 0~
    +** Processing line: ~  def test_multiple_strict_entities args, assert~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count == 0
    -** Processing line: ~      args.state.enemies.clear~
    +  def test_multiple_strict_entities args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      args.state.enemies.clear
    -** Processing line: ~      args.state.max_enemies.times do~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.player = args.state.new_entity_strict(:player_one, name: "Ryu")~
     - Inside source: true
     *** True Line Result
    -      args.state.max_enemies.times do
    -** Processing line: ~        s = new_enemy args~
    +    args.state.player = args.state.new_entity_strict(:player_one, name: "Ryu")
    +** Processing line: ~    args.state.enemy = args.state.new_entity_strict(:enemy, name: "Bison", other_property: 'extra mean')~
     - Inside source: true
     *** True Line Result
    -        s = new_enemy args
    -** Processing line: ~        s[:created_at] += s[:duration].randomize(:ratio)~
    +    args.state.enemy = args.state.new_entity_strict(:enemy, name: "Bison", other_property: 'extra mean')
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -        s[:created_at] += s[:duration].randomize(:ratio)
    -** Processing line: ~        args.state.enemies << s~
    +
    +** Processing line: ~    serialized_state = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -        args.state.enemies << s
    -** Processing line: ~      end~
    +    serialized_state = args.gtk.serialize_state args.state
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      end
    -** Processing line: ~    end~
    +
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    end
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    deserialized_state = args.gtk.deserialize_state serialized_state~
    +- Inside source: true
    +*** True Line Result
    +    deserialized_state = args.gtk.deserialize_state serialized_state
    +** Processing line: ~~
    +- Inside source: true
    +*** True Line Result
    +
    +** Processing line: ~    assert.equal! deserialized_state.player.name, "Ryu"~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! deserialized_state.player.name, "Ryu"
    +** Processing line: ~    assert.equal! deserialized_state.enemy.other_property, "extra mean"~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! deserialized_state.enemy.other_property, "extra mean"
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -52952,106 +61499,106 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def input args~
    +** Processing line: ~  def test_by_reference_state args, assert~
     - Inside source: true
     *** True Line Result
    -  def input args
    -** Processing line: ~    if args.inputs.keyboard.left~
    +  def test_by_reference_state args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.left
    -** Processing line: ~      args.state.player.x -= 5~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.a = { name: "Jane Doe" }~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x -= 5
    -** Processing line: ~    elsif args.inputs.keyboard.right~
    +    args.state.a = { name: "Jane Doe" }
    +** Processing line: ~    args.state.b = args.state.a~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.right
    -** Processing line: ~      args.state.player.x += 5~
    +    args.state.b = args.state.a
    +** Processing line: ~    assert.equal! args.state.a.object_id, args.state.b.object_id~
     - Inside source: true
     *** True Line Result
    -      args.state.player.x += 5
    -** Processing line: ~    end~
    +    assert.equal! args.state.a.object_id, args.state.b.object_id
    +** Processing line: ~    serialized_state = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -    end
    +    serialized_state = args.gtk.serialize_state args.state
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.inputs.keyboard.up~
    -- Inside source: true
    -*** True Line Result
    -    if args.inputs.keyboard.up
    -** Processing line: ~      args.state.player.y += 5~
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y += 5
    -** Processing line: ~    elsif args.inputs.keyboard.down~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    deserialized_state = args.gtk.deserialize_state serialized_state~
     - Inside source: true
     *** True Line Result
    -    elsif args.inputs.keyboard.down
    -** Processing line: ~      args.state.player.y -= 5~
    +    deserialized_state = args.gtk.deserialize_state serialized_state
    +** Processing line: ~    assert.equal! deserialized_state.a.object_id, deserialized_state.b.object_id~
     - Inside source: true
     *** True Line Result
    -      args.state.player.y -= 5
    -** Processing line: ~    end~
    +    assert.equal! deserialized_state.a.object_id, deserialized_state.b.object_id
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    if args.inputs.keyboard.key_down.space~
    +** Processing line: ~  def test_by_reference_state_strict_entities args, assert~
     - Inside source: true
     *** True Line Result
    -    if args.inputs.keyboard.key_down.space
    -** Processing line: ~      args.state.player_bullets << new_player_bullet(args,~
    +  def test_by_reference_state_strict_entities args, assert
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -      args.state.player_bullets << new_player_bullet(args,
    -** Processing line: ~                                                     args.state.player.x + args.state.player.w.half,~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    args.state.a = { name: "Jane Doe" }~
     - Inside source: true
     *** True Line Result
    -                                                     args.state.player.x + args.state.player.w.half,
    -** Processing line: ~                                                     args.state.player.y + args.state.player.h, 5)~
    +    args.state.a = { name: "Jane Doe" }
    +** Processing line: ~    args.state.strict_entity = args.state.new_entity_strict(:couple) do |e|~
     - Inside source: true
     *** True Line Result
    -                                                     args.state.player.y + args.state.player.h, 5)
    -** Processing line: ~    end~
    +    args.state.strict_entity = args.state.new_entity_strict(:couple) do |e|
    +** Processing line: ~      e.one = args.state.new_entity_strict(:person, name: "Jane")~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      e.one = args.state.new_entity_strict(:person, name: "Jane")
    +** Processing line: ~      e.two = e.one~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.player.y = args.state.player.y.greater(0).lesser(720 - args.state.player.w)~
    +      e.two = e.one
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -    args.state.player.y = args.state.player.y.greater(0).lesser(720 - args.state.player.w)
    -** Processing line: ~    args.state.player.x = args.state.player.x.greater(0).lesser(1280 - args.state.player.h)~
    +    end
    +** Processing line: ~    assert.equal! args.state.strict_entity.one, args.state.strict_entity.two~
     - Inside source: true
     *** True Line Result
    -    args.state.player.x = args.state.player.x.greater(0).lesser(1280 - args.state.player.h)
    -** Processing line: ~  end~
    +    assert.equal! args.state.strict_entity.one, args.state.strict_entity.two
    +** Processing line: ~    serialized_state = args.gtk.serialize_state args.state~
     - Inside source: true
     *** True Line Result
    -  end
    +    serialized_state = args.gtk.serialize_state args.state
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def completed? entity~
    +** Processing line: ~    GTK::Entity.__reset_id__!~
     - Inside source: true
     *** True Line Result
    -  def completed? entity
    -** Processing line: ~    (entity[:created_at] + entity[:duration]).elapsed_time > 0~
    +    GTK::Entity.__reset_id__!
    +** Processing line: ~    deserialized_state = args.gtk.deserialize_state serialized_state~
     - Inside source: true
     *** True Line Result
    -    (entity[:created_at] + entity[:duration]).elapsed_time > 0
    +    deserialized_state = args.gtk.deserialize_state serialized_state
    +** Processing line: ~    assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two~
    +- Inside source: true
    +*** True Line Result
    +    assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53060,102 +61607,122 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def calc_stars args~
    -- Inside source: true
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
     *** True Line Result
    -  def calc_stars args
    -** Processing line: ~    if (stars_to_add = args.state.max_stars - args.state.stars.length) > 0~
    -- Inside source: true
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
     *** True Line Result
    -    if (stars_to_add = args.state.max_stars - args.state.stars.length) > 0
    -** Processing line: ~      stars_to_add.times { args.state.stars << new_star(args) }~
    -- Inside source: true
    +
    +** Processing line: ~*** Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb~
    +- Header detected.
     *** True Line Result
    -      stars_to_add.times { args.state.stars << new_star(args) }
    -** Processing line: ~    end~
    -- Inside source: true
    +
     *** True Line Result
    -    end
    -** Processing line: ~    args.state.stars = args.state.stars.reject { |s| completed? s }~
    +*** Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb~
     - Inside source: true
     *** True Line Result
    -    args.state.stars = args.state.stars.reject { |s| completed? s }
    -** Processing line: ~  end~
    +  # ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb
    +** Processing line: ~  MAX_CODE_GEN_LENGTH = 50~
     - Inside source: true
     *** True Line Result
    -  end
    +  MAX_CODE_GEN_LENGTH = 50
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def move_enemies args~
    +** Processing line: ~  # NOTE: This is experimental/advanced stuff.~
     - Inside source: true
     *** True Line Result
    -  def move_enemies args
    -** Processing line: ~    if (enemies_to_add = args.state.max_enemies - args.state.enemies.length) > 0~
    +  # NOTE: This is experimental/advanced stuff.
    +** Processing line: ~  def needs_partitioning? target~
     - Inside source: true
     *** True Line Result
    -    if (enemies_to_add = args.state.max_enemies - args.state.enemies.length) > 0
    -** Processing line: ~      enemies_to_add.times { args.state.enemies << new_enemy(args) }~
    +  def needs_partitioning? target
    +** Processing line: ~    target[:value].to_s.length > MAX_CODE_GEN_LENGTH~
     - Inside source: true
     *** True Line Result
    -      enemies_to_add.times { args.state.enemies << new_enemy(args) }
    -** Processing line: ~    end~
    +    target[:value].to_s.length > MAX_CODE_GEN_LENGTH
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.enemies = args.state.enemies.reject { |s| completed? s }~
    +** Processing line: ~  def partition target~
     - Inside source: true
     *** True Line Result
    -    args.state.enemies = args.state.enemies.reject { |s| completed? s }
    -** Processing line: ~  end~
    +  def partition target
    +** Processing line: ~    return [] unless needs_partitioning? target~
     - Inside source: true
     *** True Line Result
    -  end
    +    return [] unless needs_partitioning? target
    +** Processing line: ~    if target[:value].is_a? GTK::OpenEntity~
    +- Inside source: true
    +*** True Line Result
    +    if target[:value].is_a? GTK::OpenEntity
    +** Processing line: ~      target[:value] = target[:value].hash~
    +- Inside source: true
    +*** True Line Result
    +      target[:value] = target[:value].hash
    +** Processing line: ~    end~
    +- Inside source: true
    +*** True Line Result
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def move_bullets args~
    +** Processing line: ~    results = []~
     - Inside source: true
     *** True Line Result
    -  def move_bullets args
    -** Processing line: ~    args.state.enemies.each do |e|~
    +    results = []
    +** Processing line: ~    idx = 0~
     - Inside source: true
     *** True Line Result
    -    args.state.enemies.each do |e|
    -** Processing line: ~      if args.state.tick_count.mod_zero?(e[:fire_rate])~
    +    idx = 0
    +** Processing line: ~    left, right = target[:value].partition do~
     - Inside source: true
     *** True Line Result
    -      if args.state.tick_count.mod_zero?(e[:fire_rate])
    -** Processing line: ~        args.state.bullets << new_bullet(args, e[:x] + e[:w].half, current_y(e), e[:distance_to_travel] / e[:duration])~
    +    left, right = target[:value].partition do
    +** Processing line: ~      idx += 1~
     - Inside source: true
     *** True Line Result
    -        args.state.bullets << new_bullet(args, e[:x] + e[:w].half, current_y(e), e[:distance_to_travel] / e[:duration])
    -** Processing line: ~      end~
    +      idx += 1
    +** Processing line: ~      idx.even?~
     - Inside source: true
     *** True Line Result
    -      end
    +      idx.even?
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~~
    +** Processing line: ~    left, right = Hash[left], Hash[right]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.bullets = args.state.bullets.reject { |s| completed? s }~
    +    left, right = Hash[left], Hash[right]
    +** Processing line: ~    left = { value: left }~
     - Inside source: true
     *** True Line Result
    -    args.state.bullets = args.state.bullets.reject { |s| completed? s }
    -** Processing line: ~    args.state.player_bullets = args.state.player_bullets.reject { |s| completed? s }~
    +    left = { value: left }
    +** Processing line: ~    right = { value: right}~
     - Inside source: true
     *** True Line Result
    -    args.state.player_bullets = args.state.player_bullets.reject { |s| completed? s }
    +    right = { value: right}
    +** Processing line: ~    [left, right]~
    +- Inside source: true
    +*** True Line Result
    +    [left, right]
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53164,70 +61731,70 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def intersect? entity_one, entity_two~
    +** Processing line: ~  def add_partition target, path, aggregate, final_result~
     - Inside source: true
     *** True Line Result
    -  def intersect? entity_one, entity_two
    -** Processing line: ~    entity_one.merge(y: current_y(entity_one))~
    +  def add_partition target, path, aggregate, final_result
    +** Processing line: ~    partitions = partition target~
     - Inside source: true
     *** True Line Result
    -    entity_one.merge(y: current_y(entity_one))
    -** Processing line: ~              .intersect_rect? entity_two.merge(y: current_y(entity_two))~
    +    partitions = partition target
    +** Processing line: ~    partitions.each do |part|~
     - Inside source: true
     *** True Line Result
    -              .intersect_rect? entity_two.merge(y: current_y(entity_two))
    -** Processing line: ~  end~
    +    partitions.each do |part|
    +** Processing line: ~      if needs_partitioning? part~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      if needs_partitioning? part
    +** Processing line: ~        if part[:value].keys.length == 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def kill args~
    +        if part[:value].keys.length == 1
    +** Processing line: ~          first_key = part[:value].keys[0]~
     - Inside source: true
     *** True Line Result
    -  def kill args
    -** Processing line: ~    bullets_hitting_enemies = []~
    +          first_key = part[:value].keys[0]
    +** Processing line: ~          new_part = { value: part[:value][first_key] }~
     - Inside source: true
     *** True Line Result
    -    bullets_hitting_enemies = []
    -** Processing line: ~    dead_bullets = []~
    +          new_part = { value: part[:value][first_key] }
    +** Processing line: ~          path.push first_key~
     - Inside source: true
     *** True Line Result
    -    dead_bullets = []
    -** Processing line: ~    dead_enemies = []~
    +          path.push first_key
    +** Processing line: ~          add_partition new_part, path, aggregate, final_result~
     - Inside source: true
     *** True Line Result
    -    dead_enemies = []
    -** Processing line: ~~
    +          add_partition new_part, path, aggregate, final_result
    +** Processing line: ~          path.pop~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.state.player_bullets.each do |b|~
    +          path.pop
    +** Processing line: ~        else~
     - Inside source: true
     *** True Line Result
    -    args.state.player_bullets.each do |b|
    -** Processing line: ~      args.state.enemies.each do |e|~
    +        else
    +** Processing line: ~          add_partition part, path, aggregate, final_result~
     - Inside source: true
     *** True Line Result
    -      args.state.enemies.each do |e|
    -** Processing line: ~        if intersect? b, e~
    +          add_partition part, path, aggregate, final_result
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -        if intersect? b, e
    -** Processing line: ~          dead_bullets << b~
    +        end
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -          dead_bullets << b
    -** Processing line: ~          dead_enemies << e~
    +      else
    +** Processing line: ~        final_result << { value: { __path__: [*path] } }~
     - Inside source: true
     *** True Line Result
    -          dead_enemies << e
    -** Processing line: ~        end~
    +        final_result << { value: { __path__: [*path] } }
    +** Processing line: ~        final_result << { value: part[:value] }~
     - Inside source: true
     *** True Line Result
    -        end
    +        final_result << { value: part[:value] }
     ** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    @@ -53236,66 +61803,54 @@ 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: ~    args.state.score += dead_enemies.length~
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    args.state.score += dead_enemies.length
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.state.player_bullets.reject! { |b| dead_bullets.include? b }~
    -- Inside source: true
    -*** True Line Result
    -    args.state.player_bullets.reject! { |b| dead_bullets.include? b }
    -** Processing line: ~    args.state.enemies.reject! { |e| dead_enemies.include? e }~
    -- Inside source: true
    -*** True Line Result
    -    args.state.enemies.reject! { |e| dead_enemies.include? e }
    -** Processing line: ~~
    +** Processing line: ~  def state_to_string state~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    dead = args.state.bullets.any? do |b|~
    +  def state_to_string state
    +** Processing line: ~    parts_queue = []~
     - Inside source: true
     *** True Line Result
    -    dead = args.state.bullets.any? do |b|
    -** Processing line: ~      [args.state.player.x,~
    +    parts_queue = []
    +** Processing line: ~    final_queue = []~
     - Inside source: true
     *** True Line Result
    -      [args.state.player.x,
    -** Processing line: ~       args.state.player.y,~
    +    final_queue = []
    +** Processing line: ~    add_partition({ value: state.hash },~
     - Inside source: true
     *** True Line Result
    -       args.state.player.y,
    -** Processing line: ~       args.state.player.w,~
    +    add_partition({ value: state.hash },
    +** Processing line: ~                  [],~
     - Inside source: true
     *** True Line Result
    -       args.state.player.w,
    -** Processing line: ~       args.state.player.h].intersect_rect? b.merge(y: current_y(b))~
    +                  [],
    +** Processing line: ~                  parts_queue,~
     - Inside source: true
     *** True Line Result
    -       args.state.player.h].intersect_rect? b.merge(y: current_y(b))
    -** Processing line: ~    end~
    +                  parts_queue,
    +** Processing line: ~                  final_queue)~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~    return unless dead~
    +                  final_queue)
    +** Processing line: ~    final_queue.reject {|i| i[:value].keys.length == 0}.map do |i|~
     - Inside source: true
     *** True Line Result
    -    return unless dead
    -** Processing line: ~    args.gtk.reset~
    +    final_queue.reject {|i| i[:value].keys.length == 0}.map do |i|
    +** Processing line: ~      i[:value].to_s~
     - Inside source: true
     *** True Line Result
    -    args.gtk.reset
    -** Processing line: ~    defaults args~
    +      i[:value].to_s
    +** Processing line: ~    end.join("\n#==================================================#\n")~
     - Inside source: true
     *** True Line Result
    -    defaults args
    +    end.join("\n#==================================================#\n")
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53304,42 +61859,38 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def calc args~
    +** Processing line: ~  def state_from_string string~
     - Inside source: true
     *** True Line Result
    -  def calc args
    -** Processing line: ~    calc_stars args~
    +  def state_from_string string
    +** Processing line: ~    Kernel.eval("$load_data = {}")~
     - Inside source: true
     *** True Line Result
    -    calc_stars args
    -** Processing line: ~    move_enemies args~
    +    Kernel.eval("$load_data = {}")
    +** Processing line: ~    lines = string.split("\n#==================================================#\n")~
     - Inside source: true
     *** True Line Result
    -    move_enemies args
    -** Processing line: ~    move_bullets args~
    +    lines = string.split("\n#==================================================#\n")
    +** Processing line: ~    lines.each do |l|~
     - Inside source: true
     *** True Line Result
    -    move_bullets args
    -** Processing line: ~    kill args~
    +    lines.each do |l|
    +** Processing line: ~      puts "todo: #{l}"~
     - Inside source: true
     *** True Line Result
    -    kill args
    -** Processing line: ~  end~
    +      puts "todo: #{l}"
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def current_y entity~
    -- Inside source: true
    -*** True Line Result
    -  def current_y entity
    -** Processing line: ~    entity[:starting_y] + (entity[:distance_to_travel] * entity[:created_at].ease(entity[:duration], :identity))~
    +** Processing line: ~    GTK::OpenEntity.parse_from_hash $load_data~
     - Inside source: true
     *** True Line Result
    -    entity[:starting_y] + (entity[:distance_to_travel] * entity[:created_at].ease(entity[:duration], :identity))
    +    GTK::OpenEntity.parse_from_hash $load_data
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53348,50 +61899,50 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def render args~
    +** Processing line: ~  def test_save_and_load args, assert~
     - Inside source: true
     *** True Line Result
    -  def render args
    -** Processing line: ~    args.outputs.solids << args.state.stars.map do |s|~
    +  def test_save_and_load args, assert
    +** Processing line: ~    args.state.item_1.name = "Jane"~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.stars.map do |s|
    -** Processing line: ~      [s[:x],~
    +    args.state.item_1.name = "Jane"
    +** Processing line: ~    string = state_to_string args.state~
     - Inside source: true
     *** True Line Result
    -      [s[:x],
    -** Processing line: ~       current_y(s),~
    +    string = state_to_string args.state
    +** Processing line: ~    state = state_from_string string~
     - Inside source: true
     *** True Line Result
    -       current_y(s),
    -** Processing line: ~       s[:w], s[:h], 0, s[:g], s[:b], s[:max_alpha] * s[:created_at].ease(20, :identity)]~
    +    state = state_from_string string
    +** Processing line: ~    assert.equal! args.state.item_1.name, state.item_1.name~
     - Inside source: true
     *** True Line Result
    -       s[:w], s[:h], 0, s[:g], s[:b], s[:max_alpha] * s[:created_at].ease(20, :identity)]
    -** Processing line: ~    end~
    +    assert.equal! args.state.item_1.name, state.item_1.name
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    end
    +  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.borders << args.state.enemies.map do |s|~
    +** Processing line: ~  def test_save_and_load_big args, assert~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.enemies.map do |s|
    -** Processing line: ~      [s[:x],~
    +  def test_save_and_load_big args, assert
    +** Processing line: ~    size = 1000~
     - Inside source: true
     *** True Line Result
    -      [s[:x],
    -** Processing line: ~       current_y(s),~
    +    size = 1000
    +** Processing line: ~    size.map_with_index do |i|~
     - Inside source: true
     *** True Line Result
    -       current_y(s),
    -** Processing line: ~       s[:w], s[:h], 255, 0, 0]~
    +    size.map_with_index do |i|
    +** Processing line: ~      args.state.send("k#{i}=".to_sym, i)~
     - Inside source: true
     *** True Line Result
    -       s[:w], s[:h], 255, 0, 0]
    +      args.state.send("k#{i}=".to_sym, i)
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -53400,102 +61951,110 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    args.outputs.borders << args.state.bullets.map do |b|~
    +** Processing line: ~    string = state_to_string args.state~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.bullets.map do |b|
    -** Processing line: ~      [b[:x],~
    +    string = state_to_string args.state
    +** Processing line: ~    state = state_from_string string~
     - Inside source: true
     *** True Line Result
    -      [b[:x],
    -** Processing line: ~       current_y(b),~
    +    state = state_from_string string
    +** Processing line: ~    size.map_with_index do |i|~
     - Inside source: true
     *** True Line Result
    -       current_y(b),
    -** Processing line: ~       b[:w], b[:h], 255, 0, 0]~
    +    size.map_with_index do |i|
    +** Processing line: ~      assert.equal! args.state.send("k#{i}".to_sym), state.send("k#{i}".to_sym)~
     - Inside source: true
     *** True Line Result
    -       b[:w], b[:h], 255, 0, 0]
    +      assert.equal! args.state.send("k#{i}".to_sym), state.send("k#{i}".to_sym)
    +** Processing line: ~      assert.equal! args.state.send("k#{i}".to_sym), i~
    +- Inside source: true
    +*** True Line Result
    +      assert.equal! args.state.send("k#{i}".to_sym), i
    +** Processing line: ~      assert.equal! state.send("k#{i}".to_sym), i~
    +- Inside source: true
    +*** True Line Result
    +      assert.equal! state.send("k#{i}".to_sym), i
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
         end
    -** Processing line: ~~
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.outputs.borders << args.state.player_bullets.map do |b|~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.borders << args.state.player_bullets.map do |b|
    -** Processing line: ~      [b[:x],~
    +
    +** Processing line: ~  def test_save_and_load_big_nested args, assert~
     - Inside source: true
     *** True Line Result
    -      [b[:x],
    -** Processing line: ~       current_y(b),~
    +  def test_save_and_load_big_nested args, assert
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k0 = 0~
     - Inside source: true
     *** True Line Result
    -       current_y(b),
    -** Processing line: ~       b[:w], b[:h], 255, 255, 255]~
    +    args.state.player_one.friend.nested_hash.k0 = 0
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k1 = 1~
     - Inside source: true
     *** True Line Result
    -       b[:w], b[:h], 255, 255, 255]
    -** Processing line: ~    end~
    +    args.state.player_one.friend.nested_hash.k1 = 1
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k2 = 2~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +    args.state.player_one.friend.nested_hash.k2 = 2
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k3 = 3~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    args.borders << [args.state.player.x,~
    +    args.state.player_one.friend.nested_hash.k3 = 3
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k4 = 4~
     - Inside source: true
     *** True Line Result
    -    args.borders << [args.state.player.x,
    -** Processing line: ~                     args.state.player.y,~
    +    args.state.player_one.friend.nested_hash.k4 = 4
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k5 = 5~
     - Inside source: true
     *** True Line Result
    -                     args.state.player.y,
    -** Processing line: ~                     args.state.player.w,~
    +    args.state.player_one.friend.nested_hash.k5 = 5
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k6 = 6~
     - Inside source: true
     *** True Line Result
    -                     args.state.player.w,
    -** Processing line: ~                     args.state.player.h, 255, 255, 255]~
    +    args.state.player_one.friend.nested_hash.k6 = 6
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k7 = 7~
     - Inside source: true
     *** True Line Result
    -                     args.state.player.h, 255, 255, 255]
    -** Processing line: ~  end~
    +    args.state.player_one.friend.nested_hash.k7 = 7
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k8 = 8~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    args.state.player_one.friend.nested_hash.k8 = 8
    +** Processing line: ~    args.state.player_one.friend.nested_hash.k9 = 9~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def tick args~
    +    args.state.player_one.friend.nested_hash.k9 = 9
    +** Processing line: ~    string = state_to_string args.state~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    defaults args~
    +    string = state_to_string args.state
    +** Processing line: ~    state = state_from_string string~
     - Inside source: true
     *** True Line Result
    -    defaults args
    -** Processing line: ~    input args~
    +    state = state_from_string string
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -    input args
    -** Processing line: ~    calc args~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    calc args
    -** Processing line: ~    render args~
    +
    +** Processing line: ~  $gtk.reset 100~
     - Inside source: true
     *** True Line Result
    -    render args
    -** Processing line: ~  end~
    +  $gtk.reset 100
    +** Processing line: ~  $gtk.log_level = :off~
     - Inside source: true
     *** True Line Result
    -  end
    +  $gtk.log_level = :off
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -53508,82 +62067,74 @@ Follows is a source code listing for all files that have been open sourced. This
     - End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~*** Performance - Sprites As Hash - main.rb~
    +** Processing line: ~*** Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb~
     - Header detected.
     *** True Line Result
     
     *** True Line Result
    -*** Performance - Sprites As Hash - main.rb
    +*** Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb
     ** Processing line: ~#+begin_src ruby~
     - Line was identified as the beginning of a code block.
     *** True Line Result
     
     *** True Line Result
     #+begin_src ruby
    -** Processing line: ~  # ./samples/09_performance/01_sprites_as_hash/app/main.rb~
    -- Inside source: true
    -*** True Line Result
    -  # ./samples/09_performance/01_sprites_as_hash/app/main.rb
    -** Processing line: ~~
    -- Inside source: true
    -*** True Line Result
    -
    -** Processing line: ~  # Sprites represented as Hashes using the queue ~args.outputs.sprites~~
    +** Processing line: ~  # ./samples/10_advanced_debugging/03_unit_tests/suggest_autocompletion_tests.rb~
     - Inside source: true
     *** True Line Result
    -  # Sprites represented as Hashes using the queue ~args.outputs.sprites~
    -** Processing line: ~  # code up, but are the "slowest" to render.~
    +  # ./samples/10_advanced_debugging/03_unit_tests/suggest_autocompletion_tests.rb
    +** Processing line: ~  def default_suggest_autocompletion args~
     - Inside source: true
     *** True Line Result
    -  # code up, but are the "slowest" to render.
    -** Processing line: ~  # The reason for this is the access of the key in the Hash and also~
    +  def default_suggest_autocompletion args
    +** Processing line: ~    {~
     - Inside source: true
     *** True Line Result
    -  # The reason for this is the access of the key in the Hash and also
    -** Processing line: ~  # because the data args.outputs.sprites is cleared every tick.~
    +    {
    +** Processing line: ~      index: 4,~
     - Inside source: true
     *** True Line Result
    -  # because the data args.outputs.sprites is cleared every tick.
    -** Processing line: ~  def random_x args~
    +      index: 4,
    +** Processing line: ~      text: "args.",~
     - Inside source: true
     *** True Line Result
    -  def random_x args
    -** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
    +      text: "args.",
    +** Processing line: ~      __meta__: {~
     - Inside source: true
     *** True Line Result
    -    (args.grid.w.randomize :ratio) * -1
    -** Processing line: ~  end~
    +      __meta__: {
    +** Processing line: ~        other_options: [~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        other_options: [
    +** Processing line: ~          {~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def random_y args~
    +          {
    +** Processing line: ~            index: Fixnum,~
     - Inside source: true
     *** True Line Result
    -  def random_y args
    -** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
    +            index: Fixnum,
    +** Processing line: ~            file: "app/main.rb"~
     - Inside source: true
     *** True Line Result
    -    (args.grid.h.randomize :ratio) * -1
    -** Processing line: ~  end~
    +            file: "app/main.rb"
    +** Processing line: ~          }~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +          }
    +** Processing line: ~        ]~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def random_speed~
    +        ]
    +** Processing line: ~      }~
     - Inside source: true
     *** True Line Result
    -  def random_speed
    -** Processing line: ~    1 + (4.randomize :ratio)~
    +      }
    +** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
    -    1 + (4.randomize :ratio)
    +    }
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53592,34 +62143,26 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def new_star args~
    -- Inside source: true
    -*** True Line Result
    -  def new_star args
    -** Processing line: ~    {~
    -- Inside source: true
    -*** True Line Result
    -    {
    -** Processing line: ~      x: (random_x args),~
    +** Processing line: ~  def assert_completion source, *expected~
     - Inside source: true
     *** True Line Result
    -      x: (random_x args),
    -** Processing line: ~      y: (random_y args),~
    +  def assert_completion source, *expected
    +** Processing line: ~    results = suggest_autocompletion text:  (source.strip.gsub  ":cursor", ""),~
     - Inside source: true
     *** True Line Result
    -      y: (random_y args),
    -** Processing line: ~      w: 4, h: 4, path: 'sprites/tiny-star.png',~
    +    results = suggest_autocompletion text:  (source.strip.gsub  ":cursor", ""),
    +** Processing line: ~                                     index: (source.strip.index ":cursor")~
     - Inside source: true
     *** True Line Result
    -      w: 4, h: 4, path: 'sprites/tiny-star.png',
    -** Processing line: ~      s: random_speed~
    +                                     index: (source.strip.index ":cursor")
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      s: random_speed
    -** Processing line: ~    }~
    +
    +** Processing line: ~    puts results~
     - Inside source: true
     *** True Line Result
    -    }
    +    puts results
     ** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    @@ -53628,42 +62171,18 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def move_star args, star~
    -- Inside source: true
    -*** True Line Result
    -  def move_star args, star
    -** Processing line: ~    star.x += star[:s]~
    -- Inside source: true
    -*** True Line Result
    -    star.x += star[:s]
    -** Processing line: ~    star.y += star[:s]~
    -- Inside source: true
    -*** True Line Result
    -    star.y += star[:s]
    -** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
    -- Inside source: true
    -*** True Line Result
    -    if star.x > args.grid.w || star.y > args.grid.h
    -** Processing line: ~      star.x = (random_x args)~
    -- Inside source: true
    -*** True Line Result
    -      star.x = (random_x args)
    -** Processing line: ~      star.y = (random_y args)~
    -- Inside source: true
    -*** True Line Result
    -      star.y = (random_y args)
    -** Processing line: ~      star[:s] = random_speed~
    +** Processing line: ~  def test_args_completion args, assert~
     - Inside source: true
     *** True Line Result
    -      star[:s] = random_speed
    -** Processing line: ~    end~
    +  def test_args_completion args, assert
    +** Processing line: ~    $gtk.write_file_root "autocomplete.txt", ($gtk.suggest_autocompletion text: <<-S, index: 128).join("\n")~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~  end~
    +    $gtk.write_file_root "autocomplete.txt", ($gtk.suggest_autocompletion text: <<-S, index: 128).join("\n")
    +** Processing line: ~  require 'app/game.rb'~
     - Inside source: true
     *** True Line Result
    -  end
    +  require 'app/game.rb'
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
    @@ -53672,274 +62191,282 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
       def tick args
    -** Processing line: ~    args.state.star_count ||= 0~
    +** Processing line: ~    args.gtk.suppress_mailbox = false~
     - Inside source: true
     *** True Line Result
    -    args.state.star_count ||= 0
    -** Processing line: ~~
    +    args.gtk.suppress_mailbox = false
    +** Processing line: ~    $game ||= Game.new~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # sets console command when sample app initially opens~
    +    $game ||= Game.new
    +** Processing line: ~    $game.args = args~
     - Inside source: true
     *** True Line Result
    -    # sets console command when sample app initially opens
    -** Processing line: ~    if Kernel.global_tick_count == 0~
    +    $game.args = args
    +** Processing line: ~    $game.args.~
     - Inside source: true
     *** True Line Result
    -    if Kernel.global_tick_count == 0
    -** Processing line: ~      puts "* INFO - Please specify the number of sprites to render."~
    +    $game.args.
    +** Processing line: ~    $game.tick~
     - Inside source: true
     *** True Line Result
    -      puts "* INFO - Please specify the number of sprites to render."
    -** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
    +    $game.tick
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      args.gtk.console.set_command "reset_with count: 100"
    -** Processing line: ~    end~
    +  end
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -    end
    +  S
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # init~
    +** Processing line: ~    puts "contents:"~
     - Inside source: true
     *** True Line Result
    -    # init
    -** Processing line: ~    if args.state.tick_count == 0~
    +    puts "contents:"
    +** Processing line: ~    puts ($gtk.read_file "autocomplete.txt")~
     - Inside source: true
     *** True Line Result
    -    if args.state.tick_count == 0
    -** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
    +    puts ($gtk.read_file "autocomplete.txt")
    +** Processing line: ~  end~
     - Inside source: true
     *** True Line Result
    -      args.state.stars = args.state.star_count.map { |i| new_star args }
    -** Processing line: ~    end~
    +  end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    end
    +
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
     ** Processing line: ~~
    -- Inside source: true
    +- End of paragraph detected.
     *** True Line Result
     
    -** Processing line: ~    # update~
    -- Inside source: true
    +** Processing line: ~*** Http - Retrieve Images - main.rb~
    +- Header detected.
     *** True Line Result
    -    # update
    -** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
    -- Inside source: true
    +
     *** True Line Result
    -    args.state.stars.each { |s| move_star args, s }
    -** Processing line: ~~
    -- Inside source: true
    +*** Http - Retrieve Images - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
     *** True Line Result
     
    -** Processing line: ~    # render~
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/11_http/01_retrieve_images/app/main.rb~
     - Inside source: true
     *** True Line Result
    -    # render
    -** Processing line: ~    args.outputs.sprites << args.state.stars~
    +  # ./samples/11_http/01_retrieve_images/app/main.rb
    +** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << args.state.stars
    +  def tick args
     ** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
         args.outputs.background_color = [0, 0, 0]
    -** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << args.gtk.current_framerate_primitives
    -** Processing line: ~  end~
    +
    +** Processing line: ~    # Show a warning at the start.~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +    # Show a warning at the start.
    +** Processing line: ~    args.state.warning_debounce ||= 11 * 60~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # resets game, and assigns star count given by user~
    +    args.state.warning_debounce ||= 11 * 60
    +** Processing line: ~    if args.state.warning_debounce > 0~
     - Inside source: true
     *** True Line Result
    -  # resets game, and assigns star count given by user
    -** Processing line: ~  def reset_with count: count~
    +    if args.state.warning_debounce > 0
    +** Processing line: ~      args.state.warning_debounce -= 1~
     - Inside source: true
     *** True Line Result
    -  def reset_with count: count
    -** Processing line: ~    $gtk.reset~
    +      args.state.warning_debounce -= 1
    +** Processing line: ~      args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]~
    +- Inside source: true
    +*** True Line Result
    +      args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]
    +** Processing line: ~      args.outputs.labels << [640, 500, "Quit in the next few seconds if this is a problem.", 10, 1, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -    $gtk.reset
    -** Processing line: ~    $gtk.args.state.star_count = count~
    +      args.outputs.labels << [640, 500, "Quit in the next few seconds if this is a problem.", 10, 1, 255, 255, 255]
    +** Processing line: ~      args.outputs.labels << [640, 350, "#{(args.state.warning_debounce / 60.0).to_i}", 10, 1, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -    $gtk.args.state.star_count = count
    -** Processing line: ~  end~
    +      args.outputs.labels << [640, 350, "#{(args.state.warning_debounce / 60.0).to_i}", 10, 1, 255, 255, 255]
    +** Processing line: ~      return~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +      return
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    -*** True Line Result
    -#+end_src
    +    end
     ** Processing line: ~~
    -- End of paragraph detected.
    +- Inside source: true
     *** True Line Result
     
    -** Processing line: ~*** Performance - Sprites As Entities - main.rb~
    -- Header detected.
    +** Processing line: ~    args.state.download_debounce ||= 0   # start immediately, reset to non zero later.~
    +- Inside source: true
     *** True Line Result
    -
    +    args.state.download_debounce ||= 0   # start immediately, reset to non zero later.
    +** Processing line: ~    args.state.photos ||= []~
    +- Inside source: true
     *** True Line Result
    -*** Performance - Sprites As Entities - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +    args.state.photos ||= []
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    -*** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/09_performance/02_sprites_as_entities/app/main.rb~
    +** Processing line: ~    # Put a little pause between each download.~
     - Inside source: true
     *** True Line Result
    -  # ./samples/09_performance/02_sprites_as_entities/app/main.rb
    -** Processing line: ~  # Sprites represented as Entities using the queue ~args.outputs.sprites~~
    +    # Put a little pause between each download.
    +** Processing line: ~    if args.state.download.nil?~
     - Inside source: true
     *** True Line Result
    -  # Sprites represented as Entities using the queue ~args.outputs.sprites~
    -** Processing line: ~  # yields nicer access apis over Hashes, but require a bit more code upfront.~
    +    if args.state.download.nil?
    +** Processing line: ~      if args.state.download_debounce > 0~
     - Inside source: true
     *** True Line Result
    -  # yields nicer access apis over Hashes, but require a bit more code upfront.
    -** Processing line: ~  # The hash sample has to use star[:s] to get the speed of the star, but~
    +      if args.state.download_debounce > 0
    +** Processing line: ~        args.state.download_debounce -= 1~
     - Inside source: true
     *** True Line Result
    -  # The hash sample has to use star[:s] to get the speed of the star, but
    -** Processing line: ~  # an entity can use .s instead.~
    +        args.state.download_debounce -= 1
    +** Processing line: ~      else~
     - Inside source: true
     *** True Line Result
    -  # an entity can use .s instead.
    -** Processing line: ~  def random_x args~
    +      else
    +** Processing line: ~        args.state.download = $gtk.http_get 'https://picsum.photos/200/300.jpg'~
     - Inside source: true
     *** True Line Result
    -  def random_x args
    -** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
    +        args.state.download = $gtk.http_get 'https://picsum.photos/200/300.jpg'
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    (args.grid.w.randomize :ratio) * -1
    -** Processing line: ~  end~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -  end
    +    end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def random_y args~
    +** Processing line: ~    if !args.state.download.nil?~
     - Inside source: true
     *** True Line Result
    -  def random_y args
    -** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
    +    if !args.state.download.nil?
    +** Processing line: ~      if args.state.download[:complete]~
     - Inside source: true
     *** True Line Result
    -    (args.grid.h.randomize :ratio) * -1
    -** Processing line: ~  end~
    +      if args.state.download[:complete]
    +** Processing line: ~        if args.state.download[:http_response_code] == 200~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        if args.state.download[:http_response_code] == 200
    +** Processing line: ~          fname = "sprites/#{args.state.photos.length}.jpg"~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def random_speed~
    +          fname = "sprites/#{args.state.photos.length}.jpg"
    +** Processing line: ~          $gtk.write_file fname, args.state.download[:response_data]~
     - Inside source: true
     *** True Line Result
    -  def random_speed
    -** Processing line: ~    1 + (4.randomize :ratio)~
    +          $gtk.write_file fname, args.state.download[:response_data]
    +** Processing line: ~          args.state.photos << [ 100 + rand(1080), 500 - rand(480), fname, rand(80) - 40 ]~
     - Inside source: true
     *** True Line Result
    -    1 + (4.randomize :ratio)
    -** Processing line: ~  end~
    +          args.state.photos << [ 100 + rand(1080), 500 - rand(480), fname, rand(80) - 40 ]
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        end
    +** Processing line: ~        args.state.download = nil~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  def new_star args~
    +        args.state.download = nil
    +** Processing line: ~        args.state.download_debounce = (rand(3) + 2) * 60~
     - Inside source: true
     *** True Line Result
    -  def new_star args
    -** Processing line: ~    args.state.new_entity :star, {~
    +        args.state.download_debounce = (rand(3) + 2) * 60
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    args.state.new_entity :star, {
    -** Processing line: ~      x: (random_x args),~
    +      end
    +** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    -      x: (random_x args),
    -** Processing line: ~      y: (random_y args),~
    +    end
    +** Processing line: ~~
     - Inside source: true
     *** True Line Result
    -      y: (random_y args),
    -** Processing line: ~      w: 4, h: 4,~
    +
    +** Processing line: ~    # draw any downloaded photos...~
     - Inside source: true
     *** True Line Result
    -      w: 4, h: 4,
    -** Processing line: ~      path: 'sprites/tiny-star.png',~
    +    # draw any downloaded photos...
    +** Processing line: ~    args.state.photos.each { |i|~
     - Inside source: true
     *** True Line Result
    -      path: 'sprites/tiny-star.png',
    -** Processing line: ~      s: random_speed~
    +    args.state.photos.each { |i|
    +** Processing line: ~      args.outputs.primitives << [i[0], i[1], 200, 300, i[2], i[3]].sprite~
     - Inside source: true
     *** True Line Result
    -      s: random_speed
    +      args.outputs.primitives << [i[0], i[1], 200, 300, i[2], i[3]].sprite
     ** Processing line: ~    }~
     - Inside source: true
     *** True Line Result
         }
    -** Processing line: ~  end~
    -- Inside source: true
    -*** True Line Result
    -  end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  def move_star args, star~
    +** Processing line: ~    # Draw a download progress bar...~
     - Inside source: true
     *** True Line Result
    -  def move_star args, star
    -** Processing line: ~    star.x += star.s~
    +    # Draw a download progress bar...
    +** Processing line: ~    args.outputs.primitives << [0, 0, 1280, 30, 0, 0, 0, 255].solid~
     - Inside source: true
     *** True Line Result
    -    star.x += star.s
    -** Processing line: ~    star.y += star.s~
    +    args.outputs.primitives << [0, 0, 1280, 30, 0, 0, 0, 255].solid
    +** Processing line: ~    if !args.state.download.nil?~
     - Inside source: true
     *** True Line Result
    -    star.y += star.s
    -** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
    +    if !args.state.download.nil?
    +** Processing line: ~      br = args.state.download[:response_read]~
     - Inside source: true
     *** True Line Result
    -    if star.x > args.grid.w || star.y > args.grid.h
    -** Processing line: ~      star.x = (random_x args)~
    +      br = args.state.download[:response_read]
    +** Processing line: ~      total = args.state.download[:response_total]~
     - Inside source: true
     *** True Line Result
    -      star.x = (random_x args)
    -** Processing line: ~      star.y = (random_y args)~
    +      total = args.state.download[:response_total]
    +** Processing line: ~      if total != 0~
     - Inside source: true
     *** True Line Result
    -      star.y = (random_y args)
    -** Processing line: ~      star.s = random_speed~
    +      if total != 0
    +** Processing line: ~        pct = br.to_f / total.to_f~
     - Inside source: true
     *** True Line Result
    -      star.s = random_speed
    +        pct = br.to_f / total.to_f
    +** Processing line: ~        args.outputs.primitives << [0, 0, 1280 * pct, 30, 0, 0, 255, 255].solid~
    +- Inside source: true
    +*** True Line Result
    +        args.outputs.primitives << [0, 0, 1280 * pct, 30, 0, 0, 255, 255].solid
    +** Processing line: ~      end~
    +- Inside source: true
    +*** True Line Result
    +      end
     ** Processing line: ~    end~
     - Inside source: true
     *** True Line Result
    @@ -53952,114 +62479,134 @@ Follows is a source code listing for all files that have been open sourced. This
     - Inside source: true
     *** True Line Result
     
    +** Processing line: ~#+end_src~
    +- Line was identified as the end of a code block.
    +*** True Line Result
    +#+end_src
    +** Processing line: ~~
    +- End of paragraph detected.
    +*** True Line Result
    +
    +** Processing line: ~*** Http - Web Server - main.rb~
    +- Header detected.
    +*** True Line Result
    +
    +*** True Line Result
    +*** Http - Web Server - main.rb
    +** Processing line: ~#+begin_src ruby~
    +- Line was identified as the beginning of a code block.
    +*** True Line Result
    +
    +*** True Line Result
    +#+begin_src ruby
    +** Processing line: ~  # ./samples/11_http/02_web_server/app/main.rb~
    +- Inside source: true
    +*** True Line Result
    +  # ./samples/11_http/02_web_server/app/main.rb
     ** Processing line: ~  def tick args~
     - Inside source: true
     *** True Line Result
       def tick args
    -** Processing line: ~    args.state.star_count ||= 0~
    +** Processing line: ~    args.state.port ||= 3000~
     - Inside source: true
     *** True Line Result
    -    args.state.star_count ||= 0
    -** Processing line: ~~
    +    args.state.port ||= 3000
    +** Processing line: ~    # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # sets console command when sample app initially opens~
    +    # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build
    +** Processing line: ~    # to enable the http server in a production build, you need to manually start~
     - Inside source: true
     *** True Line Result
    -    # sets console command when sample app initially opens
    -** Processing line: ~    if Kernel.global_tick_count == 0~
    +    # to enable the http server in a production build, you need to manually start
    +** Processing line: ~    # the server up:~
     - Inside source: true
     *** True Line Result
    -    if Kernel.global_tick_count == 0
    -** Processing line: ~      puts "* INFO - Please specify the number of sprites to render."~
    +    # the server up:
    +** Processing line: ~    args.gtk.start_server! port: args.state.port, enable_in_prod: true~
     - Inside source: true
     *** True Line Result
    -      puts "* INFO - Please specify the number of sprites to render."
    -** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
    +    args.gtk.start_server! port: args.state.port, enable_in_prod: true
    +** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
     - Inside source: true
     *** True Line Result
    -      args.gtk.console.set_command "reset_with count: 100"
    -** Processing line: ~    end~
    +    args.outputs.background_color = [0, 0, 0]
    +** Processing line: ~    args.outputs.labels << [640, 600, "Point your web browser at http://localhost:#{args.state.port}/", 10, 1, 255, 255, 255]~
     - Inside source: true
     *** True Line Result
    -    end
    +    args.outputs.labels << [640, 600, "Point your web browser at http://localhost:#{args.state.port}/", 10, 1, 255, 255, 255]
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # init~
    -- Inside source: true
    -*** True Line Result
    -    # init
    -** Processing line: ~    if args.state.tick_count == 0~
    -- Inside source: true
    -*** True Line Result
    -    if args.state.tick_count == 0
    -** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
    +** Processing line: ~    args.inputs.http_requests.each { |req|~
     - Inside source: true
     *** True Line Result
    -      args.state.stars = args.state.star_count.map { |i| new_star args }
    -** Processing line: ~    end~
    +    args.inputs.http_requests.each { |req|
    +** Processing line: ~      puts("METHOD: #{req.method}");~
     - Inside source: true
     *** True Line Result
    -    end
    -** Processing line: ~~
    +      puts("METHOD: #{req.method}");
    +** Processing line: ~      puts("URI: #{req.uri}");~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # update~
    +      puts("URI: #{req.uri}");
    +** Processing line: ~      puts("HEADERS:");~
     - Inside source: true
     *** True Line Result
    -    # update
    -** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
    +      puts("HEADERS:");
    +** Processing line: ~      req.headers.each { |k,v| puts("  #{k}: #{v}") }~
     - Inside source: true
     *** True Line Result
    -    args.state.stars.each { |s| move_star args, s }
    +      req.headers.each { |k,v| puts("  #{k}: #{v}") }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # render~
    +** Processing line: ~      if (req.uri == '/')~
     - Inside source: true
     *** True Line Result
    -    # render
    -** Processing line: ~    args.outputs.sprites << args.state.stars~
    +      if (req.uri == '/')
    +** Processing line: ~        # headers and body can be nil if you don't care about them.~
     - Inside source: true
     *** True Line Result
    -    args.outputs.sprites << args.state.stars
    -** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
    +        # headers and body can be nil if you don't care about them.
    +** Processing line: ~        # If you don't set the Content-Type, it will default to~
     - Inside source: true
     *** True Line Result
    -    args.outputs.background_color = [0, 0, 0]
    -** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
    +        # If you don't set the Content-Type, it will default to
    +** Processing line: ~        #  "text/html; charset=utf-8".~
     - Inside source: true
     *** True Line Result
    -    args.outputs.primitives << args.gtk.current_framerate_primitives
    -** Processing line: ~  end~
    +        #  "text/html; charset=utf-8".
    +** Processing line: ~        # Don't set Content-Length; we'll ignore it and calculate it for you~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +        # Don't set Content-Length; we'll ignore it and calculate it for you
    +** Processing line: ~        args.state.reqnum += 1~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~  # resets game, and assigns star count given by user~
    +        args.state.reqnum += 1
    +** Processing line: ~        req.respond 200, "hello

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

    \n", { 'X-DRGTK-header' => 'Powered by DragonRuby!' }~ - Inside source: true *** True Line Result - # resets game, and assigns star count given by user -** Processing line: ~ def reset_with count: count~ + req.respond 200, "hello

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

    \n", { 'X-DRGTK-header' => 'Powered by DragonRuby!' } +** Processing line: ~ else~ - Inside source: true *** True Line Result - def reset_with count: count -** Processing line: ~ $gtk.reset~ + else +** Processing line: ~ req.reject~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ $gtk.args.state.star_count = count~ + req.reject +** Processing line: ~ end~ - Inside source: true *** True Line Result - $gtk.args.state.star_count = count + end +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -54076,50 +62623,54 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Performance - Sprites As Strict Entities - main.rb~ +** Processing line: ~*** C Extensions - Basics - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Performance - Sprites As Strict Entities - main.rb +*** C Extensions - Basics - main.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb~ +** Processing line: ~ # ./samples/12_c_extensions/01_basics/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb -** Processing line: ~ # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~~ + # ./samples/12_c_extensions/01_basics/app/main.rb +** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ - Inside source: true *** True Line Result - # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~ -** Processing line: ~ # yields apis access similar to Entities, but all properties that can be set on the~ + $gtk.ffi_misc.gtk_dlopen("ext") +** Processing line: ~ include FFI::CExt~ - Inside source: true *** True Line Result - # yields apis access similar to Entities, but all properties that can be set on the -** Processing line: ~ # entity must be predefined with a default value. Strict entities do not support the~ + include FFI::CExt +** Processing line: ~~ - Inside source: true *** True Line Result - # entity must be predefined with a default value. Strict entities do not support the -** Processing line: ~ # addition of new properties after the fact. They are more performant than OpenEntities~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - # addition of new properties after the fact. They are more performant than OpenEntities -** Processing line: ~ # because of this constraint.~ + def tick args +** Processing line: ~ args.outputs.labels << [640, 500, "mouse.x = #{args.mouse.x.to_i}", 5, 1]~ - Inside source: true *** True Line Result - # because of this constraint. -** Processing line: ~ def random_x args~ + args.outputs.labels << [640, 500, "mouse.x = #{args.mouse.x.to_i}", 5, 1] +** Processing line: ~ args.outputs.labels << [640, 460, "square(mouse.x) = #{square(args.mouse.x.to_i)}", 5, 1]~ - Inside source: true *** True Line Result - def random_x args -** Processing line: ~ (args.grid.w.randomize :ratio) * -1~ + args.outputs.labels << [640, 460, "square(mouse.x) = #{square(args.mouse.x.to_i)}", 5, 1] +** Processing line: ~ args.outputs.labels << [640, 420, "mouse.y = #{args.mouse.y.to_i}", 5, 1]~ - Inside source: true *** True Line Result - (args.grid.w.randomize :ratio) * -1 + args.outputs.labels << [640, 420, "mouse.y = #{args.mouse.y.to_i}", 5, 1] +** Processing line: ~ args.outputs.labels << [640, 380, "square(mouse.y) = #{square(args.mouse.y.to_i)}", 5, 1]~ +- Inside source: true +*** True Line Result + args.outputs.labels << [640, 380, "square(mouse.y) = #{square(args.mouse.y.to_i)}", 5, 1] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -54128,82 +62679,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def random_y args~ -- Inside source: true -*** True Line Result - def random_y args -** Processing line: ~ (args.grid.h.randomize :ratio) * -1~ +** Processing line: ~~ - Inside source: true *** True Line Result - (args.grid.h.randomize :ratio) * -1 -** Processing line: ~ end~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - end +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ def random_speed~ +** Processing line: ~*** C Extensions - Intermediate - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** C Extensions - Intermediate - 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/12_c_extensions/02_intermediate/app/main.rb~ - Inside source: true *** True Line Result - def random_speed -** Processing line: ~ 1 + (4.randomize :ratio)~ + # ./samples/12_c_extensions/02_intermediate/app/main.rb +** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ - Inside source: true *** True Line Result - 1 + (4.randomize :ratio) -** Processing line: ~ end~ + $gtk.ffi_misc.gtk_dlopen("ext") +** Processing line: ~ include FFI::RE~ - Inside source: true *** True Line Result - end + include FFI::RE ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def new_star args~ -- Inside source: true -*** True Line Result - def new_star args -** Processing line: ~ args.state.new_entity_strict(:star,~ +** Processing line: ~ def split_words(input)~ - Inside source: true *** True Line Result - args.state.new_entity_strict(:star, -** Processing line: ~ x: (random_x args),~ + def split_words(input) +** Processing line: ~ words = []~ - Inside source: true *** True Line Result - x: (random_x args), -** Processing line: ~ y: (random_y args),~ + words = [] +** Processing line: ~ last = IntPointer.new~ - Inside source: true *** True Line Result - y: (random_y args), -** Processing line: ~ w: 4, h: 4,~ + last = IntPointer.new +** Processing line: ~ re = re_compile("\\w+")~ - Inside source: true *** True Line Result - w: 4, h: 4, -** Processing line: ~ path: 'sprites/tiny-star.png',~ + re = re_compile("\\w+") +** Processing line: ~ first = re_matchp(re, input, last)~ - Inside source: true *** True Line Result - path: 'sprites/tiny-star.png', -** Processing line: ~ s: random_speed) do |entity|~ + first = re_matchp(re, input, last) +** Processing line: ~ while first != -1~ - Inside source: true *** True Line Result - s: random_speed) do |entity| -** Processing line: ~ # invoke attr_sprite so that it responds to~ + while first != -1 +** Processing line: ~ words << input.slice(first, last.value)~ - Inside source: true *** True Line Result - # invoke attr_sprite so that it responds to -** Processing line: ~ # all properties that are required to render a sprite~ + words << input.slice(first, last.value) +** Processing line: ~ input = input.slice(last.value + first, input.length)~ - Inside source: true *** True Line Result - # all properties that are required to render a sprite -** Processing line: ~ entity.attr_sprite~ + input = input.slice(last.value + first, input.length) +** Processing line: ~ first = re_matchp(re, input, last)~ - Inside source: true *** True Line Result - entity.attr_sprite + first = re_matchp(re, input, last) ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ words~ +- Inside source: true +*** True Line Result + words ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -54212,42 +62771,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 move_star args, star~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def move_star args, star -** Processing line: ~ star.x += star.s~ + def tick args +** Processing line: ~ args.outputs.labels << [640, 500, split_words("hello, dragonriders!").join(' '), 5, 1]~ - Inside source: true *** True Line Result - star.x += star.s -** Processing line: ~ star.y += star.s~ + args.outputs.labels << [640, 500, split_words("hello, dragonriders!").join(' '), 5, 1] +** Processing line: ~ end~ - Inside source: true *** True Line Result - star.y += star.s -** Processing line: ~ if star.x > args.grid.w || star.y > args.grid.h~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if star.x > args.grid.w || star.y > args.grid.h -** Processing line: ~ star.x = (random_x args)~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - star.x = (random_x args) -** Processing line: ~ star.y = (random_y args)~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - star.y = (random_y args) -** Processing line: ~ star.s = random_speed~ + +** Processing line: ~*** C Extensions - Native Pixel Arrays - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** C Extensions - Native Pixel Arrays - 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/12_c_extensions/03_native_pixel_arrays/app/main.rb~ - Inside source: true *** True Line Result - star.s = random_speed -** Processing line: ~ end~ + # ./samples/12_c_extensions/03_native_pixel_arrays/app/main.rb +** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + $gtk.ffi_misc.gtk_dlopen("ext") +** Processing line: ~ include FFI::CExt~ - Inside source: true *** True Line Result - end + include FFI::CExt ** Processing line: ~~ - Inside source: true *** True Line Result @@ -54256,82 +62827,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def tick args -** Processing line: ~ args.state.star_count ||= 0~ +** Processing line: ~ args.state.rotation ||= 0~ - Inside source: true *** True Line Result - args.state.star_count ||= 0 + args.state.rotation ||= 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # sets console command when sample app initially opens~ -- Inside source: true -*** True Line Result - # sets console command when sample app initially opens -** Processing line: ~ if Kernel.global_tick_count == 0~ -- Inside source: true -*** True Line Result - if Kernel.global_tick_count == 0 -** Processing line: ~ puts "* INFO - Please specify the number of sprites to render."~ -- Inside source: true -*** True Line Result - puts "* INFO - Please specify the number of sprites to render." -** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ -- Inside source: true -*** True Line Result - args.gtk.console.set_command "reset_with count: 100" -** Processing line: ~ end~ +** Processing line: ~ update_scanner_texture # this calls into a C extension!~ - Inside source: true *** True Line Result - end + update_scanner_texture # this calls into a C extension! ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # init~ +** Processing line: ~ # New/changed pixel arrays get uploaded to the GPU before we render~ - Inside source: true *** True Line Result - # init -** Processing line: ~ if args.state.tick_count == 0~ + # New/changed pixel arrays get uploaded to the GPU before we render +** Processing line: ~ # anything. At that point, they can be scaled, rotated, and otherwise~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.state.stars = args.state.star_count.map { |i| new_star args }~ + # anything. At that point, they can be scaled, rotated, and otherwise +** Processing line: ~ # used like any other sprite.~ - Inside source: true *** True Line Result - args.state.stars = args.state.star_count.map { |i| new_star args } -** Processing line: ~ end~ + # used like any other sprite. +** Processing line: ~ w = 100~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + w = 100 +** Processing line: ~ h = 100~ - Inside source: true *** True Line Result - -** Processing line: ~ # update~ + h = 100 +** Processing line: ~ x = (1280 - w) / 2~ - Inside source: true *** True Line Result - # update -** Processing line: ~ args.state.stars.each { |s| move_star args, s }~ + x = (1280 - w) / 2 +** Processing line: ~ y = (720 - h) / 2~ - Inside source: true *** True Line Result - args.state.stars.each { |s| move_star args, s } -** Processing line: ~~ + y = (720 - h) / 2 +** Processing line: ~ args.outputs.background_color = [64, 0, 128]~ - Inside source: true *** True Line Result - -** Processing line: ~ # render~ + args.outputs.background_color = [64, 0, 128] +** Processing line: ~ args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite~ - Inside source: true *** True Line Result - # render -** Processing line: ~ args.outputs.sprites << args.state.stars~ + args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite +** Processing line: ~ args.state.rotation += 1~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.stars -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + args.state.rotation += 1 +** Processing line: ~~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] + ** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ - Inside source: true *** True Line Result @@ -54344,26 +62899,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # resets game, and assigns star count given by user~ -- Inside source: true -*** True Line Result - # resets game, and assigns star count given by user -** Processing line: ~ def reset_with count: count~ -- Inside source: true -*** True Line Result - def reset_with count: count -** Processing line: ~ $gtk.reset~ -- Inside source: true -*** True Line Result - $gtk.reset -** Processing line: ~ $gtk.args.state.star_count = count~ -- Inside source: true -*** True Line Result - $gtk.args.state.star_count = count -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result @@ -54376,722 +62911,730 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Performance - Sprites As Classes - main.rb~ +** Processing line: ~*** Path Finding Algorithms - Breadth First Search - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Performance - Sprites As Classes - main.rb +*** Path Finding Algorithms - Breadth First Search - main.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/09_performance/04_sprites_as_classes/app/main.rb~ -- Inside source: true -*** True Line Result - # ./samples/09_performance/04_sprites_as_classes/app/main.rb -** Processing line: ~ # Sprites represented as Classes using the queue ~args.outputs.sprites~.~ +** Processing line: ~ # ./samples/13_path_finding_algorithms/01_breadth_first_search/app/main.rb~ - Inside source: true *** True Line Result - # Sprites represented as Classes using the queue ~args.outputs.sprites~. -** Processing line: ~ # gives you full control of property declaration and method invocation.~ + # ./samples/13_path_finding_algorithms/01_breadth_first_search/app/main.rb +** Processing line: ~ # A visual demonstration of a breadth first search~ - Inside source: true *** True Line Result - # gives you full control of property declaration and method invocation. -** Processing line: ~ # They are more performant than OpenEntities and StrictEntities, but more code upfront.~ + # A visual demonstration of a breadth first search +** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result - # They are more performant than OpenEntities and StrictEntities, but more code upfront. -** Processing line: ~ class Star~ + # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html +** Processing line: ~~ - Inside source: true *** True Line Result - class Star -** Processing line: ~ attr_sprite~ + +** Processing line: ~ # An animation that can respond to user input in real time~ - Inside source: true *** True Line Result - attr_sprite + # An animation that can respond to user input in real time ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def initialize grid~ +** Processing line: ~ # A breadth first search expands in all directions one step at a time~ - Inside source: true *** True Line Result - def initialize grid -** Processing line: ~ @grid = grid~ + # A breadth first search expands in all directions one step at a time +** Processing line: ~ # The frontier is a queue of cells to be expanded from~ - Inside source: true *** True Line Result - @grid = grid -** Processing line: ~ @x = (rand @grid.w) * -1~ + # The frontier is a queue of cells to be expanded from +** Processing line: ~ # The visited hash allows quick lookups of cells that have been expanded from~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 -** Processing line: ~ @y = (rand @grid.h) * -1~ + # The visited hash allows quick lookups of cells that have been expanded from +** Processing line: ~ # The walls hash allows quick lookup of whether a cell is a wall~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 -** Processing line: ~ @w = 4~ + # The walls hash allows quick lookup of whether a cell is a wall +** Processing line: ~~ - Inside source: true *** True Line Result - @w = 4 -** Processing line: ~ @h = 4~ + +** Processing line: ~ # The breadth first search starts by adding the red star to the frontier array~ - Inside source: true *** True Line Result - @h = 4 -** Processing line: ~ @s = 1 + (4.randomize :ratio)~ + # The breadth first search starts by adding the red star to the frontier array +** Processing line: ~ # and marking it as visited~ - Inside source: true *** True Line Result - @s = 1 + (4.randomize :ratio) -** Processing line: ~ @path = 'sprites/tiny-star.png'~ + # and marking it as visited +** Processing line: ~ # Each step a cell is removed from the front of the frontier array (queue)~ - Inside source: true *** True Line Result - @path = 'sprites/tiny-star.png' -** Processing line: ~ end~ + # Each step a cell is removed from the front of the frontier array (queue) +** Processing line: ~ # Unless the neighbor is a wall or visited, it is added to the frontier array~ - Inside source: true *** True Line Result - end + # Unless the neighbor is a wall or visited, it is added to the frontier array +** Processing line: ~ # The neighbor is then marked as visited~ +- Inside source: true +*** True Line Result + # The neighbor is then marked as visited ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def move~ +** Processing line: ~ # The frontier is blue~ - Inside source: true *** True Line Result - def move -** Processing line: ~ @x += @s~ + # The frontier is blue +** Processing line: ~ # Visited cells are light brown~ - Inside source: true *** True Line Result - @x += @s -** Processing line: ~ @y += @s~ + # Visited cells are light brown +** Processing line: ~ # Walls are camo green~ - Inside source: true *** True Line Result - @y += @s -** Processing line: ~ @x = (rand @grid.w) * -1 if @x > @grid.right~ + # Walls are camo green +** Processing line: ~ # Even when walls are visited, they will maintain their wall color~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 if @x > @grid.right -** Processing line: ~ @y = (rand @grid.h) * -1 if @y > @grid.top~ + # Even when walls are visited, they will maintain their wall color +** Processing line: ~~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 if @y > @grid.top -** Processing line: ~ end~ + +** Processing line: ~ # The star can be moved by clicking and dragging~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # The star can be moved by clicking and dragging +** Processing line: ~ # Walls can be added and removed by clicking and dragging~ - Inside source: true *** True Line Result - end + # Walls can be added and removed by clicking and dragging ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # calls methods needed for game to run properly~ +** Processing line: ~ class BreadthFirstSearch~ - Inside source: true *** True Line Result - # calls methods needed for game to run properly -** Processing line: ~ def tick args~ + class BreadthFirstSearch +** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ # sets console command when sample app initially opens~ + attr_gtk +** Processing line: ~~ - Inside source: true *** True Line Result - # sets console command when sample app initially opens -** Processing line: ~ if Kernel.global_tick_count == 0~ + +** Processing line: ~ def initialize(args)~ - Inside source: true *** True Line Result - if Kernel.global_tick_count == 0 -** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ + def initialize(args) +** Processing line: ~ # Variables to edit the size and appearance of the grid~ - Inside source: true *** True Line Result - args.gtk.console.set_command "reset_with count: 100" -** Processing line: ~ end~ + # Variables to edit the size and appearance of the grid +** Processing line: ~ # Freely customizable to user's liking~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Freely customizable to user's liking +** Processing line: ~ args.state.grid.width = 30~ - Inside source: true *** True Line Result - -** Processing line: ~ # init~ + args.state.grid.width = 30 +** Processing line: ~ args.state.grid.height = 15~ - Inside source: true *** True Line Result - # init -** Processing line: ~ if args.state.tick_count == 0~ + args.state.grid.height = 15 +** Processing line: ~ args.state.grid.cell_size = 40~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~ + args.state.grid.cell_size = 40 +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.stars = args.state.star_count.map { |i| Star.new args.grid } -** Processing line: ~ end~ + +** Processing line: ~ # Stores which step of the animation is being rendered~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Stores which step of the animation is being rendered +** Processing line: ~ # When the user moves the star or messes with the walls,~ - Inside source: true *** True Line Result - -** Processing line: ~ # update~ + # When the user moves the star or messes with the walls, +** Processing line: ~ # the breadth first search is recalculated up to this step~ - Inside source: true *** True Line Result - # update -** Processing line: ~ args.state.stars.each(&:move)~ + # the breadth first search is recalculated up to this step +** Processing line: ~ args.state.anim_steps = 0~ - Inside source: true *** True Line Result - args.state.stars.each(&:move) + args.state.anim_steps = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # render~ +** Processing line: ~ # At some step the animation will end,~ - Inside source: true *** True Line Result - # render -** Processing line: ~ args.outputs.sprites << args.state.stars~ + # At some step the animation will end, +** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.stars -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + # and further steps won't change anything (the whole grid will be explored) +** Processing line: ~ # This step is roughly the grid's width * height~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ + # This step is roughly the grid's width * height +** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ - Inside source: true *** True Line Result - args.outputs.primitives << args.gtk.current_framerate_primitives -** Processing line: ~ end~ + # When anim_steps equals max_steps no more calculations will occur +** Processing line: ~ # and the slider will be at the end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # and the slider will be at the end +** Processing line: ~ args.state.max_steps = args.state.grid.width * args.state.grid.height~ - Inside source: true *** True Line Result - -** Processing line: ~ # resets game, and assigns star count given by user~ + args.state.max_steps = args.state.grid.width * args.state.grid.height +** Processing line: ~~ - Inside source: true *** True Line Result - # resets game, and assigns star count given by user -** Processing line: ~ def reset_with count: count~ + +** Processing line: ~ # Whether the animation should play or not~ - Inside source: true *** True Line Result - def reset_with count: count -** Processing line: ~ $gtk.reset~ + # Whether the animation should play or not +** Processing line: ~ # If true, every tick moves anim_steps forward one~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ $gtk.args.state.star_count = count~ + # If true, every tick moves anim_steps forward one +** Processing line: ~ # Pressing the stepwise animation buttons will pause the animation~ - Inside source: true *** True Line Result - $gtk.args.state.star_count = count -** Processing line: ~ end~ + # Pressing the stepwise animation buttons will pause the animation +** Processing line: ~ args.state.play = true~ - Inside source: true *** True Line Result - end + args.state.play = true ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ # The location of the star and walls of the grid~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + # The location of the star and walls of the grid +** Processing line: ~ # They can be modified to have a different initial grid~ +- Inside source: true *** True Line Result - -** Processing line: ~*** Performance - Static Sprites As Classes - main.rb~ -- Header detected. + # They can be modified to have a different initial grid +** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ +- Inside source: true *** True Line Result - + # Walls are stored in a hash for quick look up when doing the search +** Processing line: ~ args.state.star = [0, 0]~ +- Inside source: true *** True Line Result -*** Performance - Static Sprites As Classes - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + args.state.star = [0, 0] +** Processing line: ~ args.state.walls = {~ +- Inside source: true *** True Line Result - + args.state.walls = { +** Processing line: ~ [3, 3] => true,~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb~ + [3, 3] => true, +** Processing line: ~ [3, 4] => true,~ - Inside source: true *** True Line Result - # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb -** Processing line: ~ # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.~ + [3, 4] => true, +** Processing line: ~ [3, 5] => true,~ - Inside source: true *** True Line Result - # Sprites represented as Classes using the queue ~args.outputs.static_sprites~. -** Processing line: ~ # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held~ + [3, 5] => true, +** Processing line: ~ [3, 6] => true,~ - Inside source: true *** True Line Result - # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held -** Processing line: ~ # by reference. You get better performance, but you are mutating state of held objects~ + [3, 6] => true, +** Processing line: ~ [3, 7] => true,~ - Inside source: true *** True Line Result - # by reference. You get better performance, but you are mutating state of held objects -** Processing line: ~ # which is less functional/data oriented.~ + [3, 7] => true, +** Processing line: ~ [3, 8] => true,~ - Inside source: true *** True Line Result - # which is less functional/data oriented. -** Processing line: ~ class Star~ + [3, 8] => true, +** Processing line: ~ [3, 9] => true,~ - Inside source: true *** True Line Result - class Star -** Processing line: ~ attr_sprite~ + [3, 9] => true, +** Processing line: ~ [3, 10] => true,~ - Inside source: true *** True Line Result - attr_sprite -** Processing line: ~~ + [3, 10] => true, +** Processing line: ~ [3, 11] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize grid~ + [3, 11] => true, +** Processing line: ~ [4, 3] => true,~ - Inside source: true *** True Line Result - def initialize grid -** Processing line: ~ @grid = grid~ + [4, 3] => true, +** Processing line: ~ [4, 4] => true,~ - Inside source: true *** True Line Result - @grid = grid -** Processing line: ~ @x = (rand @grid.w) * -1~ + [4, 4] => true, +** Processing line: ~ [4, 5] => true,~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 -** Processing line: ~ @y = (rand @grid.h) * -1~ + [4, 5] => true, +** Processing line: ~ [4, 6] => true,~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 -** Processing line: ~ @w = 4~ + [4, 6] => true, +** Processing line: ~ [4, 7] => true,~ - Inside source: true *** True Line Result - @w = 4 -** Processing line: ~ @h = 4~ + [4, 7] => true, +** Processing line: ~ [4, 8] => true,~ - Inside source: true *** True Line Result - @h = 4 -** Processing line: ~ @s = 1 + (4.randomize :ratio)~ + [4, 8] => true, +** Processing line: ~ [4, 9] => true,~ - Inside source: true *** True Line Result - @s = 1 + (4.randomize :ratio) -** Processing line: ~ @path = 'sprites/tiny-star.png'~ + [4, 9] => true, +** Processing line: ~ [4, 10] => true,~ - Inside source: true *** True Line Result - @path = 'sprites/tiny-star.png' -** Processing line: ~ end~ + [4, 10] => true, +** Processing line: ~ [4, 11] => true,~ - Inside source: true *** True Line Result - end + [4, 11] => true, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def move~ +** Processing line: ~ [13, 0] => true,~ - Inside source: true *** True Line Result - def move -** Processing line: ~ @x += @s~ + [13, 0] => true, +** Processing line: ~ [13, 1] => true,~ - Inside source: true *** True Line Result - @x += @s -** Processing line: ~ @y += @s~ + [13, 1] => true, +** Processing line: ~ [13, 2] => true,~ - Inside source: true *** True Line Result - @y += @s -** Processing line: ~ @x = (rand @grid.w) * -1 if @x > @grid.right~ + [13, 2] => true, +** Processing line: ~ [13, 3] => true,~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 if @x > @grid.right -** Processing line: ~ @y = (rand @grid.h) * -1 if @y > @grid.top~ + [13, 3] => true, +** Processing line: ~ [13, 4] => true,~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 if @y > @grid.top -** Processing line: ~ end~ + [13, 4] => true, +** Processing line: ~ [13, 5] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + [13, 5] => true, +** Processing line: ~ [13, 6] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [13, 6] => true, +** Processing line: ~ [13, 7] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ # calls methods needed for game to run properly~ + [13, 7] => true, +** Processing line: ~ [13, 8] => true,~ - Inside source: true *** True Line Result - # calls methods needed for game to run properly -** Processing line: ~ def tick args~ + [13, 8] => true, +** Processing line: ~ [13, 9] => true,~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ # sets console command when sample app initially opens~ + [13, 9] => true, +** Processing line: ~ [13, 10] => true,~ - Inside source: true *** True Line Result - # sets console command when sample app initially opens -** Processing line: ~ if Kernel.global_tick_count == 0~ + [13, 10] => true, +** Processing line: ~ [14, 0] => true,~ - Inside source: true *** True Line Result - if Kernel.global_tick_count == 0 -** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ + [14, 0] => true, +** Processing line: ~ [14, 1] => true,~ - Inside source: true *** True Line Result - args.gtk.console.set_command "reset_with count: 100" -** Processing line: ~ end~ + [14, 1] => true, +** Processing line: ~ [14, 2] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [14, 2] => true, +** Processing line: ~ [14, 3] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ # init~ + [14, 3] => true, +** Processing line: ~ [14, 4] => true,~ - Inside source: true *** True Line Result - # init -** Processing line: ~ if args.state.tick_count == 0~ + [14, 4] => true, +** Processing line: ~ [14, 5] => true,~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~ + [14, 5] => true, +** Processing line: ~ [14, 6] => true,~ - Inside source: true *** True Line Result - args.state.stars = args.state.star_count.map { |i| Star.new args.grid } -** Processing line: ~ end~ + [14, 6] => true, +** Processing line: ~ [14, 7] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [14, 7] => true, +** Processing line: ~ [14, 8] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ # update~ + [14, 8] => true, +** Processing line: ~ [14, 9] => true,~ - Inside source: true *** True Line Result - # update -** Processing line: ~ args.state.stars.each(&:move)~ + [14, 9] => true, +** Processing line: ~ [14, 10] => true,~ - Inside source: true *** True Line Result - args.state.stars.each(&:move) + [14, 10] => true, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # render~ +** Processing line: ~ [21, 8] => true,~ - Inside source: true *** True Line Result - # render -** Processing line: ~ args.outputs.sprites << args.state.stars~ + [21, 8] => true, +** Processing line: ~ [21, 9] => true,~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.stars -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + [21, 9] => true, +** Processing line: ~ [21, 10] => true,~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ + [21, 10] => true, +** Processing line: ~ [21, 11] => true,~ - Inside source: true *** True Line Result - args.outputs.primitives << args.gtk.current_framerate_primitives -** Processing line: ~ end~ + [21, 11] => true, +** Processing line: ~ [21, 12] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [21, 12] => true, +** Processing line: ~ [21, 13] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ # resets game, and assigns star count given by user~ + [21, 13] => true, +** Processing line: ~ [21, 14] => true,~ - Inside source: true *** True Line Result - # resets game, and assigns star count given by user -** Processing line: ~ def reset_with count: count~ + [21, 14] => true, +** Processing line: ~ [22, 8] => true,~ - Inside source: true *** True Line Result - def reset_with count: count -** Processing line: ~ $gtk.reset~ + [22, 8] => true, +** Processing line: ~ [22, 9] => true,~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ $gtk.args.state.star_count = count~ + [22, 9] => true, +** Processing line: ~ [22, 10] => true,~ - Inside source: true *** True Line Result - $gtk.args.state.star_count = count -** Processing line: ~ end~ + [22, 10] => true, +** Processing line: ~ [22, 11] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [22, 11] => true, +** Processing line: ~ [22, 12] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Performance - Static Sprites As Classes With Custom Drawing - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Performance - Static Sprites As Classes With Custom Drawing - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + [22, 12] => true, +** Processing line: ~ [22, 13] => true,~ +- Inside source: true *** True Line Result - + [22, 13] => true, +** Processing line: ~ [22, 14] => true,~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb~ + [22, 14] => true, +** Processing line: ~ [23, 8] => true,~ - Inside source: true *** True Line Result - # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb -** Processing line: ~ # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.~ + [23, 8] => true, +** Processing line: ~ [23, 9] => true,~ - Inside source: true *** True Line Result - # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~. -** Processing line: ~ # is the fastest approach. This is comparable to what other game engines set as the default behavior.~ + [23, 9] => true, +** Processing line: ~ [24, 8] => true,~ - Inside source: true *** True Line Result - # is the fastest approach. This is comparable to what other game engines set as the default behavior. -** Processing line: ~ # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing~ + [24, 8] => true, +** Processing line: ~ [24, 9] => true,~ - Inside source: true *** True Line Result - # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing -** Processing line: ~ # functional/data-oriented practices.~ + [24, 9] => true, +** Processing line: ~ [25, 8] => true,~ - Inside source: true *** True Line Result - # functional/data-oriented practices. -** Processing line: ~ class Star~ + [25, 8] => true, +** Processing line: ~ [25, 9] => true,~ - Inside source: true *** True Line Result - class Star -** Processing line: ~ def initialize grid~ + [25, 9] => true, +** Processing line: ~ }~ - Inside source: true *** True Line Result - def initialize grid -** Processing line: ~ @grid = grid~ + } +** Processing line: ~~ - Inside source: true *** True Line Result - @grid = grid -** Processing line: ~ @x = (rand @grid.w) * -1~ + +** Processing line: ~ # Variables that are used by the breadth first search~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 -** Processing line: ~ @y = (rand @grid.h) * -1~ + # Variables that are used by the breadth first search +** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 -** Processing line: ~ @w = 4~ + # Storing cells that the search has visited, prevents unnecessary steps +** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ - Inside source: true *** True Line Result - @w = 4 -** Processing line: ~ @h = 4~ + # Expanding the frontier of the search in order makes the search expand +** Processing line: ~ # from the center outward~ - Inside source: true *** True Line Result - @h = 4 -** Processing line: ~ @s = 1 + (4.randomize :ratio)~ + # from the center outward +** Processing line: ~ args.state.visited = {}~ - Inside source: true *** True Line Result - @s = 1 + (4.randomize :ratio) -** Processing line: ~ @path = 'sprites/tiny-star.png'~ + args.state.visited = {} +** Processing line: ~ args.state.frontier = []~ - Inside source: true *** True Line Result - @path = 'sprites/tiny-star.png' -** Processing line: ~ end~ + args.state.frontier = [] +** Processing line: ~~ - Inside source: true *** True Line Result - end + ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def move~ +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - def move -** Processing line: ~ @x += @s~ + # What the user is currently editing on the grid +** Processing line: ~ # Possible values are: :none, :slider, :star, :remove_wall, :add_wall~ - Inside source: true *** True Line Result - @x += @s -** Processing line: ~ @y += @s~ + # Possible values are: :none, :slider, :star, :remove_wall, :add_wall +** Processing line: ~~ - Inside source: true *** True Line Result - @y += @s -** Processing line: ~ @x = (rand @grid.w) * -1 if @x > @grid.right~ + +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - @x = (rand @grid.w) * -1 if @x > @grid.right -** Processing line: ~ @y = (rand @grid.h) * -1 if @y > @grid.top~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - @y = (rand @grid.h) * -1 if @y > @grid.top -** Processing line: ~ end~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - end + # they are still clicking down on the mouse. +** Processing line: ~ args.state.click_and_drag = :none~ +- Inside source: true +*** True Line Result + args.state.click_and_drag = :none ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if the object that is in args.outputs.sprites (or static_sprites)~ +** Processing line: ~ # Store the rects of the buttons that control the animation~ - Inside source: true *** True Line Result - # if the object that is in args.outputs.sprites (or static_sprites) -** Processing line: ~ # respond_to? :draw_override, then the method is invoked giving you~ + # Store the rects of the buttons that control the animation +** Processing line: ~ # They are here for user customization~ - Inside source: true *** True Line Result - # respond_to? :draw_override, then the method is invoked giving you -** Processing line: ~ # access to the class used to draw to the canvas.~ + # They are here for user customization +** Processing line: ~ # Editing these might require recentering the text inside them~ - Inside source: true *** True Line Result - # access to the class used to draw to the canvas. -** Processing line: ~ def draw_override ffi_draw~ + # Editing these might require recentering the text inside them +** Processing line: ~ # Those values can be found in the render_button methods~ - Inside source: true *** True Line Result - def draw_override ffi_draw -** Processing line: ~ # first move then draw~ + # Those values can be found in the render_button methods +** Processing line: ~ args.state.buttons.left = [450, 600, 50, 50]~ - Inside source: true *** True Line Result - # first move then draw -** Processing line: ~ move~ + args.state.buttons.left = [450, 600, 50, 50] +** Processing line: ~ args.state.buttons.center = [500, 600, 200, 50]~ - Inside source: true *** True Line Result - move + args.state.buttons.center = [500, 600, 200, 50] +** Processing line: ~ args.state.buttons.right = [700, 600, 50, 50]~ +- Inside source: true +*** True Line Result + args.state.buttons.right = [700, 600, 50, 50] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The argument order for ffi.draw_sprite is:~ +** Processing line: ~ # The variables below are related to the slider~ - Inside source: true *** True Line Result - # The argument order for ffi.draw_sprite is: -** Processing line: ~ # x, y, w, h, path~ + # The variables below are related to the slider +** Processing line: ~ # They allow the user to customize them~ - Inside source: true *** True Line Result - # x, y, w, h, path -** Processing line: ~ ffi_draw.draw_sprite @x, @y, @w, @h, @path~ + # They allow the user to customize them +** Processing line: ~ # They also give a central location for the render and input methods to get~ - Inside source: true *** True Line Result - ffi_draw.draw_sprite @x, @y, @w, @h, @path -** Processing line: ~~ + # They also give a central location for the render and input methods to get +** Processing line: ~ # information from~ - Inside source: true *** True Line Result - -** Processing line: ~ # The argument order for ffi_draw.draw_sprite_2 is (pass in nil for default value):~ + # information from +** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ - Inside source: true *** True Line Result - # The argument order for ffi_draw.draw_sprite_2 is (pass in nil for default value): -** Processing line: ~ # x, y, w, h, path,~ + # x & y are the coordinates of the leftmost part of the slider line +** Processing line: ~ args.state.slider.x = 400~ - Inside source: true *** True Line Result - # x, y, w, h, path, -** Processing line: ~ # angle, alpha~ + args.state.slider.x = 400 +** Processing line: ~ args.state.slider.y = 675~ - Inside source: true *** True Line Result - # angle, alpha -** Processing line: ~~ + args.state.slider.y = 675 +** Processing line: ~ # This is the width of the line~ - Inside source: true *** True Line Result - -** Processing line: ~ # The argument order for ffi_draw.draw_sprite_3 is:~ + # This is the width of the line +** Processing line: ~ args.state.slider.w = 360~ - Inside source: true *** True Line Result - # The argument order for ffi_draw.draw_sprite_3 is: -** Processing line: ~ # x, y, w, h,~ + args.state.slider.w = 360 +** Processing line: ~ # This is the offset for the circle~ - Inside source: true *** True Line Result - # x, y, w, h, -** Processing line: ~ # path,~ + # This is the offset for the circle +** Processing line: ~ # Allows the center of the circle to be on the line,~ - Inside source: true *** True Line Result - # path, -** Processing line: ~ # angle,~ + # Allows the center of the circle to be on the line, +** Processing line: ~ # as opposed to the upper right corner~ - Inside source: true *** True Line Result - # angle, -** Processing line: ~ # alpha, red_saturation, green_saturation, blue_saturation~ + # as opposed to the upper right corner +** Processing line: ~ args.state.slider.offset = 20~ - Inside source: true *** True Line Result - # alpha, red_saturation, green_saturation, blue_saturation -** Processing line: ~ # flip_horizontally, flip_vertically,~ + args.state.slider.offset = 20 +** Processing line: ~ # This is the spacing between each of the notches on the slider~ - Inside source: true *** True Line Result - # flip_horizontally, flip_vertically, -** Processing line: ~ # tile_x, tile_y, tile_w, tile_h~ + # This is the spacing between each of the notches on the slider +** Processing line: ~ # Notches are places where the circle can rest on the slider line~ - Inside source: true *** True Line Result - # tile_x, tile_y, tile_w, tile_h -** Processing line: ~ # angle_anchor_x, angle_anchor_y,~ + # Notches are places where the circle can rest on the slider line +** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ - Inside source: true *** True Line Result - # angle_anchor_x, angle_anchor_y, -** Processing line: ~ # source_x, source_y, source_w, source_h~ + # There needs to be a notch for each step before the maximum number of steps +** Processing line: ~ args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f~ - Inside source: true *** True Line Result - # source_x, source_y, source_w, source_h + args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # calls methods needed for game to run properly~ +** Processing line: ~ # This method is called every frame/tick~ - Inside source: true *** True Line Result - # calls methods needed for game to run properly -** Processing line: ~ def tick args~ + # This method is called every frame/tick +** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ # sets console command when sample app initially opens~ + # Every tick, the current state of the search is rendered on the screen, +** Processing line: ~ # User input is processed, and~ - Inside source: true *** True Line Result - # sets console command when sample app initially opens -** Processing line: ~ if Kernel.global_tick_count == 0~ + # User input is processed, and +** Processing line: ~ # The next step in the search is calculated~ - Inside source: true *** True Line Result - if Kernel.global_tick_count == 0 -** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ + # The next step in the search is calculated +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - args.gtk.console.set_command "reset_with count: 100" -** Processing line: ~ end~ + def tick +** Processing line: ~ render~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render +** Processing line: ~ input~ - Inside source: true *** True Line Result - -** Processing line: ~ # init~ + input +** Processing line: ~ # If animation is playing, and max steps have not been reached~ - Inside source: true *** True Line Result - # init -** Processing line: ~ if args.state.tick_count == 0~ + # If animation is playing, and max steps have not been reached +** Processing line: ~ # Move the search a step forward~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~ + # Move the search a step forward +** Processing line: ~ if state.play && state.anim_steps < state.max_steps~ - Inside source: true *** True Line Result - args.state.stars = args.state.star_count.map { |i| Star.new args.grid } -** Processing line: ~ args.outputs.static_sprites << args.state.stars~ + if state.play && state.anim_steps < state.max_steps +** Processing line: ~ # Variable that tells the program what step to recalculate up to~ - Inside source: true *** True Line Result - args.outputs.static_sprites << args.state.stars + # Variable that tells the program what step to recalculate up to +** Processing line: ~ state.anim_steps += 1~ +- Inside source: true +*** True Line Result + state.anim_steps += 1 +** Processing line: ~ calc~ +- Inside source: true +*** True Line Result + calc +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55100,342 +63643,322 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # render framerate~ +** Processing line: ~ # Draws everything onto the screen~ - Inside source: true *** True Line Result - # render framerate -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + # Draws everything onto the screen +** Processing line: ~ def render~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ + def render +** Processing line: ~ render_buttons~ - Inside source: true *** True Line Result - args.outputs.primitives << args.gtk.current_framerate_primitives -** Processing line: ~ end~ + render_buttons +** Processing line: ~ render_slider~ - Inside source: true *** True Line Result - end + render_slider ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # resets game, and assigns star count given by user~ +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - # resets game, and assigns star count given by user -** Processing line: ~ def reset_with count: count~ + render_background +** Processing line: ~ render_visited~ - Inside source: true *** True Line Result - def reset_with count: count -** Processing line: ~ $gtk.reset~ + render_visited +** Processing line: ~ render_frontier~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ $gtk.args.state.star_count = count~ + render_frontier +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - $gtk.args.state.star_count = count -** Processing line: ~ end~ + render_walls +** Processing line: ~ render_star~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render_star +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Performance - Collision Limits - main.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ +- Inside source: true *** True Line Result -*** Performance - Collision Limits - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # The methods below subdivide the task of drawing everything to the screen +** Processing line: ~~ +- Inside source: true *** True Line Result -*** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/09_performance/07_collision_limits/app/main.rb~ +** Processing line: ~ # Draws the buttons that control the animation step and state~ - Inside source: true *** True Line Result - # ./samples/09_performance/07_collision_limits/app/main.rb -** Processing line: ~ =begin~ + # Draws the buttons that control the animation step and state +** Processing line: ~ def render_buttons~ - Inside source: true *** True Line Result - =begin -** Processing line: ~~ + def render_buttons +** Processing line: ~ render_left_button~ - Inside source: true *** True Line Result - -** Processing line: ~ Reminders:~ + render_left_button +** Processing line: ~ render_center_button~ - Inside source: true *** True Line Result - Reminders: -** Processing line: ~ - find_all: Finds all elements of a collection that meet certain requirements.~ + render_center_button +** Processing line: ~ render_right_button~ - Inside source: true *** True Line Result - - find_all: Finds all elements of a collection that meet certain requirements. -** Processing line: ~ In this sample app, we're finding all bodies that intersect with the center body.~ + render_right_button +** Processing line: ~ end~ - Inside source: true *** True Line Result - In this sample app, we're finding all bodies that intersect with the center body. + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - args.outputs.solids: An array. The values generate a solid.~ +** Processing line: ~ # Draws the button which steps the search backward~ - Inside source: true *** True Line Result - - args.outputs.solids: An array. The values generate a solid. -** Processing line: ~ The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~ + # Draws the button which steps the search backward +** Processing line: ~ # Shows the user where to click to move the search backward~ - Inside source: true *** True Line Result - The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE] -** Processing line: ~ For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~ + # Shows the user where to click to move the search backward +** Processing line: ~ def render_left_button~ - Inside source: true *** True Line Result - For more information about solids, go to mygame/documentation/03-solids-and-borders.md. -** Processing line: ~~ + def render_left_button +** Processing line: ~ # Draws the gray button, and a black border~ - Inside source: true *** True Line Result - -** Processing line: ~ - args.outputs.labels: An array. The values generate a label.~ + # Draws the gray button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - - args.outputs.labels: An array. The values generate a label. -** Processing line: ~ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.left, gray]~ - Inside source: true *** True Line Result - The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] -** Processing line: ~ For more information about labels, go to mygame/documentation/02-labels.md.~ + outputs.solids << [buttons.left, gray] +** Processing line: ~ outputs.borders << [buttons.left, black]~ - Inside source: true *** True Line Result - For more information about labels, go to mygame/documentation/02-labels.md. + outputs.borders << [buttons.left, black] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~ +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect. -** Processing line: ~~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - -** Processing line: ~ =end~ + # Explains to the user what the button does +** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ - Inside source: true *** True Line Result - =end -** Processing line: ~~ + # If the button size is changed, the label might need to be edited as well +** Processing line: ~ # to keep the label in the center of the button~ - Inside source: true *** True Line Result - -** Processing line: ~ # This code demonstrates moving objects that loop around once they exceed the scope of the screen,~ + # to keep the label in the center of the button +** Processing line: ~ label_x = buttons.left.x + 20~ - Inside source: true *** True Line Result - # This code demonstrates moving objects that loop around once they exceed the scope of the screen, -** Processing line: ~ # which has dimensions of 1280 by 720, and also detects collisions between objects called "bodies".~ + label_x = buttons.left.x + 20 +** Processing line: ~ label_y = buttons.left.y + 35~ - Inside source: true *** True Line Result - # which has dimensions of 1280 by 720, and also detects collisions between objects called "bodies". + label_y = buttons.left.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, "<"]~ +- Inside source: true +*** True Line Result + outputs.labels << [label_x, label_y, "<"] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def body_count num~ +** Processing line: ~ def render_center_button~ - Inside source: true *** True Line Result - def body_count num -** Processing line: ~ $gtk.args.state.other_bodies = num.map { [1280 * rand, 720 * rand, 10, 10] } # other_bodies set using num collection~ + def render_center_button +** Processing line: ~ # Draws the gray button, and a black border~ - Inside source: true *** True Line Result - $gtk.args.state.other_bodies = num.map { [1280 * rand, 720 * rand, 10, 10] } # other_bodies set using num collection -** Processing line: ~ end~ + # Draws the gray button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.center, gray]~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + outputs.solids << [buttons.center, gray] +** Processing line: ~ outputs.borders << [buttons.center, black]~ - Inside source: true *** True Line Result - def tick args + outputs.borders << [buttons.center, black] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Center body's values are set using an array~ -- Inside source: true -*** True Line Result - # Center body's values are set using an array -** Processing line: ~ # Map is used to set values of 2000 other bodies~ +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - # Map is used to set values of 2000 other bodies -** Processing line: ~ # All bodies that intersect with center body are stored in collisions collection~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - # All bodies that intersect with center body are stored in collisions collection -** Processing line: ~ args.state.center_body ||= [640 - 100, 360 - 100, 200, 200] # calculations done to place body in center~ + # Explains to the user what the button does +** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ - Inside source: true *** True Line Result - args.state.center_body ||= [640 - 100, 360 - 100, 200, 200] # calculations done to place body in center -** Processing line: ~ args.state.other_bodies ||= 2000.map { [1280 * rand, 720 * rand, 10, 10] } # 2000 bodies given random position on screen~ + # If the button size is changed, the label might need to be edited as well +** Processing line: ~ # to keep the label in the center of the button~ - Inside source: true *** True Line Result - args.state.other_bodies ||= 2000.map { [1280 * rand, 720 * rand, 10, 10] } # 2000 bodies given random position on screen -** Processing line: ~~ + # to keep the label in the center of the button +** Processing line: ~ label_x = buttons.center.x + 37~ - Inside source: true *** True Line Result - -** Processing line: ~ # finds all bodies that intersect with center body, stores them in collisions~ + label_x = buttons.center.x + 37 +** Processing line: ~ label_y = buttons.center.y + 35~ - Inside source: true *** True Line Result - # finds all bodies that intersect with center body, stores them in collisions -** Processing line: ~ collisions = args.state.other_bodies.find_all { |b| b.intersect_rect? args.state.center_body }~ + label_y = buttons.center.y + 35 +** Processing line: ~ label_text = state.play ? "Pause Animation" : "Play Animation"~ - Inside source: true *** True Line Result - collisions = args.state.other_bodies.find_all { |b| b.intersect_rect? args.state.center_body } -** Processing line: ~~ + label_text = state.play ? "Pause Animation" : "Play Animation" +** Processing line: ~ outputs.labels << [label_x, label_y, label_text]~ - Inside source: true *** True Line Result - -** Processing line: ~ args.borders << args.state.center_body # outputs center body as a black border~ + outputs.labels << [label_x, label_y, label_text] +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.borders << args.state.center_body # outputs center body as a black border + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # transparency changes based on number of collisions; the more collisions, the redder (more transparent) the box becomes~ +** Processing line: ~ def render_right_button~ - Inside source: true *** True Line Result - # transparency changes based on number of collisions; the more collisions, the redder (more transparent) the box becomes -** Processing line: ~ args.solids << [args.state.center_body, 255, 0, 0, collisions.length * 5] # center body is red solid~ + def render_right_button +** Processing line: ~ # Draws the gray button, and a black border~ - Inside source: true *** True Line Result - args.solids << [args.state.center_body, 255, 0, 0, collisions.length * 5] # center body is red solid -** Processing line: ~ args.solids << args.state.other_bodies # other bodies are output as (black) solids, as well~ + # Draws the gray button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - args.solids << args.state.other_bodies # other bodies are output as (black) solids, as well -** Processing line: ~~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.right, gray]~ - Inside source: true *** True Line Result - -** Processing line: ~ args.labels << [10, 30, args.gtk.current_framerate] # outputs frame rate in bottom left corner~ + outputs.solids << [buttons.right, gray] +** Processing line: ~ outputs.borders << [buttons.right, black]~ - Inside source: true *** True Line Result - args.labels << [10, 30, args.gtk.current_framerate] # outputs frame rate in bottom left corner + outputs.borders << [buttons.right, black] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Bodies are returned to bottom left corner if positions exceed scope of screen~ -- Inside source: true -*** True Line Result - # Bodies are returned to bottom left corner if positions exceed scope of screen -** Processing line: ~ args.state.other_bodies.each do |b| # for each body in the other_bodies collection~ +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - args.state.other_bodies.each do |b| # for each body in the other_bodies collection -** Processing line: ~ b.x += 5 # x and y are both incremented by 5~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - b.x += 5 # x and y are both incremented by 5 -** Processing line: ~ b.y += 5~ + # Explains to the user what the button does +** Processing line: ~ label_x = buttons.right.x + 20~ - Inside source: true *** True Line Result - b.y += 5 -** Processing line: ~ b.x = 0 if b.x > 1280 # x becomes 0 if star exceeds scope of screen (goes too far right)~ + label_x = buttons.right.x + 20 +** Processing line: ~ label_y = buttons.right.y + 35~ - Inside source: true *** True Line Result - b.x = 0 if b.x > 1280 # x becomes 0 if star exceeds scope of screen (goes too far right) -** Processing line: ~ b.y = 0 if b.y > 720 # y becomes 0 if star exceeds scope of screen (goes too far up)~ + label_y = buttons.right.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, ">"]~ - Inside source: true *** True Line Result - b.y = 0 if b.y > 720 # y becomes 0 if star exceeds scope of screen (goes too far up) + outputs.labels << [label_x, label_y, ">"] ** 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: ~ # Resets the game.~ +** Processing line: ~ # Draws the slider so the user can move it and see the progress of the search~ - Inside source: true *** True Line Result - # Resets the game. -** Processing line: ~ $gtk.reset~ + # Draws the slider so the user can move it and see the progress of the search +** Processing line: ~ def render_slider~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~~ + def render_slider +** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Trace Debugging - main.rb~ -- Header detected. -*** True Line Result - + # Using primitives hides the line under the white circle of the slider +** Processing line: ~ # Draws the line~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Trace Debugging - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Draws the line +** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ +- Inside source: true *** True Line Result - + outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line +** Processing line: ~ # The circle needs to be offset so that the center of the circle~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb~ + # The circle needs to be offset so that the center of the circle +** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb -** Processing line: ~ class Game~ + # overlaps the line instead of the upper right corner of the circle +** Processing line: ~ # The circle's x value is also moved based on the current seach step~ - Inside source: true *** True Line Result - class Game -** Processing line: ~ attr_gtk~ + # The circle's x value is also moved based on the current seach step +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ - Inside source: true *** True Line Result - attr_gtk -** Processing line: ~~ + circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ - Inside source: true *** True Line Result - -** Processing line: ~ def method1 num~ + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ - Inside source: true *** True Line Result - def method1 num -** Processing line: ~ method2 num~ + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ - Inside source: true *** True Line Result - method2 num + outputs.primitives << [circle_rect, 'circle-white.png'].sprite ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55444,14 +63967,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def method2 num~ +** Processing line: ~ # Draws what the grid looks like with nothing on it~ - Inside source: true *** True Line Result - def method2 num -** Processing line: ~ method3 num~ + # Draws what the grid looks like with nothing on it +** Processing line: ~ def render_background~ - Inside source: true *** True Line Result - method3 num + def render_background +** Processing line: ~ render_unvisited~ +- Inside source: true +*** True Line Result + render_unvisited +** Processing line: ~ render_grid_lines~ +- Inside source: true +*** True Line Result + render_grid_lines ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55460,14 +63991,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def method3 num~ +** Processing line: ~ # Draws a rectangle the size of the entire grid to represent unvisited cells~ - Inside source: true *** True Line Result - def method3 num -** Processing line: ~ method4 num~ + # Draws a rectangle the size of the entire grid to represent unvisited cells +** Processing line: ~ def render_unvisited~ - Inside source: true *** True Line Result - method4 num + def render_unvisited +** Processing line: ~ outputs.solids << [scale_up([0, 0, grid.width, grid.height]), unvisited_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [scale_up([0, 0, grid.width, grid.height]), unvisited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55476,42 +64011,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def method4 num~ -- Inside source: true -*** True Line Result - def method4 num -** Processing line: ~ if num == 1~ +** Processing line: ~ # Draws grid lines to show the division of the grid into cells~ - Inside source: true *** True Line Result - if num == 1 -** Processing line: ~ puts "UNLUCKY #{num}."~ + # Draws grid lines to show the division of the grid into cells +** Processing line: ~ def render_grid_lines~ - Inside source: true *** True Line Result - puts "UNLUCKY #{num}." -** Processing line: ~ state.unlucky_count += 1~ + def render_grid_lines +** Processing line: ~ for x in 0..grid.width~ - Inside source: true *** True Line Result - state.unlucky_count += 1 -** Processing line: ~ if state.unlucky_count > 3~ + for x in 0..grid.width +** Processing line: ~ outputs.lines << vertical_line(x)~ - Inside source: true *** True Line Result - if state.unlucky_count > 3 -** Processing line: ~ raise "NAT 1 finally occurred. Check app/trace.txt for all method invocation history."~ + outputs.lines << vertical_line(x) +** Processing line: ~ end~ - Inside source: true *** True Line Result - raise "NAT 1 finally occurred. Check app/trace.txt for all method invocation history." -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ else~ + +** Processing line: ~ for y in 0..grid.height~ - Inside source: true *** True Line Result - else -** Processing line: ~ puts "LUCKY #{num}."~ + for y in 0..grid.height +** Processing line: ~ outputs.lines << horizontal_line(y)~ - Inside source: true *** True Line Result - puts "LUCKY #{num}." + outputs.lines << horizontal_line(y) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55524,150 +64055,126 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def tick~ +** Processing line: ~ # Easy way to draw vertical lines given an index~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ state.roll_history ||= []~ + # Easy way to draw vertical lines given an index +** Processing line: ~ def vertical_line column~ - Inside source: true *** True Line Result - state.roll_history ||= [] -** Processing line: ~ state.roll_history << rand(20) + 1~ + def vertical_line column +** Processing line: ~ scale_up([column, 0, column, grid.height])~ - Inside source: true *** True Line Result - state.roll_history << rand(20) + 1 -** Processing line: ~ state.countdown ||= 600~ + scale_up([column, 0, column, grid.height]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.countdown ||= 600 -** Processing line: ~ state.countdown -= 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.countdown -= 1 -** Processing line: ~ state.unlucky_count ||= 0~ + +** Processing line: ~ # Easy way to draw horizontal lines given an index~ - Inside source: true *** True Line Result - state.unlucky_count ||= 0 -** Processing line: ~ outputs.labels << [640, 360, "A dice roll of 1 will cause an exception.", 0, 1]~ + # Easy way to draw horizontal lines given an index +** Processing line: ~ def horizontal_line row~ - Inside source: true *** True Line Result - outputs.labels << [640, 360, "A dice roll of 1 will cause an exception.", 0, 1] -** Processing line: ~ if state.countdown > 0~ + def horizontal_line row +** Processing line: ~ scale_up([0, row, grid.width, row])~ - Inside source: true *** True Line Result - if state.countdown > 0 -** Processing line: ~ outputs.labels << [640, 340, "Dice roll countdown: #{state.countdown}", 0, 1]~ + scale_up([0, row, grid.width, row]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [640, 340, "Dice roll countdown: #{state.countdown}", 0, 1] -** Processing line: ~ else~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - else -** Processing line: ~ state.attempts ||= 0~ + +** Processing line: ~ # Draws the area that is going to be searched from~ - Inside source: true *** True Line Result - state.attempts ||= 0 -** Processing line: ~ state.attempts += 1~ + # Draws the area that is going to be searched from +** Processing line: ~ # The frontier is the most outward parts of the search~ - Inside source: true *** True Line Result - state.attempts += 1 -** Processing line: ~ outputs.labels << [640, 340, "ROLLING! #{state.attempts}", 0, 1]~ + # The frontier is the most outward parts of the search +** Processing line: ~ def render_frontier~ - Inside source: true *** True Line Result - outputs.labels << [640, 340, "ROLLING! #{state.attempts}", 0, 1] -** Processing line: ~ end~ + def render_frontier +** Processing line: ~ outputs.solids << state.frontier.map do |cell|~ - Inside source: true *** True Line Result - end -** Processing line: ~ return if state.countdown > 0~ + outputs.solids << state.frontier.map do |cell| +** Processing line: ~ [scale_up([cell.x, cell.y]), frontier_color]~ - Inside source: true *** True Line Result - return if state.countdown > 0 -** Processing line: ~ method1 state.roll_history[-1]~ + [scale_up([cell.x, cell.y]), frontier_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - method1 state.roll_history[-1] + 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: ~ $game = Game.new~ -- Inside source: true -*** True Line Result - $game = Game.new -** Processing line: ~~ +** Processing line: ~ # Draws the walls~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + # Draws the walls +** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ trace! $game # <------------------- TRACING ENABLED FOR THIS OBJECT~ + def render_walls +** Processing line: ~ outputs.solids << state.walls.map do |wall|~ - Inside source: true *** True Line Result - trace! $game # <------------------- TRACING ENABLED FOR THIS OBJECT -** Processing line: ~ $game.args = args~ + outputs.solids << state.walls.map do |wall| +** Processing line: ~ [scale_up([wall.x, wall.y]), wall_color]~ - Inside source: true *** True Line Result - $game.args = args -** Processing line: ~ $game.tick~ + [scale_up([wall.x, wall.y]), wall_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - $game.tick -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Trace Debugging Classes - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Advanced Debugging - Trace Debugging Classes - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - +** Processing line: ~ # Renders cells that have been searched in the appropriate color~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/02_trace_debugging_classes/app/main.rb~ + # Renders cells that have been searched in the appropriate color +** Processing line: ~ def render_visited~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/02_trace_debugging_classes/app/main.rb -** Processing line: ~ class Foobar~ + def render_visited +** Processing line: ~ outputs.solids << state.visited.map do |cell|~ - Inside source: true *** True Line Result - class Foobar -** Processing line: ~ def initialize~ + outputs.solids << state.visited.map do |cell| +** Processing line: ~ [scale_up([cell.x, cell.y]), visited_color]~ - Inside source: true *** True Line Result - def initialize -** Processing line: ~ trace! # Trace is added to the constructor.~ + [scale_up([cell.x, cell.y]), visited_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - trace! # Trace is added to the constructor. + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55676,18 +64183,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def clicky args~ +** Processing line: ~ # Renders the star~ - Inside source: true *** True Line Result - def clicky args -** Processing line: ~ return unless args.inputs.mouse.click~ + # Renders the star +** Processing line: ~ def render_star~ - Inside source: true *** True Line Result - return unless args.inputs.mouse.click -** Processing line: ~ try_rand rand~ + def render_star +** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - try_rand rand + outputs.sprites << [scale_up(state.star), 'star.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -55696,998 +64203,986 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def try_rand num~ +** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ - Inside source: true *** True Line Result - def try_rand num -** Processing line: ~ return if num < 0.9~ + # In code, the cells are represented as 1x1 rectangles +** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ - Inside source: true *** True Line Result - return if num < 0.9 -** Processing line: ~ raise "Exception finally occurred. Take a look at logs/trace.txt #{num}."~ + # When drawn, the cells are larger than 1x1 rectangles +** Processing line: ~ # This method is used to scale up cells, and lines~ - Inside source: true *** True Line Result - raise "Exception finally occurred. Take a look at logs/trace.txt #{num}." -** Processing line: ~ end~ + # This method is used to scale up cells, and lines +** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Objects are scaled up according to the grid.cell_size variable +** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # This allows for easy customization of the visual scale of the grid +** Processing line: ~ def scale_up(cell)~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + def scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.labels << [640, 360, "Start clicking. Eventually an exception will be thrown. Then look at logs/trace.txt.", 0, 1]~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - args.labels << [640, 360, "Start clicking. Eventually an exception will be thrown. Then look at logs/trace.txt.", 0, 1] -** Processing line: ~ args.state.foobar = Foobar.new if args.tick_count~ + cell = cell.clone +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.foobar = Foobar.new if args.tick_count -** Processing line: ~ return unless args.state.foobar~ + +** Processing line: ~ # If cell is just an x and y coordinate~ - Inside source: true *** True Line Result - return unless args.state.foobar -** Processing line: ~ args.state.foobar.clicky args~ + # If cell is just an x and y coordinate +** Processing line: ~ if cell.size == 2~ - Inside source: true *** True Line Result - args.state.foobar.clicky args -** Processing line: ~ end~ + if cell.size == 2 +** Processing line: ~ # Add a width and height of 1~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Add a width and height of 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - exception_raising_tests.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Advanced Debugging - Unit Tests - exception_raising_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + cell << 1 +** Processing line: ~ cell << 1~ +- Inside source: true *** True Line Result - + cell << 1 +** Processing line: ~ end~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/exception_raising_tests.rb -** Processing line: ~ begin :shared~ + +** Processing line: ~ # Scale all the values up~ - Inside source: true *** True Line Result - begin :shared -** Processing line: ~ class ExceptionalClass~ + # Scale all the values up +** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ - Inside source: true *** True Line Result - class ExceptionalClass -** Processing line: ~ def initialize exception_to_throw = nil~ + cell.map! { |value| value * grid.cell_size } +** Processing line: ~~ - Inside source: true *** True Line Result - def initialize exception_to_throw = nil -** Processing line: ~ raise exception_to_throw if exception_to_throw~ + +** Processing line: ~ # Returns the scaled up cell~ - Inside source: true *** True Line Result - raise exception_to_throw if exception_to_throw -** Processing line: ~ end~ + # Returns the scaled up cell +** Processing line: ~ cell~ - Inside source: true *** True Line Result - end + cell ** 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 test_exception_in_newing_object args, assert~ +** Processing line: ~ # This method processes user input every tick~ - Inside source: true *** True Line Result - def test_exception_in_newing_object args, assert -** Processing line: ~ begin~ + # This method processes user input every tick +** Processing line: ~ # This method allows the user to use the buttons, slider, and edit the grid~ - Inside source: true *** True Line Result - begin -** Processing line: ~ ExceptionalClass.new TypeError~ + # This method allows the user to use the buttons, slider, and edit the grid +** Processing line: ~ # There are 2 types of input:~ - Inside source: true *** True Line Result - ExceptionalClass.new TypeError -** Processing line: ~ raise "Exception wasn't thrown!"~ + # There are 2 types of input: +** Processing line: ~ # Button Input~ - Inside source: true *** True Line Result - raise "Exception wasn't thrown!" -** Processing line: ~ rescue Exception => e~ + # Button Input +** Processing line: ~ # Click and Drag Input~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ assert.equal! e.class, TypeError, "Exceptions within constructor should be retained."~ + # Click and Drag Input +** Processing line: ~ #~ - Inside source: true *** True Line Result - assert.equal! e.class, TypeError, "Exceptions within constructor should be retained." -** Processing line: ~ end~ + # +** Processing line: ~ # Button Input is used for the backward step and forward step buttons~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Button Input is used for the backward step and forward step buttons +** Processing line: ~ # Input is detected by mouse up within the bounds of the rect~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Input is detected by mouse up within the bounds of the rect +** Processing line: ~ #~ - Inside source: true *** True Line Result - -** Processing line: ~ $gtk.reset 100~ + # +** Processing line: ~ # Click and Drag Input is used for moving the star, adding walls,~ - Inside source: true *** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ + # Click and Drag Input is used for moving the star, adding walls, +** Processing line: ~ # removing walls, and the slider~ - Inside source: true *** True Line Result - $gtk.log_level = :off -** Processing line: ~~ + # removing walls, and the slider +** Processing line: ~ #~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - fn_tests.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Advanced Debugging - Unit Tests - fn_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - + # +** Processing line: ~ # When the mouse is down on the star, the click_and_drag variable is set to :star~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/fn_tests.rb~ + # When the mouse is down on the star, the click_and_drag variable is set to :star +** Processing line: ~ # While click_and_drag equals :star, the cursor's position is used to calculate the~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/fn_tests.rb -** Processing line: ~ def infinity~ + # While click_and_drag equals :star, the cursor's position is used to calculate the +** Processing line: ~ # appropriate drag behavior~ - Inside source: true *** True Line Result - def infinity -** Processing line: ~ 1 / 0~ + # appropriate drag behavior +** Processing line: ~ #~ - Inside source: true *** True Line Result - 1 / 0 -** Processing line: ~ end~ + # +** Processing line: ~ # When the mouse goes up click_and_drag is set to :none~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # When the mouse goes up click_and_drag is set to :none +** Processing line: ~ #~ - Inside source: true *** True Line Result - -** Processing line: ~ def neg_infinity~ + # +** Processing line: ~ # A variable has to be used because the star has to continue being edited even~ - Inside source: true *** True Line Result - def neg_infinity -** Processing line: ~ -1 / 0~ + # A variable has to be used because the star has to continue being edited even +** Processing line: ~ # when the cursor is no longer over the star~ - Inside source: true *** True Line Result - -1 / 0 -** Processing line: ~ end~ + # when the cursor is no longer over the star +** Processing line: ~ #~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # +** Processing line: ~ # Similar things occur for the other Click and Drag inputs~ - Inside source: true *** True Line Result - -** Processing line: ~ def nan~ + # Similar things occur for the other Click and Drag inputs +** Processing line: ~ def input~ - Inside source: true *** True Line Result - def nan -** Processing line: ~ 0.0 / 0~ + def input +** Processing line: ~ # Checks whether any of the buttons are being clicked~ - Inside source: true *** True Line Result - 0.0 / 0 -** Processing line: ~ end~ + # Checks whether any of the buttons are being clicked +** Processing line: ~ input_buttons~ - Inside source: true *** True Line Result - end + input_buttons ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_add args, assert~ +** Processing line: ~ # The detection and processing of click and drag inputs are separate~ - Inside source: true *** True Line Result - def test_add args, assert -** Processing line: ~ assert.equal! (args.fn.add), 0~ + # The detection and processing of click and drag inputs are separate +** Processing line: ~ # The program has to remember that the user is dragging an object~ - Inside source: true *** True Line Result - assert.equal! (args.fn.add), 0 -** Processing line: ~ assert.equal! (args.fn.+), 0~ + # The program has to remember that the user is dragging an object +** Processing line: ~ # even when the mouse is no longer over that object~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+), 0 -** Processing line: ~ assert.equal! (args.fn.+ 1, 2, 3), 6~ + # even when the mouse is no longer over that object +** Processing line: ~ detect_click_and_drag~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ 1, 2, 3), 6 -** Processing line: ~ assert.equal! (args.fn.+ 0), 0~ + detect_click_and_drag +** Processing line: ~ process_click_and_drag~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ 0), 0 -** Processing line: ~ assert.equal! (args.fn.+ 0, nil), 0~ + process_click_and_drag +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ 0, nil), 0 -** Processing line: ~ assert.equal! (args.fn.+ 0, nan), nil~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ 0, nan), nil -** Processing line: ~ assert.equal! (args.fn.+ 0, nil, infinity), nil~ + +** Processing line: ~ # Detects and Process input for each button~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ 0, nil, infinity), nil -** Processing line: ~ assert.equal! (args.fn.+ [1, 2, 3, [4, 5, 6]]), 21~ + # Detects and Process input for each button +** Processing line: ~ def input_buttons~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ [1, 2, 3, [4, 5, 6]]), 21 -** Processing line: ~ assert.equal! (args.fn.+ [nil, [4, 5, 6]]), 15~ + def input_buttons +** Processing line: ~ input_left_button~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+ [nil, [4, 5, 6]]), 15 -** Processing line: ~ end~ + input_left_button +** Processing line: ~ input_center_button~ - Inside source: true *** True Line Result - end + input_center_button +** Processing line: ~ input_next_step_button~ +- Inside source: true +*** True Line Result + input_next_step_button +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_sub args, assert~ +** Processing line: ~ # Checks if the previous step button is clicked~ - Inside source: true *** True Line Result - def test_sub args, assert -** Processing line: ~ neg_infinity = infinity * -1~ + # Checks if the previous step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ - Inside source: true *** True Line Result - neg_infinity = infinity * -1 -** Processing line: ~ assert.equal! (args.fn.+), 0~ + # If it is, it pauses the animation and moves the search one step backward +** Processing line: ~ def input_left_button~ - Inside source: true *** True Line Result - assert.equal! (args.fn.+), 0 -** Processing line: ~ assert.equal! (args.fn.- 1, 2, 3), -4~ + def input_left_button +** Processing line: ~ if left_button_clicked?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- 1, 2, 3), -4 -** Processing line: ~ assert.equal! (args.fn.- 4), -4~ + if left_button_clicked? +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- 4), -4 -** Processing line: ~ assert.equal! (args.fn.- 4, nan), nil~ + state.play = false +** Processing line: ~ state.anim_steps -= 1~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- 4, nan), nil -** Processing line: ~ assert.equal! (args.fn.- 0, nil), 0~ + state.anim_steps -= 1 +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- 0, nil), 0 -** Processing line: ~ assert.equal! (args.fn.- 0, nil, infinity), nil~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- 0, nil, infinity), nil -** Processing line: ~ assert.equal! (args.fn.- [0, 1, 2, 3, [4, 5, 6]]), -21~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- [0, 1, 2, 3, [4, 5, 6]]), -21 -** Processing line: ~ assert.equal! (args.fn.- [nil, 0, [4, 5, 6]]), -15~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.- [nil, 0, [4, 5, 6]]), -15 -** Processing line: ~ end~ + +** Processing line: ~ # Controls the play/pause button~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Controls the play/pause button +** Processing line: ~ # Inverses whether the animation is playing or not when clicked~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_div args, assert~ + # Inverses whether the animation is playing or not when clicked +** Processing line: ~ def input_center_button~ - Inside source: true *** True Line Result - def test_div args, assert -** Processing line: ~ assert.equal! (args.fn.div), 1~ + def input_center_button +** Processing line: ~ if center_button_clicked? or inputs.keyboard.key_down.space~ - Inside source: true *** True Line Result - assert.equal! (args.fn.div), 1 -** Processing line: ~ assert.equal! (args.fn./), 1~ + if center_button_clicked? or inputs.keyboard.key_down.space +** Processing line: ~ state.play = !state.play~ - Inside source: true *** True Line Result - assert.equal! (args.fn./), 1 -** Processing line: ~ assert.equal! (args.fn./ 6, 3), 2~ + state.play = !state.play +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ 6, 3), 2 -** Processing line: ~ assert.equal! (args.fn./ 6, infinity), nil~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ 6, infinity), nil -** Processing line: ~ assert.equal! (args.fn./ 6, nan), nil~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ 6, nan), nil -** Processing line: ~ assert.equal! (args.fn./ infinity), nil~ + +** Processing line: ~ # Checks if the next step button is clicked~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ infinity), nil -** Processing line: ~ assert.equal! (args.fn./ 0), nil~ + # Checks if the next step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ 0), nil -** Processing line: ~ assert.equal! (args.fn./ 6, [3]), 2~ + # If it is, it pauses the animation and moves the search one step forward +** Processing line: ~ def input_next_step_button~ - Inside source: true *** True Line Result - assert.equal! (args.fn./ 6, [3]), 2 -** Processing line: ~ end~ + def input_next_step_button +** Processing line: ~ if right_button_clicked?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if right_button_clicked? +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_idiv args, assert~ + state.play = false +** Processing line: ~ state.anim_steps += 1~ - Inside source: true *** True Line Result - def test_idiv args, assert -** Processing line: ~ assert.equal! (args.fn.idiv), 1~ + state.anim_steps += 1 +** Processing line: ~ calc~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv), 1 -** Processing line: ~ assert.equal! (args.fn.idiv 7, 3), 2~ + calc +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv 7, 3), 2 -** Processing line: ~ assert.equal! (args.fn.idiv 6, infinity), nil~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv 6, infinity), nil -** Processing line: ~ assert.equal! (args.fn.idiv 6, nan), nil~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv 6, nan), nil -** Processing line: ~ assert.equal! (args.fn.idiv infinity), nil~ + +** Processing line: ~ # Determines what the user is editing and stores the value~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv infinity), nil -** Processing line: ~ assert.equal! (args.fn.idiv 0), nil~ + # Determines what the user is editing and stores the value +** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv 0), nil -** Processing line: ~ assert.equal! (args.fn.idiv 7, [3]), 2~ + # Storing the value allows the user to continue the same edit as long as the +** Processing line: ~ # mouse left click is held~ - Inside source: true *** True Line Result - assert.equal! (args.fn.idiv 7, [3]), 2 -** Processing line: ~ end~ + # mouse left click is held +** Processing line: ~ def detect_click_and_drag~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def detect_click_and_drag +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_mul args, assert~ + if inputs.mouse.up +** Processing line: ~ state.click_and_drag = :none~ - Inside source: true *** True Line Result - def test_mul args, assert -** Processing line: ~ assert.equal! (args.fn.mul), 1~ + state.click_and_drag = :none +** Processing line: ~ elsif star_clicked?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.mul), 1 -** Processing line: ~ assert.equal! (args.fn.*), 1~ + elsif star_clicked? +** Processing line: ~ state.click_and_drag = :star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.*), 1 -** Processing line: ~ assert.equal! (args.fn.* 7, 3), 21~ + state.click_and_drag = :star +** Processing line: ~ elsif wall_clicked?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* 7, 3), 21 -** Processing line: ~ assert.equal! (args.fn.* 6, nan), nil~ + elsif wall_clicked? +** Processing line: ~ state.click_and_drag = :remove_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* 6, nan), nil -** Processing line: ~ assert.equal! (args.fn.* 6, infinity), nil~ + state.click_and_drag = :remove_wall +** Processing line: ~ elsif grid_clicked?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* 6, infinity), nil -** Processing line: ~ assert.equal! (args.fn.* infinity), nil~ + elsif grid_clicked? +** Processing line: ~ state.click_and_drag = :add_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* infinity), nil -** Processing line: ~ assert.equal! (args.fn.* 0), 0~ + state.click_and_drag = :add_wall +** Processing line: ~ elsif slider_clicked?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* 0), 0 -** Processing line: ~ assert.equal! (args.fn.* 7, [3]), 21~ + elsif slider_clicked? +** Processing line: ~ state.click_and_drag = :slider~ - Inside source: true *** True Line Result - assert.equal! (args.fn.* 7, [3]), 21 -** Processing line: ~ end~ + state.click_and_drag = :slider +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_lt args, assert~ +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ - Inside source: true *** True Line Result - def test_lt args, assert -** Processing line: ~ assert.equal! (args.fn.lt 1), 1~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_click_and_drag~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lt 1), 1 -** Processing line: ~ assert.equal! (args.fn.lt), nil~ + def process_click_and_drag +** Processing line: ~ if state.click_and_drag == :star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lt), nil -** Processing line: ~ assert.equal! (args.fn.lt infinity), nil~ + if state.click_and_drag == :star +** Processing line: ~ input_star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lt infinity), nil -** Processing line: ~ assert.equal! (args.fn.lt nan), nil~ + input_star +** Processing line: ~ elsif state.click_and_drag == :remove_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lt nan), nil -** Processing line: ~ assert.equal! (args.fn.lt 10, 9, 8), 8~ + elsif state.click_and_drag == :remove_wall +** Processing line: ~ input_remove_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lt 10, 9, 8), 8 -** Processing line: ~ assert.equal! (args.fn.< 10, 9, 8), 8~ + input_remove_wall +** Processing line: ~ elsif state.click_and_drag == :add_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.< 10, 9, 8), 8 -** Processing line: ~ assert.equal! (args.fn.< [10, 9, [8]]), 8~ + elsif state.click_and_drag == :add_wall +** Processing line: ~ input_add_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.< [10, 9, [8]]), 8 -** Processing line: ~ assert.equal! (args.fn.< 10, 10), nil~ + input_add_wall +** Processing line: ~ elsif state.click_and_drag == :slider~ - Inside source: true *** True Line Result - assert.equal! (args.fn.< 10, 10), nil -** Processing line: ~ end~ + elsif state.click_and_drag == :slider +** Processing line: ~ input_slider~ - Inside source: true *** True Line Result - end + input_slider +** 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 test_lte args, assert~ +** Processing line: ~ # Moves the star to the grid closest to the mouse~ - Inside source: true *** True Line Result - def test_lte args, assert -** Processing line: ~ assert.equal! (args.fn.lte 1), 1~ + # Moves the star to the grid closest to the mouse +** Processing line: ~ # Only recalculates the search if the star changes position~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte 1), 1 -** Processing line: ~ assert.equal! (args.fn.lte), nil~ + # Only recalculates the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte), nil -** Processing line: ~ assert.equal! (args.fn.lte infinity), nil~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte infinity), nil -** Processing line: ~ assert.equal! (args.fn.lte nan), nil~ + def input_star +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte nan), nil -** Processing line: ~ assert.equal! (args.fn.lte 10, 9, 8), 8~ + old_star = state.star.clone +** Processing line: ~ state.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte 10, 9, 8), 8 -** Processing line: ~ assert.equal! (args.fn.lte 10, 10), 10~ + state.star = cell_closest_to_mouse +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte 10, 10), 10 -** Processing line: ~ assert.equal! (args.fn.lte 10, 9, [8]), 8~ + unless old_star == state.star +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.lte 10, 9, [8]), 8 -** Processing line: ~ assert.equal! (args.fn.<= 10, 9, 8), 8~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.<= 10, 9, 8), 8 -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_gt args, assert~ +** Processing line: ~ # Removes walls that are under the cursor~ - Inside source: true *** True Line Result - def test_gt args, assert -** Processing line: ~ assert.equal! (args.fn.gt 1), 1~ + # Removes walls that are under the cursor +** Processing line: ~ def input_remove_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt 1), 1 -** Processing line: ~ assert.equal! (args.fn.gt), nil~ + def input_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt), nil -** Processing line: ~ assert.equal! (args.fn.gt infinity), nil~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt infinity), nil -** Processing line: ~ assert.equal! (args.fn.gt nan), nil~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt nan), nil -** Processing line: ~ assert.equal! (args.fn.gt 8, 9, 10), 10~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt 8, 9, 10), 10 -** Processing line: ~ assert.equal! (args.fn.gt [8, 9, [10]]), 10~ + if mouse_inside_grid? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt [8, 9, [10]]), 10 -** Processing line: ~ assert.equal! (args.fn.gt 10, 10), nil~ + if state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt 10, 10), nil -** Processing line: ~ assert.equal! (args.fn.gt 10, 10), nil~ + state.walls.delete(cell_closest_to_mouse) +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt 10, 10), nil -** Processing line: ~ assert.equal! (args.fn.gt 10, 9), nil~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gt 10, 9), nil -** Processing line: ~ assert.equal! (args.fn.> 8, 9, 10), 10~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.> 8, 9, 10), 10 -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_gte args, assert~ -- Inside source: true -*** True Line Result - def test_gte args, assert -** Processing line: ~ assert.equal! (args.fn.gte 1), 1~ -- Inside source: true -*** True Line Result - assert.equal! (args.fn.gte 1), 1 -** Processing line: ~ assert.equal! (args.fn.gte), nil~ -- Inside source: true -*** True Line Result - assert.equal! (args.fn.gte), nil -** Processing line: ~ assert.equal! (args.fn.gte infinity), nil~ +** Processing line: ~ # Adds walls at cells under the cursor~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte infinity), nil -** Processing line: ~ assert.equal! (args.fn.gte nan), nil~ + # Adds walls at cells under the cursor +** Processing line: ~ def input_add_wall~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte nan), nil -** Processing line: ~ assert.equal! (args.fn.gte 8, 9, 10), 10~ + def input_add_wall +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte 8, 9, 10), 10 -** Processing line: ~ assert.equal! (args.fn.gte 10, 10), 10~ + if mouse_inside_grid? +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte 10, 10), 10 -** Processing line: ~ assert.equal! (args.fn.gte 8, 9, [10]), 10~ + unless state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte 8, 9, [10]), 10 -** Processing line: ~ assert.equal! (args.fn.gte 10, 9), nil~ + state.walls[cell_closest_to_mouse] = true +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.gte 10, 9), nil -** Processing line: ~ assert.equal! (args.fn.>= 8, 9, 10), 10~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.>= 8, 9, 10), 10 -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_acopy args, assert~ +** Processing line: ~ # This method is called when the user is editing the slider~ - Inside source: true *** True Line Result - def test_acopy args, assert -** Processing line: ~ orig = [1, 2, 3]~ + # This method is called when the user is editing the slider +** Processing line: ~ # It pauses the animation and moves the white circle to the closest integer point~ - Inside source: true *** True Line Result - orig = [1, 2, 3] -** Processing line: ~ clone = args.fn.acopy orig~ + # It pauses the animation and moves the white circle to the closest integer point +** Processing line: ~ # on the slider~ - Inside source: true *** True Line Result - clone = args.fn.acopy orig -** Processing line: ~ assert.equal! clone, [1, 2, 3]~ + # on the slider +** Processing line: ~ # Changes the step of the search to be animated~ - Inside source: true *** True Line Result - assert.equal! clone, [1, 2, 3] -** Processing line: ~ assert.equal! clone, orig~ + # Changes the step of the search to be animated +** Processing line: ~ def input_slider~ - Inside source: true *** True Line Result - assert.equal! clone, orig -** Processing line: ~ assert.not_equal! clone.object_id, orig.object_id~ + def input_slider +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - assert.not_equal! clone.object_id, orig.object_id -** Processing line: ~ end~ + state.play = false +** Processing line: ~ mouse_x = inputs.mouse.point.x~ - Inside source: true *** True Line Result - end + mouse_x = inputs.mouse.point.x ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_aget args, assert~ +** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ - Inside source: true *** True Line Result - def test_aget args, assert -** Processing line: ~ assert.equal! (args.fn.aget [:a, :b, :c], 1), :b~ + # Bounds the mouse_x to the closest x value on the slider line +** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ - Inside source: true *** True Line Result - assert.equal! (args.fn.aget [:a, :b, :c], 1), :b -** Processing line: ~ assert.equal! (args.fn.aget [:a, :b, :c], nil), nil~ + mouse_x = slider.x if mouse_x < slider.x +** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ - Inside source: true *** True Line Result - assert.equal! (args.fn.aget [:a, :b, :c], nil), nil -** Processing line: ~ assert.equal! (args.fn.aget nil, 1), nil~ + mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.aget nil, 1), nil -** Processing line: ~ end~ + +** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Sets the current search step to the one represented by the mouse x value +** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_alength args, assert~ + # The slider's circle moves due to the render_slider method using anim_steps +** Processing line: ~ state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i~ - Inside source: true *** True Line Result - def test_alength args, assert -** Processing line: ~ assert.equal! (args.fn.alength [:a, :b, :c]), 3~ + state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.alength [:a, :b, :c]), 3 -** Processing line: ~ assert.equal! (args.fn.alength nil), nil~ + +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.alength nil), nil -** Processing line: ~ end~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_amap args, assert~ -- Inside source: true -*** True Line Result - def test_amap args, assert -** Processing line: ~ inc = lambda { |i| i + 1 }~ +** Processing line: ~ # Whenever the user edits the grid,~ - Inside source: true *** True Line Result - inc = lambda { |i| i + 1 } -** Processing line: ~ ary = [1, 2, 3]~ + # Whenever the user edits the grid, +** Processing line: ~ # The search has to be recalculated upto the current step~ - Inside source: true *** True Line Result - ary = [1, 2, 3] -** Processing line: ~ assert.equal! (args.fn.amap ary, inc), [2, 3, 4]~ + # The search has to be recalculated upto the current step +** Processing line: ~ # with the current grid as the initial state of the grid~ - Inside source: true *** True Line Result - assert.equal! (args.fn.amap ary, inc), [2, 3, 4] -** Processing line: ~ assert.equal! (args.fn.amap nil, inc), nil~ + # with the current grid as the initial state of the grid +** Processing line: ~ def recalculate~ - Inside source: true *** True Line Result - assert.equal! (args.fn.amap nil, inc), nil -** Processing line: ~ assert.equal! (args.fn.amap ary, nil), nil~ + def recalculate +** Processing line: ~ # Resets the search~ - Inside source: true *** True Line Result - assert.equal! (args.fn.amap ary, nil), nil -** Processing line: ~ assert.equal! (args.fn.amap ary, inc).class, Array~ + # Resets the search +** Processing line: ~ state.frontier = []~ - Inside source: true *** True Line Result - assert.equal! (args.fn.amap ary, inc).class, Array -** Processing line: ~ end~ + state.frontier = [] +** Processing line: ~ state.visited = {}~ - Inside source: true *** True Line Result - end + state.visited = {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_and args, assert~ -- Inside source: true -*** True Line Result - def test_and args, assert -** Processing line: ~ assert.equal! (args.fn.and 1, 2, 3, 4), 4~ +** Processing line: ~ # Moves the animation forward one step at a time~ - Inside source: true *** True Line Result - assert.equal! (args.fn.and 1, 2, 3, 4), 4 -** Processing line: ~ assert.equal! (args.fn.and 1, 2, nil, 4), nil~ + # Moves the animation forward one step at a time +** Processing line: ~ state.anim_steps.times { calc }~ - Inside source: true *** True Line Result - assert.equal! (args.fn.and 1, 2, nil, 4), nil -** Processing line: ~ assert.equal! (args.fn.and), true~ + state.anim_steps.times { calc } +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.and), true -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_or args, assert~ +** Processing line: ~ # This method moves the search forward one step~ - Inside source: true *** True Line Result - def test_or args, assert -** Processing line: ~ assert.equal! (args.fn.or 1, 2, 3, 4), 1~ + # This method moves the search forward one step +** Processing line: ~ # When the animation is playing it is called every tick~ - Inside source: true *** True Line Result - assert.equal! (args.fn.or 1, 2, 3, 4), 1 -** Processing line: ~ assert.equal! (args.fn.or 1, 2, nil, 4), 1~ + # When the animation is playing it is called every tick +** Processing line: ~ # And called whenever the current step of the animation needs to be recalculated~ - Inside source: true *** True Line Result - assert.equal! (args.fn.or 1, 2, nil, 4), 1 -** Processing line: ~ assert.equal! (args.fn.or), nil~ + # And called whenever the current step of the animation needs to be recalculated +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.or), nil -** Processing line: ~ assert.equal! (args.fn.or nil, nil, false, 5, 10), 5~ + +** Processing line: ~ # Moves the search forward one step~ - Inside source: true *** True Line Result - assert.equal! (args.fn.or nil, nil, false, 5, 10), 5 -** Processing line: ~ end~ + # Moves the search forward one step +** Processing line: ~ # Parameter called_from_tick is true if it is called from the tick method~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Parameter called_from_tick is true if it is called from the tick method +** Processing line: ~ # It is false when the search is being recalculated after user editing the grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_eq_eq args, assert~ + # It is false when the search is being recalculated after user editing the grid +** Processing line: ~ def calc~ - Inside source: true *** True Line Result - def test_eq_eq args, assert -** Processing line: ~ assert.equal! (args.fn.eq?), true~ + def calc +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! (args.fn.eq?), true -** Processing line: ~ assert.equal! (args.fn.eq? 1, 0), false~ + +** Processing line: ~ # The setup to the search~ - Inside source: true *** True Line Result - assert.equal! (args.fn.eq? 1, 0), false -** Processing line: ~ assert.equal! (args.fn.eq? 1, 1, 1), true~ + # The setup to the search +** Processing line: ~ # Runs once when the there is no frontier or visited cells~ - Inside source: true *** True Line Result - assert.equal! (args.fn.eq? 1, 1, 1), true -** Processing line: ~ assert.equal! (args.fn.== 1, 1, 1), true~ + # Runs once when the there is no frontier or visited cells +** Processing line: ~ if state.frontier.empty? && state.visited.empty?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.== 1, 1, 1), true -** Processing line: ~ assert.equal! (args.fn.== nil, nil), true~ + if state.frontier.empty? && state.visited.empty? +** Processing line: ~ state.frontier << state.star~ - Inside source: true *** True Line Result - assert.equal! (args.fn.== nil, nil), true -** Processing line: ~ end~ + state.frontier << state.star +** Processing line: ~ state.visited[state.star] = true~ - Inside source: true *** True Line Result - end + state.visited[state.star] = true +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_apply args, assert~ +** Processing line: ~ # A step in the search~ - Inside source: true *** True Line Result - def test_apply args, assert -** Processing line: ~ assert.equal! (args.fn.and [nil, nil, nil]), [nil, nil, nil]~ + # A step in the search +** Processing line: ~ unless state.frontier.empty?~ - Inside source: true *** True Line Result - assert.equal! (args.fn.and [nil, nil, nil]), [nil, nil, nil] -** Processing line: ~ assert.equal! (args.fn.apply [nil, nil, nil], args.fn.method(:and)), nil~ + unless state.frontier.empty? +** Processing line: ~ # Takes the next frontier cell~ - Inside source: true *** True Line Result - assert.equal! (args.fn.apply [nil, nil, nil], args.fn.method(:and)), nil -** Processing line: ~ and_lambda = lambda {|*xs| args.fn.and(*xs)}~ + # Takes the next frontier cell +** Processing line: ~ new_frontier = state.frontier.shift~ - Inside source: true *** True Line Result - and_lambda = lambda {|*xs| args.fn.and(*xs)} -** Processing line: ~ assert.equal! (args.fn.apply [nil, nil, nil], and_lambda), nil~ + new_frontier = state.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - assert.equal! (args.fn.apply [nil, nil, nil], and_lambda), nil -** Processing line: ~ end~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + adjacent_neighbors(new_frontier).each do |neighbor| +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_areduce args, assert~ + # That have not been visited and are not walls +** Processing line: ~ unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - def test_areduce args, assert -** Processing line: ~ assert.equal! (args.fn.areduce [1, 2, 3], 0, lambda { |i, a| i + a }), 6~ + unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result - assert.equal! (args.fn.areduce [1, 2, 3], 0, lambda { |i, a| i + a }), 6 -** Processing line: ~ end~ + # Add them to the frontier and mark them as visited +** Processing line: ~ state.frontier << neighbor~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.frontier << neighbor +** Processing line: ~ state.visited[neighbor] = true~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_array_hash args, assert~ + state.visited[neighbor] = true +** Processing line: ~ end~ - Inside source: true *** True Line Result - def test_array_hash args, assert -** Processing line: ~ assert.equal! (args.fn.array_hash :a, 1, :b, 2), { a: 1, b: 2 }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.array_hash :a, 1, :b, 2), { a: 1, b: 2 } -** Processing line: ~ assert.equal! (args.fn.array_hash), { }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! (args.fn.array_hash), { } -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src ** Processing line: ~~ -- End of paragraph detected. +- Inside source: true *** True Line Result -** Processing line: ~*** Advanced Debugging - Unit Tests - gen_docs.rb~ -- Header detected. +** Processing line: ~ # Returns a list of adjacent cells~ +- Inside source: true *** True Line Result - + # Returns a list of adjacent cells +** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - gen_docs.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Used to determine what the next cells to be added to the frontier are +** Processing line: ~ def adjacent_neighbors(cell)~ +- Inside source: true +*** True Line Result + def adjacent_neighbors(cell) +** Processing line: ~ neighbors = []~ +- Inside source: true +*** True Line Result + neighbors = [] +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/gen_docs.rb~ + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 +** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/gen_docs.rb -** Processing line: ~ # ./dragonruby mygame --eval samples/99_zz_gtk_unit_tests/gen_docs.rb --no-tick~ + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 +** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ - Inside source: true *** True Line Result - # ./dragonruby mygame --eval samples/99_zz_gtk_unit_tests/gen_docs.rb --no-tick -** Processing line: ~ Kernel.export_docs!~ + neighbors << [cell.x, cell.y - 1] unless cell.y == 0 +** Processing line: ~ neighbors << [cell.x - 1, cell.y] unless cell.x == 0~ - Inside source: true *** True Line Result - Kernel.export_docs! + neighbors << [cell.x - 1, cell.y] unless cell.x == 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ neighbors~ +- Inside source: true *** True Line Result -#+end_src + neighbors +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ -- End of paragraph detected. +- Inside source: true *** True Line Result -** Processing line: ~*** Advanced Debugging - Unit Tests - geometry_tests.rb~ -- Header detected. +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ +- Inside source: true *** True Line Result - + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - geometry_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse helps with this~ +- Inside source: true *** True Line Result - + # Finding the cell closest to the mouse helps with this +** Processing line: ~ def cell_closest_to_mouse~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/geometry_tests.rb~ + def cell_closest_to_mouse +** Processing line: ~ # Closest cell to the mouse~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/geometry_tests.rb -** Processing line: ~ begin :shared~ + # Closest cell to the mouse +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - begin :shared -** Processing line: ~ def primitive_representations x, y, w, h~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - def primitive_representations x, y, w, h -** Processing line: ~ [~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Bound x and y to the grid~ - Inside source: true *** True Line Result - [ -** Processing line: ~ [x, y, w, h],~ + # Bound x and y to the grid +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - [x, y, w, h], -** Processing line: ~ { x: x, y: y, w: w, h: h },~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - { x: x, y: y, w: w, h: h }, -** Processing line: ~ RectForTest.new(x, y, w, h)~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - RectForTest.new(x, y, w, h) -** Processing line: ~ ]~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - ] + [x, y] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -56696,82 +65191,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ class RectForTest~ -- Inside source: true -*** True Line Result - class RectForTest -** Processing line: ~ attr_sprite~ +** Processing line: ~ # These methods detect when the buttons are clicked~ - Inside source: true *** True Line Result - attr_sprite -** Processing line: ~~ + # These methods detect when the buttons are clicked +** Processing line: ~ def left_button_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize x, y, w, h~ + def left_button_clicked? +** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)~ - Inside source: true *** True Line Result - def initialize x, y, w, h -** Processing line: ~ @x = x~ + inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left) +** Processing line: ~ end~ - Inside source: true *** True Line Result - @x = x -** Processing line: ~ @y = y~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - @y = y -** Processing line: ~ @w = w~ + +** Processing line: ~ def center_button_clicked?~ - Inside source: true *** True Line Result - @w = w -** Processing line: ~ @h = h~ + def center_button_clicked? +** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.center)~ - Inside source: true *** True Line Result - @h = h -** Processing line: ~ end~ + inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.center) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def to_s~ -- Inside source: true -*** True Line Result - def to_s -** Processing line: ~ "RectForTest: #{[x, y, w, h]}"~ +** Processing line: ~ def right_button_clicked?~ - Inside source: true *** True Line Result - "RectForTest: #{[x, y, w, h]}" -** Processing line: ~ end~ + def right_button_clicked? +** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)~ - Inside source: true *** True Line Result - end + inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right) ** 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: ~ begin :intersect_rect?~ +** Processing line: ~ # Signal that the user is going to be moving the slider~ - Inside source: true *** True Line Result - begin :intersect_rect? -** Processing line: ~ def test_intersect_rect_point args, assert~ + # Signal that the user is going to be moving the slider +** Processing line: ~ # Is the mouse down on the circle of the slider?~ - Inside source: true *** True Line Result - def test_intersect_rect_point args, assert -** Processing line: ~ assert.true! [16, 13].intersect_rect?([13, 12, 4, 4]), "point intersects with rect."~ + # Is the mouse down on the circle of the slider? +** Processing line: ~ def slider_clicked?~ - Inside source: true *** True Line Result - assert.true! [16, 13].intersect_rect?([13, 12, 4, 4]), "point intersects with rect." + def slider_clicked? +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ +- Inside source: true +*** True Line Result + circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ +- Inside source: true +*** True Line Result + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ +- Inside source: true +*** True Line Result + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect)~ +- Inside source: true +*** True Line Result + inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -56780,118 +65279,122 @@ 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_intersect_rect args, assert~ +** Processing line: ~ # Signal that the user is going to be moving the star~ - Inside source: true *** True Line Result - def test_intersect_rect args, assert -** Processing line: ~ intersecting = primitive_representations(0, 0, 100, 100) +~ + # Signal that the user is going to be moving the star +** Processing line: ~ def star_clicked?~ - Inside source: true *** True Line Result - intersecting = primitive_representations(0, 0, 100, 100) + -** Processing line: ~ primitive_representations(20, 20, 20, 20)~ + def star_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star))~ - Inside source: true *** True Line Result - primitive_representations(20, 20, 20, 20) + inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star)) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ intersecting.product(intersecting).each do |rect_one, rect_two|~ +** Processing line: ~ # Signal that the user is going to be removing walls~ - Inside source: true *** True Line Result - intersecting.product(intersecting).each do |rect_one, rect_two| -** Processing line: ~ assert.true! rect_one.intersect_rect?(rect_two),~ + # Signal that the user is going to be removing walls +** Processing line: ~ def wall_clicked?~ - Inside source: true *** True Line Result - assert.true! rect_one.intersect_rect?(rect_two), -** Processing line: ~ "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected true)."~ + def wall_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_a_wall?~ - Inside source: true *** True Line Result - "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected true)." -** Processing line: ~ end~ + inputs.mouse.down && mouse_inside_a_wall? +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ not_intersecting = [~ -- Inside source: true -*** True Line Result - not_intersecting = [ -** Processing line: ~ [ 0, 0, 5, 5],~ +** Processing line: ~ # Signal that the user is going to be adding walls~ - Inside source: true *** True Line Result - [ 0, 0, 5, 5], -** Processing line: ~ { x: 10, y: 10, w: 5, h: 5 },~ + # Signal that the user is going to be adding walls +** Processing line: ~ def grid_clicked?~ - Inside source: true *** True Line Result - { x: 10, y: 10, w: 5, h: 5 }, -** Processing line: ~ RectForTest.new(20, 20, 5, 5)~ + def grid_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ - Inside source: true *** True Line Result - RectForTest.new(20, 20, 5, 5) -** Processing line: ~ ]~ + inputs.mouse.down && mouse_inside_grid? +** Processing line: ~ end~ - Inside source: true *** True Line Result - ] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ not_intersecting.product(not_intersecting)~ +** Processing line: ~ # Returns whether the mouse is inside of a wall~ - Inside source: true *** True Line Result - not_intersecting.product(not_intersecting) -** Processing line: ~ .reject { |rect_one, rect_two| rect_one == rect_two }~ + # Returns whether the mouse is inside of a wall +** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ - Inside source: true *** True Line Result - .reject { |rect_one, rect_two| rect_one == rect_two } -** Processing line: ~ .each do |rect_one, rect_two|~ + # Part of the condition that checks whether the user is removing a wall +** Processing line: ~ def mouse_inside_a_wall?~ - Inside source: true *** True Line Result - .each do |rect_one, rect_two| -** Processing line: ~ assert.false! rect_one.intersect_rect?(rect_two),~ + def mouse_inside_a_wall? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - assert.false! rect_one.intersect_rect?(rect_two), -** Processing line: ~ "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected false)."~ + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up([wall.x, wall.y]))~ - Inside source: true *** True Line Result - "intersect_rect? assertion failed for #{rect_one}, #{rect_two} (expected false)." + return true if inputs.mouse.point.inside_rect?(scale_up([wall.x, wall.y])) ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - end + false +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ begin :inside_rect?~ +** Processing line: ~ # Returns whether the mouse is inside of a grid~ - Inside source: true *** True Line Result - begin :inside_rect? -** Processing line: ~ def assert_inside_rect outer: nil, inner: nil, expected: nil, assert: nil~ + # Returns whether the mouse is inside of a grid +** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ - Inside source: true *** True Line Result - def assert_inside_rect outer: nil, inner: nil, expected: nil, assert: nil -** Processing line: ~ assert.true! inner.inside_rect?(outer) == expected,~ + # Part of the condition that checks whether the user is adding a wall +** Processing line: ~ def mouse_inside_grid?~ - Inside source: true *** True Line Result - assert.true! inner.inside_rect?(outer) == expected, -** Processing line: ~ "inside_rect? assertion failed for outer: #{outer} inner: #{inner} (expected #{expected})."~ + def mouse_inside_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height]))~ - Inside source: true *** True Line Result - "inside_rect? assertion failed for outer: #{outer} inner: #{inner} (expected #{expected})." + inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height])) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -56900,302 +65403,274 @@ 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_inside_rect args, assert~ -- Inside source: true -*** True Line Result - def test_inside_rect args, assert -** Processing line: ~ outer_rects = primitive_representations(0, 0, 10, 10)~ -- Inside source: true -*** True Line Result - outer_rects = primitive_representations(0, 0, 10, 10) -** Processing line: ~ inner_rects = primitive_representations(1, 1, 5, 5)~ +** Processing line: ~~ - Inside source: true *** True Line Result - inner_rects = primitive_representations(1, 1, 5, 5) -** Processing line: ~ primitive_representations(0, 0, 10, 10).product(primitive_representations(1, 1, 5, 5))~ + +** Processing line: ~ # These methods provide handy aliases to colors~ - Inside source: true *** True Line Result - primitive_representations(0, 0, 10, 10).product(primitive_representations(1, 1, 5, 5)) -** Processing line: ~ .each do |outer, inner|~ + # These methods provide handy aliases to colors +** Processing line: ~~ - Inside source: true *** True Line Result - .each do |outer, inner| -** Processing line: ~ assert_inside_rect outer: outer, inner: inner,~ + +** Processing line: ~ # Light brown~ - Inside source: true *** True Line Result - assert_inside_rect outer: outer, inner: inner, -** Processing line: ~ expected: true, assert: assert~ + # Light brown +** Processing line: ~ def unvisited_color~ - Inside source: true *** True Line Result - expected: true, assert: assert -** Processing line: ~ end~ + def unvisited_color +** Processing line: ~ [221, 212, 213]~ - Inside source: true *** True Line Result - end + [221, 212, 213] ** 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: ~ begin :angle_to~ -- Inside source: true -*** True Line Result - begin :angle_to -** Processing line: ~ def test_angle_to args, assert~ +** Processing line: ~ # Black~ - Inside source: true *** True Line Result - def test_angle_to args, assert -** Processing line: ~ origins = primitive_representations(0, 0, 0, 0)~ + # Black +** Processing line: ~ def grid_line_color~ - Inside source: true *** True Line Result - origins = primitive_representations(0, 0, 0, 0) -** Processing line: ~ rights = primitive_representations(1, 0, 0, 0)~ + def grid_line_color +** Processing line: ~ [255, 255, 255]~ - Inside source: true *** True Line Result - rights = primitive_representations(1, 0, 0, 0) -** Processing line: ~ aboves = primitive_representations(0, 1, 0, 0)~ + [255, 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - aboves = primitive_representations(0, 1, 0, 0) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ origins.product(aboves).each do |origin, above|~ +** Processing line: ~ # Dark Brown~ - Inside source: true *** True Line Result - origins.product(aboves).each do |origin, above| -** Processing line: ~ assert.equal! origin.angle_to(above), 90,~ + # Dark Brown +** Processing line: ~ def visited_color~ - Inside source: true *** True Line Result - assert.equal! origin.angle_to(above), 90, -** Processing line: ~ "A point directly above should be 90 degrees."~ + def visited_color +** Processing line: ~ [204, 191, 179]~ - Inside source: true *** True Line Result - "A point directly above should be 90 degrees." + [204, 191, 179] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! above.angle_from(origin), 90,~ +** Processing line: ~ # Blue~ - Inside source: true *** True Line Result - assert.equal! above.angle_from(origin), 90, -** Processing line: ~ "A point coming from above should be 90 degrees."~ + # Blue +** Processing line: ~ def frontier_color~ - Inside source: true *** True Line Result - "A point coming from above should be 90 degrees." -** Processing line: ~ end~ + def frontier_color +** Processing line: ~ [103, 136, 204]~ - Inside source: true *** True Line Result - end + [103, 136, 204] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ origins.product(rights).each do |origin, right|~ +** Processing line: ~ # Camo Green~ - Inside source: true *** True Line Result - origins.product(rights).each do |origin, right| -** Processing line: ~ assert.equal! origin.angle_to(right) % 360, 0,~ + # Camo Green +** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result - assert.equal! origin.angle_to(right) % 360, 0, -** Processing line: ~ "A point directly to the right should be 0 degrees."~ + def wall_color +** Processing line: ~ [134, 134, 120]~ - Inside source: true *** True Line Result - "A point directly to the right should be 0 degrees." -** Processing line: ~~ + [134, 134, 120] +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ assert.equal! right.angle_from(origin) % 360, 0,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! right.angle_from(origin) % 360, 0, -** Processing line: ~ "A point coming from the right should be 0 degrees."~ + +** Processing line: ~ # Button Background~ - Inside source: true *** True Line Result - "A point coming from the right should be 0 degrees." -** Processing line: ~~ + # Button Background +** Processing line: ~ def gray~ - Inside source: true *** True Line Result - -** Processing line: ~ end~ + def gray +** Processing line: ~ [190, 190, 190]~ - Inside source: true *** True Line Result - end + [190, 190, 190] ** 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: ~ begin :scale_rect~ +** Processing line: ~ # Button Outline~ - Inside source: true *** True Line Result - begin :scale_rect -** Processing line: ~ def test_scale_rect args, assert~ + # Button Outline +** Processing line: ~ def black~ - Inside source: true *** True Line Result - def test_scale_rect args, assert -** Processing line: ~ assert.equal! [0, 0, 100, 100].scale_rect(0.5, 0.5),~ + def black +** Processing line: ~ [0, 0, 0]~ - Inside source: true *** True Line Result - assert.equal! [0, 0, 100, 100].scale_rect(0.5, 0.5), -** Processing line: ~ [25.0, 25.0, 50.0, 50.0]~ + [0, 0, 0] +** Processing line: ~ end~ - Inside source: true *** True Line Result - [25.0, 25.0, 50.0, 50.0] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! [0, 0, 100, 100].scale_rect(0.5),~ -- Inside source: true -*** True Line Result - assert.equal! [0, 0, 100, 100].scale_rect(0.5), -** Processing line: ~ [0.0, 0.0, 50.0, 50.0]~ +** Processing line: ~ # These methods make the code more concise~ - Inside source: true *** True Line Result - [0.0, 0.0, 50.0, 50.0] -** Processing line: ~~ + # These methods make the code more concise +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - -** Processing line: ~ assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0.5, anchor_y: 0.5),~ + def grid +** Processing line: ~ state.grid~ - Inside source: true *** True Line Result - assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0.5, anchor_y: 0.5), -** Processing line: ~ [25.0, 25.0, 50.0, 50.0]~ + state.grid +** Processing line: ~ end~ - Inside source: true *** True Line Result - [25.0, 25.0, 50.0, 50.0] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0, anchor_y: 0),~ +** Processing line: ~ def buttons~ - Inside source: true *** True Line Result - assert.equal! [0, 0, 100, 100].scale_rect_extended(percentage_x: 0.5, percentage_y: 0.5, anchor_x: 0, anchor_y: 0), -** Processing line: ~ [0.0, 0.0, 50.0, 50.0]~ + def buttons +** Processing line: ~ state.buttons~ - Inside source: true *** True Line Result - [0.0, 0.0, 50.0, 50.0] + state.buttons ** 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: ~ $gtk.reset 100~ +** Processing line: ~ def slider~ - Inside source: true *** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ + def slider +** Processing line: ~ state.slider~ - Inside source: true *** True Line Result - $gtk.log_level = :off -** Processing line: ~~ + state.slider +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + end +** Processing line: ~ end~ +- Inside source: true *** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - http_tests.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Advanced Debugging - Unit Tests - http_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. +- Inside source: true *** True Line Result +** Processing line: ~ # Method that is called by DragonRuby periodically~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/http_tests.rb~ + # Method that is called by DragonRuby periodically +** Processing line: ~ # Used for updating animations and calculations~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/http_tests.rb -** Processing line: ~ def try_assert_or_schedule args, assert~ + # Used for updating animations and calculations +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def try_assert_or_schedule args, assert -** Processing line: ~ if $result[:complete]~ + def tick args +** Processing line: ~~ - Inside source: true *** True Line Result - if $result[:complete] -** Processing line: ~ log_info "Request completed! Verifying."~ + +** Processing line: ~ # Pressing r will reset the application~ - Inside source: true *** True Line Result - log_info "Request completed! Verifying." -** Processing line: ~ if $result[:http_response_code] != 200~ + # Pressing r will reset the application +** Processing line: ~ if args.inputs.keyboard.key_down.r~ - Inside source: true *** True Line Result - if $result[:http_response_code] != 200 -** Processing line: ~ log_info "The request yielded a result of #{$result[:http_response_code]} instead of 200."~ + if args.inputs.keyboard.key_down.r +** Processing line: ~ args.gtk.reset~ - Inside source: true *** True Line Result - log_info "The request yielded a result of #{$result[:http_response_code]} instead of 200." -** Processing line: ~ exit~ + args.gtk.reset +** Processing line: ~ reset~ - Inside source: true *** True Line Result - exit -** Processing line: ~ end~ + reset +** Processing line: ~ return~ - Inside source: true *** True Line Result - end -** Processing line: ~ log_info ":try_assert_or_schedule succeeded!"~ + return +** Processing line: ~ end~ - Inside source: true *** True Line Result - log_info ":try_assert_or_schedule succeeded!" -** Processing line: ~ else~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - else -** Processing line: ~ args.gtk.schedule_callback Kernel.tick_count + 10 do~ + +** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ - Inside source: true *** True Line Result - args.gtk.schedule_callback Kernel.tick_count + 10 do -** Processing line: ~ try_assert_or_schedule args, assert~ + # Every tick, new args are passed, and the Breadth First Search tick is called +** Processing line: ~ $breadth_first_search ||= BreadthFirstSearch.new(args)~ - Inside source: true *** True Line Result - try_assert_or_schedule args, assert -** Processing line: ~ end~ + $breadth_first_search ||= BreadthFirstSearch.new(args) +** Processing line: ~ $breadth_first_search.args = args~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + $breadth_first_search.args = args +** Processing line: ~ $breadth_first_search.tick~ - Inside source: true *** True Line Result - end + $breadth_first_search.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -57204,18 +65679,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def test_http args, assert~ +** Processing line: ~~ - Inside source: true *** True Line Result - def test_http args, assert -** Processing line: ~ $result = $gtk.http_get 'http://dragonruby.org'~ + +** Processing line: ~ def reset~ - Inside source: true *** True Line Result - $result = $gtk.http_get 'http://dragonruby.org' -** Processing line: ~ try_assert_or_schedule args, assert~ + def reset +** Processing line: ~ $breadth_first_search = nil~ - Inside source: true *** True Line Result - try_assert_or_schedule args, assert + $breadth_first_search = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -57224,18 +65699,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ $gtk.reset 100~ -- Inside source: true -*** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ -- Inside source: true -*** True Line Result - $gtk.log_level = :off -** 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 @@ -57244,938 +65707,962 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Advanced Debugging - Unit Tests - nil_coercion_tests.rb~ +** Processing line: ~*** Path Finding Algorithms - Detailed Breadth First Search - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Advanced Debugging - Unit Tests - nil_coercion_tests.rb +*** Path Finding Algorithms - Detailed Breadth First Search - main.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/nil_coercion_tests.rb~ -- Inside source: true -*** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/nil_coercion_tests.rb -** Processing line: ~ # numbers~ +** Processing line: ~ # ./samples/13_path_finding_algorithms/02_detailed_breadth_first_search/app/main.rb~ - Inside source: true *** True Line Result - # numbers -** Processing line: ~ def test_open_entity_add_number args, assert~ + # ./samples/13_path_finding_algorithms/02_detailed_breadth_first_search/app/main.rb +** Processing line: ~ # A visual demonstration of a breadth first search~ - Inside source: true *** True Line Result - def test_open_entity_add_number args, assert -** Processing line: ~ assert.nil! args.state.i_value~ + # A visual demonstration of a breadth first search +** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result - assert.nil! args.state.i_value -** Processing line: ~ args.state.i_value += 5~ + # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.i_value += 5 -** Processing line: ~ assert.equal! args.state.i_value, 5~ + +** Processing line: ~ # An animation that can respond to user input in real time~ - Inside source: true *** True Line Result - assert.equal! args.state.i_value, 5 + # An animation that can respond to user input in real time ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.f_value~ +** Processing line: ~ # A breadth first search expands in all directions one step at a time~ - Inside source: true *** True Line Result - assert.nil! args.state.f_value -** Processing line: ~ args.state.f_value += 5.5~ + # A breadth first search expands in all directions one step at a time +** Processing line: ~ # The frontier is a queue of cells to be expanded from~ - Inside source: true *** True Line Result - args.state.f_value += 5.5 -** Processing line: ~ assert.equal! args.state.f_value, 5.5~ + # The frontier is a queue of cells to be expanded from +** Processing line: ~ # The visited hash allows quick lookups of cells that have been expanded from~ - Inside source: true *** True Line Result - assert.equal! args.state.f_value, 5.5 -** Processing line: ~ end~ + # The visited hash allows quick lookups of cells that have been expanded from +** Processing line: ~ # The walls hash allows quick lookup of whether a cell is a wall~ - Inside source: true *** True Line Result - end + # The walls hash allows quick lookup of whether a cell is a wall ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_subtract_number args, assert~ +** Processing line: ~ # The breadth first search starts by adding the red star to the frontier array~ - Inside source: true *** True Line Result - def test_open_entity_subtract_number args, assert -** Processing line: ~ assert.nil! args.state.i_value~ + # The breadth first search starts by adding the red star to the frontier array +** Processing line: ~ # and marking it as visited~ - Inside source: true *** True Line Result - assert.nil! args.state.i_value -** Processing line: ~ args.state.i_value -= 5~ + # and marking it as visited +** Processing line: ~ # Each step a cell is removed from the front of the frontier array (queue)~ - Inside source: true *** True Line Result - args.state.i_value -= 5 -** Processing line: ~ assert.equal! args.state.i_value, -5~ + # Each step a cell is removed from the front of the frontier array (queue) +** Processing line: ~ # Unless the neighbor is a wall or visited, it is added to the frontier array~ - Inside source: true *** True Line Result - assert.equal! args.state.i_value, -5 + # Unless the neighbor is a wall or visited, it is added to the frontier array +** Processing line: ~ # The neighbor is then marked as visited~ +- Inside source: true +*** True Line Result + # The neighbor is then marked as visited ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.f_value~ +** Processing line: ~ # The frontier is blue~ - Inside source: true *** True Line Result - assert.nil! args.state.f_value -** Processing line: ~ args.state.f_value -= 5.5~ + # The frontier is blue +** Processing line: ~ # Visited cells are light brown~ - Inside source: true *** True Line Result - args.state.f_value -= 5.5 -** Processing line: ~ assert.equal! args.state.f_value, -5.5~ + # Visited cells are light brown +** Processing line: ~ # Walls are camo green~ - Inside source: true *** True Line Result - assert.equal! args.state.f_value, -5.5 -** Processing line: ~ end~ + # Walls are camo green +** Processing line: ~ # Even when walls are visited, they will maintain their wall color~ - Inside source: true *** True Line Result - end + # Even when walls are visited, they will maintain their wall color ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_multiply_number args, assert~ -- Inside source: true -*** True Line Result - def test_open_entity_multiply_number args, assert -** Processing line: ~ assert.nil! args.state.i_value~ +** Processing line: ~ # This search numbers the order in which new cells are explored~ - Inside source: true *** True Line Result - assert.nil! args.state.i_value -** Processing line: ~ args.state.i_value *= 5~ + # This search numbers the order in which new cells are explored +** Processing line: ~ # The next cell from where the search will continue is highlighted yellow~ - Inside source: true *** True Line Result - args.state.i_value *= 5 -** Processing line: ~ assert.equal! args.state.i_value, 0~ + # The next cell from where the search will continue is highlighted yellow +** Processing line: ~ # And the cells that will be considered for expansion are in semi-transparent green~ - Inside source: true *** True Line Result - assert.equal! args.state.i_value, 0 + # And the cells that will be considered for expansion are in semi-transparent green ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.f_value~ +** Processing line: ~ # The star can be moved by clicking and dragging~ - Inside source: true *** True Line Result - assert.nil! args.state.f_value -** Processing line: ~ args.state.f_value *= 5.5~ + # The star can be moved by clicking and dragging +** Processing line: ~ # Walls can be added and removed by clicking and dragging~ - Inside source: true *** True Line Result - args.state.f_value *= 5.5 -** Processing line: ~ assert.equal! args.state.f_value, 0~ + # Walls can be added and removed by clicking and dragging +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! args.state.f_value, 0 -** Processing line: ~ end~ + +** Processing line: ~ class DetailedBreadthFirstSearch~ - Inside source: true *** True Line Result - end + class DetailedBreadthFirstSearch +** Processing line: ~ attr_gtk~ +- Inside source: true +*** True Line Result + attr_gtk ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_divide_number args, assert~ +** Processing line: ~ def initialize(args)~ - Inside source: true *** True Line Result - def test_open_entity_divide_number args, assert -** Processing line: ~ assert.nil! args.state.i_value~ + def initialize(args) +** Processing line: ~ # Variables to edit the size and appearance of the grid~ - Inside source: true *** True Line Result - assert.nil! args.state.i_value -** Processing line: ~ args.state.i_value /= 5~ + # Variables to edit the size and appearance of the grid +** Processing line: ~ # Freely customizable to user's liking~ - Inside source: true *** True Line Result - args.state.i_value /= 5 -** Processing line: ~ assert.equal! args.state.i_value, 0~ + # Freely customizable to user's liking +** Processing line: ~ args.state.grid.width = 9~ - Inside source: true *** True Line Result - assert.equal! args.state.i_value, 0 + args.state.grid.width = 9 +** Processing line: ~ args.state.grid.height = 4~ +- Inside source: true +*** True Line Result + args.state.grid.height = 4 +** Processing line: ~ args.state.grid.cell_size = 90~ +- Inside source: true +*** True Line Result + args.state.grid.cell_size = 90 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.f_value~ +** Processing line: ~ # Stores which step of the animation is being rendered~ - Inside source: true *** True Line Result - assert.nil! args.state.f_value -** Processing line: ~ args.state.f_value /= 5.5~ + # Stores which step of the animation is being rendered +** Processing line: ~ # When the user moves the star or messes with the walls,~ - Inside source: true *** True Line Result - args.state.f_value /= 5.5 -** Processing line: ~ assert.equal! args.state.f_value, 0~ + # When the user moves the star or messes with the walls, +** Processing line: ~ # the breadth first search is recalculated up to this step~ - Inside source: true *** True Line Result - assert.equal! args.state.f_value, 0 -** Processing line: ~ end~ + # the breadth first search is recalculated up to this step +** Processing line: ~ args.state.anim_steps = 0~ - Inside source: true *** True Line Result - end + args.state.anim_steps = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # array~ +** Processing line: ~ # At some step the animation will end,~ - Inside source: true *** True Line Result - # array -** Processing line: ~ def test_open_entity_add_array args, assert~ + # At some step the animation will end, +** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ - Inside source: true *** True Line Result - def test_open_entity_add_array args, assert -** Processing line: ~ assert.nil! args.state.values~ + # and further steps won't change anything (the whole grid will be explored) +** Processing line: ~ # This step is roughly the grid's width * height~ - Inside source: true *** True Line Result - assert.nil! args.state.values -** Processing line: ~ args.state.values += [:a, :b, :c]~ + # This step is roughly the grid's width * height +** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ - Inside source: true *** True Line Result - args.state.values += [:a, :b, :c] -** Processing line: ~ assert.equal! args.state.values, [:a, :b, :c]~ + # When anim_steps equals max_steps no more calculations will occur +** Processing line: ~ # and the slider will be at the end~ - Inside source: true *** True Line Result - assert.equal! args.state.values, [:a, :b, :c] -** Processing line: ~ end~ + # and the slider will be at the end +** Processing line: ~ args.state.max_steps = args.state.grid.width * args.state.grid.height~ - Inside source: true *** True Line Result - end + args.state.max_steps = args.state.grid.width * args.state.grid.height ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_subtract_array args, assert~ +** Processing line: ~ # The location of the star and walls of the grid~ - Inside source: true *** True Line Result - def test_open_entity_subtract_array args, assert -** Processing line: ~ assert.nil! args.state.values~ + # The location of the star and walls of the grid +** Processing line: ~ # They can be modified to have a different initial grid~ - Inside source: true *** True Line Result - assert.nil! args.state.values -** Processing line: ~ args.state.values -= [:a, :b, :c]~ + # They can be modified to have a different initial grid +** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ - Inside source: true *** True Line Result - args.state.values -= [:a, :b, :c] -** Processing line: ~ assert.equal! args.state.values, []~ + # Walls are stored in a hash for quick look up when doing the search +** Processing line: ~ args.state.star = [3, 2]~ - Inside source: true *** True Line Result - assert.equal! args.state.values, [] -** Processing line: ~ end~ + args.state.star = [3, 2] +** Processing line: ~ args.state.walls = {}~ - Inside source: true *** True Line Result - end + args.state.walls = {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_shovel_array args, assert~ +** Processing line: ~ # Variables that are used by the breadth first search~ - Inside source: true *** True Line Result - def test_open_entity_shovel_array args, assert -** Processing line: ~ assert.nil! args.state.values~ + # Variables that are used by the breadth first search +** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ - Inside source: true *** True Line Result - assert.nil! args.state.values -** Processing line: ~ args.state.values << :a~ + # Storing cells that the search has visited, prevents unnecessary steps +** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ - Inside source: true *** True Line Result - args.state.values << :a -** Processing line: ~ assert.equal! args.state.values, [:a]~ + # Expanding the frontier of the search in order makes the search expand +** Processing line: ~ # from the center outward~ - Inside source: true *** True Line Result - assert.equal! args.state.values, [:a] -** Processing line: ~ end~ + # from the center outward +** Processing line: ~ args.state.visited = {}~ - Inside source: true *** True Line Result - end + args.state.visited = {} +** Processing line: ~ args.state.frontier = []~ +- Inside source: true +*** True Line Result + args.state.frontier = [] +** Processing line: ~ args.state.cell_numbers = []~ +- Inside source: true +*** True Line Result + args.state.cell_numbers = [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_open_entity_enumerate args, assert~ +** Processing line: ~~ - Inside source: true *** True Line Result - def test_open_entity_enumerate args, assert -** Processing line: ~ assert.nil! args.state.values~ + +** Processing line: ~~ - Inside source: true *** True Line Result - assert.nil! args.state.values -** Processing line: ~ args.state.values = args.state.values.map_with_index { |i| i }~ + +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - args.state.values = args.state.values.map_with_index { |i| i } -** Processing line: ~ assert.equal! args.state.values, []~ + # What the user is currently editing on the grid +** Processing line: ~ # Possible values are: :none, :slider, :star, :remove_wall, :add_wall~ - Inside source: true *** True Line Result - assert.equal! args.state.values, [] + # Possible values are: :none, :slider, :star, :remove_wall, :add_wall ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.values_2~ +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - assert.nil! args.state.values_2 -** Processing line: ~ args.state.values_2 = args.state.values_2.map { |i| i }~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - args.state.values_2 = args.state.values_2.map { |i| i } -** Processing line: ~ assert.equal! args.state.values_2, []~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - assert.equal! args.state.values_2, [] + # they are still clicking down on the mouse. +** Processing line: ~ args.state.click_and_drag = :none~ +- Inside source: true +*** True Line Result + args.state.click_and_drag = :none ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.nil! args.state.values_3~ +** Processing line: ~ # The x, y, w, h values for the buttons~ - Inside source: true *** True Line Result - assert.nil! args.state.values_3 -** Processing line: ~ args.state.values_3 = args.state.values_3.flat_map { |i| i }~ + # The x, y, w, h values for the buttons +** Processing line: ~ # Allow easy movement of the buttons location~ - Inside source: true *** True Line Result - args.state.values_3 = args.state.values_3.flat_map { |i| i } -** Processing line: ~ assert.equal! args.state.values_3, []~ + # Allow easy movement of the buttons location +** Processing line: ~ # A centralized location to get values to detect input and draw the buttons~ - Inside source: true *** True Line Result - assert.equal! args.state.values_3, [] -** Processing line: ~ end~ + # A centralized location to get values to detect input and draw the buttons +** Processing line: ~ # Editing these values might mean needing to edit the label offsets~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Editing these values might mean needing to edit the label offsets +** Processing line: ~ # which can be found in the appropriate render button methods~ - Inside source: true *** True Line Result - -** Processing line: ~ # hashes~ + # which can be found in the appropriate render button methods +** Processing line: ~ args.state.buttons.left = [450, 600, 160, 50]~ - Inside source: true *** True Line Result - # hashes -** Processing line: ~ def test_open_entity_indexer args, assert~ + args.state.buttons.left = [450, 600, 160, 50] +** Processing line: ~ args.state.buttons.right = [610, 600, 160, 50]~ - Inside source: true *** True Line Result - def test_open_entity_indexer args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + args.state.buttons.right = [610, 600, 160, 50] +** Processing line: ~~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ assert.nil! args.state.values~ + +** Processing line: ~ # The variables below are related to the slider~ - Inside source: true *** True Line Result - assert.nil! args.state.values -** Processing line: ~ args.state.values[:test] = :value~ + # The variables below are related to the slider +** Processing line: ~ # They allow the user to customize them~ - Inside source: true *** True Line Result - args.state.values[:test] = :value -** Processing line: ~ assert.equal! args.state.values.to_s, { entity_id: 1, entity_name: :values, entity_keys_by_ref: {}, test: :value }.to_s~ + # They allow the user to customize them +** Processing line: ~ # They also give a central location for the render and input methods to get~ - Inside source: true *** True Line Result - assert.equal! args.state.values.to_s, { entity_id: 1, entity_name: :values, entity_keys_by_ref: {}, test: :value }.to_s -** Processing line: ~ end~ + # They also give a central location for the render and input methods to get +** Processing line: ~ # information from~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # information from +** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ - Inside source: true *** True Line Result - -** Processing line: ~ # bug~ + # x & y are the coordinates of the leftmost part of the slider line +** Processing line: ~ args.state.slider.x = 400~ - Inside source: true *** True Line Result - # bug -** Processing line: ~ def test_open_entity_nil_bug args, assert~ + args.state.slider.x = 400 +** Processing line: ~ args.state.slider.y = 675~ - Inside source: true *** True Line Result - def test_open_entity_nil_bug args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + args.state.slider.y = 675 +** Processing line: ~ # This is the width of the line~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.foo.a~ + # This is the width of the line +** Processing line: ~ args.state.slider.w = 360~ - Inside source: true *** True Line Result - args.state.foo.a -** Processing line: ~ args.state.foo.b~ + args.state.slider.w = 360 +** Processing line: ~ # This is the offset for the circle~ - Inside source: true *** True Line Result - args.state.foo.b -** Processing line: ~ @hello[:foobar]~ + # This is the offset for the circle +** Processing line: ~ # Allows the center of the circle to be on the line,~ - Inside source: true *** True Line Result - @hello[:foobar] -** Processing line: ~ assert.nil! args.state.foo.a, "a was not nil."~ + # Allows the center of the circle to be on the line, +** Processing line: ~ # as opposed to the upper right corner~ - Inside source: true *** True Line Result - assert.nil! args.state.foo.a, "a was not nil." -** Processing line: ~ # the line below fails~ + # as opposed to the upper right corner +** Processing line: ~ args.state.slider.offset = 20~ - Inside source: true *** True Line Result - # the line below fails -** Processing line: ~ # assert.nil! args.state.foo.b, "b was not nil."~ + args.state.slider.offset = 20 +** Processing line: ~ # This is the spacing between each of the notches on the slider~ - Inside source: true *** True Line Result - # assert.nil! args.state.foo.b, "b was not nil." -** Processing line: ~ end~ + # This is the spacing between each of the notches on the slider +** Processing line: ~ # Notches are places where the circle can rest on the slider line~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Notches are places where the circle can rest on the slider line +** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + # There needs to be a notch for each step before the maximum number of steps +** Processing line: ~ args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f~ +- Inside source: true *** True Line Result -#+end_src + args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ -- End of paragraph detected. +- Inside source: true *** True Line Result -** Processing line: ~*** Advanced Debugging - Unit Tests - object_to_primitive_tests.rb~ -- Header detected. +** Processing line: ~ # This method is called every frame/tick~ +- Inside source: true *** True Line Result - + # This method is called every frame/tick +** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - object_to_primitive_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Every tick, the current state of the search is rendered on the screen, +** Processing line: ~ # User input is processed, and~ +- Inside source: true *** True Line Result - + # User input is processed, and +** Processing line: ~ def tick~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/object_to_primitive_tests.rb~ + def tick +** Processing line: ~ render~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/object_to_primitive_tests.rb -** Processing line: ~ class PlayerSpriteForTest~ + render +** Processing line: ~ input~ - Inside source: true *** True Line Result - class PlayerSpriteForTest -** Processing line: ~ end~ + input +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_array_to_sprite args, assert~ +** Processing line: ~ # This method is called from tick and renders everything every tick~ - Inside source: true *** True Line Result - def test_array_to_sprite args, assert -** Processing line: ~ array = [[0, 0, 100, 100, "test.png"]].sprites~ + # This method is called from tick and renders everything every tick +** Processing line: ~ def render~ - Inside source: true *** True Line Result - array = [[0, 0, 100, 100, "test.png"]].sprites -** Processing line: ~ puts "No exception was thrown. Sweet!"~ + def render +** Processing line: ~ render_buttons~ - Inside source: true *** True Line Result - puts "No exception was thrown. Sweet!" -** Processing line: ~ end~ + render_buttons +** Processing line: ~ render_slider~ - Inside source: true *** True Line Result - end + render_slider ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_class_to_sprite args, assert~ +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - def test_class_to_sprite args, assert -** Processing line: ~ array = [PlayerSprite.new].sprites~ + render_background +** Processing line: ~ render_visited~ - Inside source: true *** True Line Result - array = [PlayerSprite.new].sprites -** Processing line: ~ assert.true! array.first.is_a?(PlayerSprite)~ + render_visited +** Processing line: ~ render_frontier~ - Inside source: true *** True Line Result - assert.true! array.first.is_a?(PlayerSprite) -** Processing line: ~ puts "No exception was thrown. Sweet!"~ + render_frontier +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - puts "No exception was thrown. Sweet!" -** Processing line: ~ end~ + render_walls +** Processing line: ~ render_star~ - Inside source: true *** True Line Result - end + render_star ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ $gtk.reset 100~ +** Processing line: ~ render_highlights~ - Inside source: true *** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ + render_highlights +** Processing line: ~ render_cell_numbers~ - Inside source: true *** True Line Result - $gtk.log_level = :off -** Processing line: ~~ + render_cell_numbers +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - parsing_tests.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - parsing_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # The methods below subdivide the task of drawing everything to the screen +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Draws the buttons that move the search backward or forward~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/parsing_tests.rb~ + # Draws the buttons that move the search backward or forward +** Processing line: ~ # These buttons are rendered so the user knows where to click to move the search~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/parsing_tests.rb -** Processing line: ~ def test_parse_json args, assert~ + # These buttons are rendered so the user knows where to click to move the search +** Processing line: ~ def render_buttons~ - Inside source: true *** True Line Result - def test_parse_json args, assert -** Processing line: ~ result = args.gtk.parse_json '{ "name": "John Doe", "aliases": ["JD"] }'~ + def render_buttons +** Processing line: ~ render_left_button~ - Inside source: true *** True Line Result - result = args.gtk.parse_json '{ "name": "John Doe", "aliases": ["JD"] }' -** Processing line: ~ assert.equal! result, { "name"=>"John Doe", "aliases"=>["JD"] }, "Parsing JSON failed."~ + render_left_button +** Processing line: ~ render_right_button~ - Inside source: true *** True Line Result - assert.equal! result, { "name"=>"John Doe", "aliases"=>["JD"] }, "Parsing JSON failed." -** Processing line: ~ end~ + render_right_button +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_parse_xml args, assert~ -- Inside source: true -*** True Line Result - def test_parse_xml args, assert -** Processing line: ~ result = args.gtk.parse_xml <<-S~ -- Inside source: true -*** True Line Result - result = args.gtk.parse_xml <<-S -** Processing line: ~ ~ +** Processing line: ~ # Renders the button which steps the search backward~ - Inside source: true *** True Line Result - -** Processing line: ~ John Doe~ + # Renders the button which steps the search backward +** Processing line: ~ # Shows the user where to click to move the search backward~ - Inside source: true *** True Line Result - John Doe -** Processing line: ~ ~ + # Shows the user where to click to move the search backward +** Processing line: ~ def render_left_button~ - Inside source: true *** True Line Result - -** Processing line: ~ S~ + def render_left_button +** Processing line: ~ # Draws the gray button, and a black border~ - Inside source: true *** True Line Result - S -** Processing line: ~~ + # Draws the gray button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - -** Processing line: ~ expected = {:type=>:element,~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.left, gray]~ - Inside source: true *** True Line Result - expected = {:type=>:element, -** Processing line: ~ :name=>nil,~ + outputs.solids << [buttons.left, gray] +** Processing line: ~ outputs.borders << [buttons.left, black]~ - Inside source: true *** True Line Result - :name=>nil, -** Processing line: ~ :children=>[{:type=>:element,~ + outputs.borders << [buttons.left, black] +** Processing line: ~~ - Inside source: true *** True Line Result - :children=>[{:type=>:element, -** Processing line: ~ :name=>"Person",~ + +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - :name=>"Person", -** Processing line: ~ :children=>[{:type=>:element,~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - :children=>[{:type=>:element, -** Processing line: ~ :name=>"Name",~ + # Explains to the user what the button does +** Processing line: ~ label_x = buttons.left.x + 05~ - Inside source: true *** True Line Result - :name=>"Name", -** Processing line: ~ :children=>[{:type=>:content,~ + label_x = buttons.left.x + 05 +** Processing line: ~ label_y = buttons.left.y + 35~ - Inside source: true *** True Line Result - :children=>[{:type=>:content, -** Processing line: ~ :data=>"John Doe"}]}],~ + label_y = buttons.left.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, "< Step backward"]~ - Inside source: true *** True Line Result - :data=>"John Doe"}]}], -** Processing line: ~ :attributes=>{"id"=>"100"}}]}~ + outputs.labels << [label_x, label_y, "< Step backward"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - :attributes=>{"id"=>"100"}}]} + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! result, expected, "Parsing xml failed."~ +** Processing line: ~ # Renders the button which steps the search forward~ - Inside source: true *** True Line Result - assert.equal! result, expected, "Parsing xml failed." -** Processing line: ~ end~ + # Renders the button which steps the search forward +** Processing line: ~ # Shows the user where to click to move the search forward~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Shows the user where to click to move the search forward +** Processing line: ~ def render_right_button~ - Inside source: true *** True Line Result - -** Processing line: ~ $gtk.reset 100~ + def render_right_button +** Processing line: ~ # Draws the gray button, and a black border~ - Inside source: true *** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ + # Draws the gray button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - $gtk.log_level = :off -** Processing line: ~~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.right, gray]~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + outputs.solids << [buttons.right, gray] +** Processing line: ~ outputs.borders << [buttons.right, black]~ +- Inside source: true *** True Line Result -#+end_src + outputs.borders << [buttons.right, black] ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - require_tests.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ # Renders an explanatory label in the center of the button~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - require_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb~ + # Explains to the user what the button does +** Processing line: ~ label_x = buttons.right.x + 10~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/require_tests.rb -** Processing line: ~ def write_src path, src~ + label_x = buttons.right.x + 10 +** Processing line: ~ label_y = buttons.right.y + 35~ - Inside source: true *** True Line Result - def write_src path, src -** Processing line: ~ $gtk.write_file path, src~ + label_y = buttons.right.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, "Step forward >"]~ - Inside source: true *** True Line Result - $gtk.write_file path, src -** Processing line: ~ end~ + outputs.labels << [label_x, label_y, "Step forward >"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ write_src 'app/unit_testing_game.rb', <<-S~ +** Processing line: ~ # Draws the slider so the user can move it and see the progress of the search~ - Inside source: true *** True Line Result - write_src 'app/unit_testing_game.rb', <<-S -** Processing line: ~ module UnitTesting~ + # Draws the slider so the user can move it and see the progress of the search +** Processing line: ~ def render_slider~ - Inside source: true *** True Line Result - module UnitTesting -** Processing line: ~ class Game~ + def render_slider +** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ - Inside source: true *** True Line Result - class Game -** Processing line: ~ end~ + # Using primitives hides the line under the white circle of the slider +** Processing line: ~ # Draws the line~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Draws the line +** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ - Inside source: true *** True Line Result - end -** Processing line: ~ S~ + outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line +** Processing line: ~ # The circle needs to be offset so that the center of the circle~ - Inside source: true *** True Line Result - S -** Processing line: ~~ + # The circle needs to be offset so that the center of the circle +** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ - Inside source: true *** True Line Result - -** Processing line: ~ write_src 'lib/unit_testing_lib.rb', <<-S~ + # overlaps the line instead of the upper right corner of the circle +** Processing line: ~ # The circle's x value is also moved based on the current seach step~ - Inside source: true *** True Line Result - write_src 'lib/unit_testing_lib.rb', <<-S -** Processing line: ~ module UnitTesting~ + # The circle's x value is also moved based on the current seach step +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ - Inside source: true *** True Line Result - module UnitTesting -** Processing line: ~ class Lib~ + circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ - Inside source: true *** True Line Result - class Lib -** Processing line: ~ end~ + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ - Inside source: true *** True Line Result - end -** Processing line: ~ S~ + outputs.primitives << [circle_rect, 'circle-white.png'].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - S + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ write_src 'app/nested/unit_testing_nested.rb', <<-S~ -- Inside source: true -*** True Line Result - write_src 'app/nested/unit_testing_nested.rb', <<-S -** Processing line: ~ module UnitTesting~ +** Processing line: ~ # Draws what the grid looks like with nothing on it~ - Inside source: true *** True Line Result - module UnitTesting -** Processing line: ~ class Nested~ + # Draws what the grid looks like with nothing on it +** Processing line: ~ # Which is a bunch of unvisited cells~ - Inside source: true *** True Line Result - class Nested -** Processing line: ~ end~ + # Which is a bunch of unvisited cells +** Processing line: ~ # Drawn first so other things can draw on top of it~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Drawn first so other things can draw on top of it +** Processing line: ~ def render_background~ - Inside source: true *** True Line Result - end -** Processing line: ~ S~ + def render_background +** Processing line: ~ render_unvisited~ - Inside source: true *** True Line Result - S + render_unvisited ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ require 'app/unit_testing_game.rb'~ +** Processing line: ~ # The grid lines make the cells appear separate~ - Inside source: true *** True Line Result - require 'app/unit_testing_game.rb' -** Processing line: ~ require 'app/nested/unit_testing_nested.rb'~ + # The grid lines make the cells appear separate +** Processing line: ~ render_grid_lines~ - Inside source: true *** True Line Result - require 'app/nested/unit_testing_nested.rb' -** Processing line: ~ require 'lib/unit_testing_lib.rb'~ + render_grid_lines +** Processing line: ~ end~ - Inside source: true *** True Line Result - require 'lib/unit_testing_lib.rb' + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_require args, assert~ +** Processing line: ~ # Draws a rectangle the size of the entire grid to represent unvisited cells~ - Inside source: true *** True Line Result - def test_require args, assert -** Processing line: ~ UnitTesting::Game.new~ + # Draws a rectangle the size of the entire grid to represent unvisited cells +** Processing line: ~ # Unvisited cells are the default cell~ - Inside source: true *** True Line Result - UnitTesting::Game.new -** Processing line: ~ UnitTesting::Lib.new~ + # Unvisited cells are the default cell +** Processing line: ~ def render_unvisited~ - Inside source: true *** True Line Result - UnitTesting::Lib.new -** Processing line: ~ UnitTesting::Nested.new~ + def render_unvisited +** Processing line: ~ background = [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result - UnitTesting::Nested.new -** Processing line: ~ $gtk.exec 'rm ./mygame/app/unit_testing_game.rb'~ + background = [0, 0, grid.width, grid.height] +** Processing line: ~ outputs.solids << [scale_up(background), unvisited_color]~ - Inside source: true *** True Line Result - $gtk.exec 'rm ./mygame/app/unit_testing_game.rb' -** Processing line: ~ $gtk.exec 'rm ./mygame/app/nested/unit_testing_nested.rb'~ + outputs.solids << [scale_up(background), unvisited_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - $gtk.exec 'rm ./mygame/app/nested/unit_testing_nested.rb' -** Processing line: ~ $gtk.exec 'rm ./mygame/lib/unit_testing_lib.rb'~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - $gtk.exec 'rm ./mygame/lib/unit_testing_lib.rb' -** Processing line: ~ assert.ok!~ + +** Processing line: ~ # Draws grid lines to show the division of the grid into cells~ - Inside source: true *** True Line Result - assert.ok! -** Processing line: ~ end~ + # Draws grid lines to show the division of the grid into cells +** Processing line: ~ def render_grid_lines~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def render_grid_lines +** Processing line: ~ for x in 0..grid.width~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + for x in 0..grid.width +** Processing line: ~ outputs.lines << [scale_up(vertical_line(x)), grid_line_color]~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + outputs.lines << [scale_up(vertical_line(x)), grid_line_color] +** Processing line: ~ end~ +- Inside source: true *** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb~ -- Header detected. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ for y in 0..grid.height~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + for y in 0..grid.height +** Processing line: ~ outputs.lines << [scale_up(horizontal_line(y)), grid_line_color]~ +- Inside source: true *** True Line Result - + outputs.lines << [scale_up(horizontal_line(y)), grid_line_color] +** Processing line: ~ end~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb -** Processing line: ~ def test_serialize args, assert~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def test_serialize args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + +** Processing line: ~ # Easy way to get a vertical line given an index~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.player_one = "test"~ + # Easy way to get a vertical line given an index +** Processing line: ~ def vertical_line column~ - Inside source: true *** True Line Result - args.state.player_one = "test" -** Processing line: ~ result = args.gtk.serialize_state args.state~ + def vertical_line column +** Processing line: ~ [column, 0, column, grid.height]~ - 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\"}"~ + [column, 0, column, grid.height] +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}" + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ GTK::Entity.__reset_id__!~ -- Inside source: true -*** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.gtk.write_file 'state.txt', ''~ +** Processing line: ~ # Easy way to get a horizontal line given an index~ - Inside source: true *** True Line Result - args.gtk.write_file 'state.txt', '' -** Processing line: ~ result = args.gtk.serialize_state 'state.txt', args.state~ + # Easy way to get a horizontal line given an index +** Processing line: ~ def horizontal_line row~ - 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\"}"~ + def horizontal_line row +** Processing line: ~ [0, row, grid.width, row]~ - Inside source: true *** True Line Result - assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}" -** Processing line: ~ end~ + [0, row, grid.width, row] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_deserialize args, assert~ +** Processing line: ~ # Draws the area that is going to be searched from~ - Inside source: true *** True Line Result - def test_deserialize args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + # Draws the area that is going to be searched from +** Processing line: ~ # The frontier is the most outward parts of the search~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ result = args.gtk.deserialize_state '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'~ + # The frontier is the most outward parts of the search +** Processing line: ~ def render_frontier~ - Inside source: true *** True Line Result - result = args.gtk.deserialize_state '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}' -** Processing line: ~ assert.equal! result.player_one, "test"~ + def render_frontier +** Processing line: ~ state.frontier.each do |cell|~ - Inside source: true *** True Line Result - assert.equal! result.player_one, "test" + state.frontier.each do |cell| +** Processing line: ~ outputs.solids << [scale_up(cell), frontier_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [scale_up(cell), frontier_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ GTK::Entity.__reset_id__!~ +** Processing line: ~ # Draws the walls~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.gtk.write_file 'state.txt', '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}'~ + # Draws the walls +** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result - args.gtk.write_file 'state.txt', '{:entity_id=>3, :tick_count=>-1, :player_one=>"test"}' -** Processing line: ~ result = args.gtk.deserialize_state 'state.txt'~ + def render_walls +** Processing line: ~ state.walls.each_key do |wall|~ - Inside source: true *** True Line Result - result = args.gtk.deserialize_state 'state.txt' -** Processing line: ~ assert.equal! result.player_one, "test"~ + state.walls.each_key do |wall| +** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - assert.equal! result.player_one, "test" -** Processing line: ~ end~ + outputs.solids << [scale_up(wall), wall_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_very_large_serialization args, assert~ +** Processing line: ~ # Renders cells that have been searched in the appropriate color~ - Inside source: true *** True Line Result - def test_very_large_serialization args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + # Renders cells that have been searched in the appropriate color +** Processing line: ~ def render_visited~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ size = 3000~ + def render_visited +** Processing line: ~ state.visited.each_key do |cell|~ - Inside source: true *** True Line Result - size = 3000 -** Processing line: ~ size.map_with_index do |i|~ + state.visited.each_key do |cell| +** Processing line: ~ outputs.solids << [scale_up(cell), visited_color]~ - Inside source: true *** True Line Result - size.map_with_index do |i| -** Processing line: ~ args.state.send("k#{i}=".to_sym, i)~ + outputs.solids << [scale_up(cell), visited_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.send("k#{i}=".to_sym, i) + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -58184,418 +66671,394 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ result = args.gtk.serialize_state args.state~ +** Processing line: ~ # Renders the star~ - Inside source: true *** True Line Result - result = args.gtk.serialize_state args.state -** Processing line: ~ assert.true! (args.gtk.console.log.join.include? "unlikely a string this large will deserialize correctly")~ + # Renders the star +** Processing line: ~ def render_star~ - Inside source: true *** True Line Result - assert.true! (args.gtk.console.log.join.include? "unlikely a string this large will deserialize correctly") -** Processing line: ~ end~ + def render_star +** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - end + outputs.sprites << [scale_up(state.star), 'star.png'] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_strict_entity_serialization args, assert~ +** Processing line: ~ # Cells have a number rendered in them based on when they were explored~ - Inside source: true *** True Line Result - def test_strict_entity_serialization args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + # Cells have a number rendered in them based on when they were explored +** Processing line: ~ # This is based off of their index in the cell_numbers array~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.player_one = args.state.new_entity(:player, name: "Ryu")~ + # This is based off of their index in the cell_numbers array +** Processing line: ~ # Cells are added to this array the same time they are added to the frontier array~ - Inside source: true *** True Line Result - args.state.player_one = args.state.new_entity(:player, name: "Ryu") -** Processing line: ~ args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken")~ + # Cells are added to this array the same time they are added to the frontier array +** Processing line: ~ def render_cell_numbers~ - Inside source: true *** True Line Result - args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken") -** Processing line: ~~ + def render_cell_numbers +** Processing line: ~ state.cell_numbers.each_with_index do |cell, index|~ - Inside source: true *** True Line Result - -** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~ + state.cell_numbers.each_with_index do |cell, index| +** Processing line: ~ # Math that approx centers the number in the cell~ - Inside source: true *** True Line Result - serialized_state = args.gtk.serialize_state args.state -** Processing line: ~ assert.equal! serialized_state, '{:entity_id=>1, :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=>3, :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"}}'~ + # Math that approx centers the number in the cell +** Processing line: ~ label_x = (cell.x * grid.cell_size) + grid.cell_size / 2 - 5~ - Inside source: true *** True Line Result - assert.equal! serialized_state, '{:entity_id=>1, :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=>3, :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"}}' + label_x = (cell.x * grid.cell_size) + grid.cell_size / 2 - 5 +** Processing line: ~ label_y = (cell.y * grid.cell_size) + (grid.cell_size / 2) + 5~ +- Inside source: true +*** True Line Result + label_y = (cell.y * grid.cell_size) + (grid.cell_size / 2) + 5 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ GTK::Entity.__reset_id__!~ +** Processing line: ~ outputs.labels << [label_x, label_y, (index + 1).to_s]~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ deserialize_state = args.gtk.deserialize_state serialized_state~ + outputs.labels << [label_x, label_y, (index + 1).to_s] +** Processing line: ~ end~ - Inside source: true *** True Line Result - deserialize_state = args.gtk.deserialize_state serialized_state -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ assert.equal! args.state.player_one.name, deserialize_state.player_one.name~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! args.state.player_one.name, deserialize_state.player_one.name -** Processing line: ~ assert.true! args.state.player_one.is_a? GTK::OpenEntity~ + +** Processing line: ~ # The next frontier to be expanded is highlighted yellow~ - Inside source: true *** True Line Result - assert.true! args.state.player_one.is_a? GTK::OpenEntity -** Processing line: ~~ + # The next frontier to be expanded is highlighted yellow +** Processing line: ~ # Its adjacent non-wall neighbors have their border highlighted green~ - Inside source: true *** True Line Result - -** Processing line: ~ assert.equal! args.state.player_two.name, deserialize_state.player_two.name~ + # Its adjacent non-wall neighbors have their border highlighted green +** Processing line: ~ # This is to show the user how the search expands~ - Inside source: true *** True Line Result - assert.equal! args.state.player_two.name, deserialize_state.player_two.name -** Processing line: ~ assert.true! args.state.player_two.is_a? GTK::StrictEntity~ + # This is to show the user how the search expands +** Processing line: ~ def render_highlights~ - Inside source: true *** True Line Result - assert.true! args.state.player_two.is_a? GTK::StrictEntity -** Processing line: ~ end~ + def render_highlights +** Processing line: ~ return if state.frontier.empty?~ - Inside source: true *** True Line Result - end + return if state.frontier.empty? ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_strict_entity_serialization_with_nil args, assert~ -- Inside source: true -*** True Line Result - def test_strict_entity_serialization_with_nil args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ +** Processing line: ~ # Highlight the next frontier to be expanded yellow~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.player_one = args.state.new_entity(:player, name: "Ryu")~ + # Highlight the next frontier to be expanded yellow +** Processing line: ~ next_frontier = state.frontier[0]~ - Inside source: true *** True Line Result - args.state.player_one = args.state.new_entity(:player, name: "Ryu") -** Processing line: ~ args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)~ + next_frontier = state.frontier[0] +** Processing line: ~ outputs.solids << [scale_up(next_frontier), highlighter_yellow]~ - Inside source: true *** True Line Result - args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil) + outputs.solids << [scale_up(next_frontier), highlighter_yellow] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~ +** Processing line: ~ # Neighbors have a semi-transparent green layer over them~ - 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}}'~ + # Neighbors have a semi-transparent green layer over them +** Processing line: ~ # Unless the neighbor is a wall~ - 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}}' -** Processing line: ~~ + # Unless the neighbor is a wall +** Processing line: ~ adjacent_neighbors(next_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - -** Processing line: ~ GTK::Entity.__reset_id__!~ + adjacent_neighbors(next_frontier).each do |neighbor| +** Processing line: ~ unless state.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ deserialized_state = args.gtk.deserialize_state serialized_state~ + unless state.walls.has_key?(neighbor) +** Processing line: ~ outputs.solids << [scale_up(neighbor), highlighter_green, 70]~ - Inside source: true *** True Line Result - deserialized_state = args.gtk.deserialize_state serialized_state -** Processing line: ~~ + outputs.solids << [scale_up(neighbor), highlighter_green, 70] +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ assert.equal! args.state.player_one.name, deserialized_state.player_one.name~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.equal! args.state.player_one.name, deserialized_state.player_one.name -** Processing line: ~ assert.true! args.state.player_one.is_a? GTK::OpenEntity~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - assert.true! args.state.player_one.is_a? GTK::OpenEntity + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! args.state.player_two.name, deserialized_state.player_two.name~ -- Inside source: true -*** True Line Result - assert.equal! args.state.player_two.name, deserialized_state.player_two.name -** Processing line: ~ assert.equal! args.state.player_two.blood_type, deserialized_state.player_two.blood_type~ +** Processing line: ~~ - Inside source: true *** True Line Result - assert.equal! args.state.player_two.blood_type, deserialized_state.player_two.blood_type -** Processing line: ~ assert.equal! deserialized_state.player_two.blood_type, nil~ + +** Processing line: ~ # Cell Size is used when rendering to allow the grid to be scaled up or down~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.player_two.blood_type, nil -** Processing line: ~ assert.true! args.state.player_two.is_a? GTK::StrictEntity~ + # Cell Size is used when rendering to allow the grid to be scaled up or down +** Processing line: ~ # Cells in the frontier array and visited hash and walls hash are stored as x & y~ - Inside source: true *** True Line Result - assert.true! args.state.player_two.is_a? GTK::StrictEntity -** Processing line: ~~ + # Cells in the frontier array and visited hash and walls hash are stored as x & y +** Processing line: ~ # Scaling up cells and lines when rendering allows omitting of width and height~ - Inside source: true *** True Line Result - -** Processing line: ~ deserialized_state.player_two.blood_type = :O~ + # Scaling up cells and lines when rendering allows omitting of width and height +** Processing line: ~ def scale_up(cell)~ - Inside source: true *** True Line Result - deserialized_state.player_two.blood_type = :O -** Processing line: ~ assert.equal! deserialized_state.player_two.blood_type, :O~ + def scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.player_two.blood_type, :O -** Processing line: ~ end~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - end + cell = cell.clone ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_multiple_strict_entities args, assert~ +** Processing line: ~ # If cell is just an x and y coordinate~ - Inside source: true *** True Line Result - def test_multiple_strict_entities args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + # If cell is just an x and y coordinate +** Processing line: ~ if cell.size == 2~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.player = args.state.new_entity_strict(:player_one, name: "Ryu")~ + if cell.size == 2 +** Processing line: ~ # Add a width and height of 1~ - Inside source: true *** True Line Result - args.state.player = args.state.new_entity_strict(:player_one, name: "Ryu") -** Processing line: ~ args.state.enemy = args.state.new_entity_strict(:enemy, name: "Bison", other_property: 'extra mean')~ + # Add a width and height of 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - args.state.enemy = args.state.new_entity_strict(:enemy, name: "Bison", other_property: 'extra mean') -** Processing line: ~~ + cell << 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - -** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~ + cell << 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - serialized_state = args.gtk.serialize_state args.state + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ GTK::Entity.__reset_id__!~ +** Processing line: ~ # Scale all the values up~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ deserialized_state = args.gtk.deserialize_state serialized_state~ + # Scale all the values up +** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ - Inside source: true *** True Line Result - deserialized_state = args.gtk.deserialize_state serialized_state + cell.map! { |value| value * grid.cell_size } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ assert.equal! deserialized_state.player.name, "Ryu"~ +** Processing line: ~ # Returns the scaled up cell~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.player.name, "Ryu" -** Processing line: ~ assert.equal! deserialized_state.enemy.other_property, "extra mean"~ + # Returns the scaled up cell +** Processing line: ~ cell~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.enemy.other_property, "extra mean" -** Processing line: ~ end~ + cell +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_by_reference_state args, assert~ +** Processing line: ~~ - Inside source: true *** True Line Result - def test_by_reference_state args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + +** Processing line: ~ # This method processes user input every tick~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.a = { name: "Jane Doe" }~ + # This method processes user input every tick +** Processing line: ~ # This method allows the user to use the buttons, slider, and edit the grid~ - Inside source: true *** True Line Result - args.state.a = { name: "Jane Doe" } -** Processing line: ~ args.state.b = args.state.a~ + # This method allows the user to use the buttons, slider, and edit the grid +** Processing line: ~ # There are 2 types of input:~ - Inside source: true *** True Line Result - args.state.b = args.state.a -** Processing line: ~ assert.equal! args.state.a.object_id, args.state.b.object_id~ + # There are 2 types of input: +** Processing line: ~ # Button Input~ - Inside source: true *** True Line Result - assert.equal! args.state.a.object_id, args.state.b.object_id -** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~ + # Button Input +** Processing line: ~ # Click and Drag Input~ - Inside source: true *** True Line Result - serialized_state = args.gtk.serialize_state args.state -** Processing line: ~~ + # Click and Drag Input +** Processing line: ~ #~ - Inside source: true *** True Line Result - -** Processing line: ~ GTK::Entity.__reset_id__!~ + # +** Processing line: ~ # Button Input is used for the backward step and forward step buttons~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ deserialized_state = args.gtk.deserialize_state serialized_state~ + # Button Input is used for the backward step and forward step buttons +** Processing line: ~ # Input is detected by mouse up within the bounds of the rect~ - Inside source: true *** True Line Result - deserialized_state = args.gtk.deserialize_state serialized_state -** Processing line: ~ assert.equal! deserialized_state.a.object_id, deserialized_state.b.object_id~ + # Input is detected by mouse up within the bounds of the rect +** Processing line: ~ #~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.a.object_id, deserialized_state.b.object_id -** Processing line: ~ end~ + # +** Processing line: ~ # Click and Drag Input is used for moving the star, adding walls,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Click and Drag Input is used for moving the star, adding walls, +** Processing line: ~ # removing walls, and the slider~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_by_reference_state_strict_entities args, assert~ + # removing walls, and the slider +** Processing line: ~ #~ - Inside source: true *** True Line Result - def test_by_reference_state_strict_entities args, assert -** Processing line: ~ GTK::Entity.__reset_id__!~ + # +** Processing line: ~ # When the mouse is down on the star, the click_and_drag variable is set to :star~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ args.state.a = { name: "Jane Doe" }~ + # When the mouse is down on the star, the click_and_drag variable is set to :star +** Processing line: ~ # While click_and_drag equals :star, the cursor's position is used to calculate the~ - Inside source: true *** True Line Result - args.state.a = { name: "Jane Doe" } -** Processing line: ~ args.state.strict_entity = args.state.new_entity_strict(:couple) do |e|~ + # While click_and_drag equals :star, the cursor's position is used to calculate the +** Processing line: ~ # appropriate drag behavior~ - Inside source: true *** True Line Result - args.state.strict_entity = args.state.new_entity_strict(:couple) do |e| -** Processing line: ~ e.one = args.state.new_entity_strict(:person, name: "Jane")~ + # appropriate drag behavior +** Processing line: ~ #~ - Inside source: true *** True Line Result - e.one = args.state.new_entity_strict(:person, name: "Jane") -** Processing line: ~ e.two = e.one~ + # +** Processing line: ~ # When the mouse goes up click_and_drag is set to :none~ - Inside source: true *** True Line Result - e.two = e.one -** Processing line: ~ end~ + # When the mouse goes up click_and_drag is set to :none +** Processing line: ~ #~ - Inside source: true *** True Line Result - end -** Processing line: ~ assert.equal! args.state.strict_entity.one, args.state.strict_entity.two~ + # +** Processing line: ~ # A variable has to be used because the star has to continue being edited even~ - Inside source: true *** True Line Result - assert.equal! args.state.strict_entity.one, args.state.strict_entity.two -** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~ + # A variable has to be used because the star has to continue being edited even +** Processing line: ~ # when the cursor is no longer over the star~ - Inside source: true *** True Line Result - serialized_state = args.gtk.serialize_state args.state -** Processing line: ~~ + # when the cursor is no longer over the star +** Processing line: ~ #~ - Inside source: true *** True Line Result - -** Processing line: ~ GTK::Entity.__reset_id__!~ + # +** Processing line: ~ # Similar things occur for the other Click and Drag inputs~ - Inside source: true *** True Line Result - GTK::Entity.__reset_id__! -** Processing line: ~ deserialized_state = args.gtk.deserialize_state serialized_state~ + # Similar things occur for the other Click and Drag inputs +** Processing line: ~ def input~ - Inside source: true *** True Line Result - deserialized_state = args.gtk.deserialize_state serialized_state -** Processing line: ~ assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two~ + def input +** Processing line: ~ # Processes inputs for the buttons~ - Inside source: true *** True Line Result - assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two -** Processing line: ~ end~ + # Processes inputs for the buttons +** Processing line: ~ input_buttons~ - Inside source: true *** True Line Result - end + input_buttons ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - -*** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb~ +** Processing line: ~ # Detects which if any click and drag input is occurring~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb -** Processing line: ~ MAX_CODE_GEN_LENGTH = 50~ + # Detects which if any click and drag input is occurring +** Processing line: ~ detect_click_and_drag~ - Inside source: true *** True Line Result - MAX_CODE_GEN_LENGTH = 50 + detect_click_and_drag ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # NOTE: This is experimental/advanced stuff.~ -- Inside source: true -*** True Line Result - # NOTE: This is experimental/advanced stuff. -** Processing line: ~ def needs_partitioning? target~ +** Processing line: ~ # Does the appropriate click and drag input based on the click_and_drag variable~ - Inside source: true *** True Line Result - def needs_partitioning? target -** Processing line: ~ target[:value].to_s.length > MAX_CODE_GEN_LENGTH~ + # Does the appropriate click and drag input based on the click_and_drag variable +** Processing line: ~ process_click_and_drag~ - Inside source: true *** True Line Result - target[:value].to_s.length > MAX_CODE_GEN_LENGTH -** Processing line: ~ end~ + process_click_and_drag +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def partition target~ +** Processing line: ~ # Detects and Process input for each button~ - Inside source: true *** True Line Result - def partition target -** Processing line: ~ return [] unless needs_partitioning? target~ + # Detects and Process input for each button +** Processing line: ~ def input_buttons~ - Inside source: true *** True Line Result - return [] unless needs_partitioning? target -** Processing line: ~ if target[:value].is_a? GTK::OpenEntity~ + def input_buttons +** Processing line: ~ input_left_button~ - Inside source: true *** True Line Result - if target[:value].is_a? GTK::OpenEntity -** Processing line: ~ target[:value] = target[:value].hash~ + input_left_button +** Processing line: ~ input_right_button~ - Inside source: true *** True Line Result - target[:value] = target[:value].hash + input_right_button ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -58604,118 +67067,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ results = []~ -- Inside source: true -*** True Line Result - results = [] -** Processing line: ~ idx = 0~ +** Processing line: ~ # Checks if the previous step button is clicked~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ left, right = target[:value].partition do~ + # Checks if the previous step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ - Inside source: true *** True Line Result - left, right = target[:value].partition do -** Processing line: ~ idx += 1~ + # If it is, it pauses the animation and moves the search one step backward +** Processing line: ~ def input_left_button~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ idx.even?~ + def input_left_button +** Processing line: ~ if left_button_clicked?~ - Inside source: true *** True Line Result - idx.even? -** Processing line: ~ end~ + if left_button_clicked? +** Processing line: ~ unless state.anim_steps == 0~ - Inside source: true *** True Line Result - end -** Processing line: ~ left, right = Hash[left], Hash[right]~ + unless state.anim_steps == 0 +** Processing line: ~ state.anim_steps -= 1~ - Inside source: true *** True Line Result - left, right = Hash[left], Hash[right] -** Processing line: ~ left = { value: left }~ + state.anim_steps -= 1 +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - left = { value: left } -** Processing line: ~ right = { value: right}~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - right = { value: right} -** Processing line: ~ [left, right]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - [left, right] -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def add_partition target, path, aggregate, final_result~ -- Inside source: true -*** True Line Result - def add_partition target, path, aggregate, final_result -** Processing line: ~ partitions = partition target~ -- Inside source: true -*** True Line Result - partitions = partition target -** Processing line: ~ partitions.each do |part|~ +** Processing line: ~ # Checks if the next step button is clicked~ - Inside source: true *** True Line Result - partitions.each do |part| -** Processing line: ~ if needs_partitioning? part~ + # Checks if the next step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ - Inside source: true *** True Line Result - if needs_partitioning? part -** Processing line: ~ if part[:value].keys.length == 1~ + # If it is, it pauses the animation and moves the search one step forward +** Processing line: ~ def input_right_button~ - Inside source: true *** True Line Result - if part[:value].keys.length == 1 -** Processing line: ~ first_key = part[:value].keys[0]~ + def input_right_button +** Processing line: ~ if right_button_clicked?~ - Inside source: true *** True Line Result - first_key = part[:value].keys[0] -** Processing line: ~ new_part = { value: part[:value][first_key] }~ + if right_button_clicked? +** Processing line: ~ unless state.anim_steps == state.max_steps~ - Inside source: true *** True Line Result - new_part = { value: part[:value][first_key] } -** Processing line: ~ path.push first_key~ + unless state.anim_steps == state.max_steps +** Processing line: ~ state.anim_steps += 1~ - Inside source: true *** True Line Result - path.push first_key -** Processing line: ~ add_partition new_part, path, aggregate, final_result~ + state.anim_steps += 1 +** Processing line: ~ # Although normally recalculate would be called here~ - Inside source: true *** True Line Result - add_partition new_part, path, aggregate, final_result -** Processing line: ~ path.pop~ + # Although normally recalculate would be called here +** Processing line: ~ # because the right button only moves the search forward~ - Inside source: true *** True Line Result - path.pop -** Processing line: ~ else~ + # because the right button only moves the search forward +** Processing line: ~ # We can just do that~ - Inside source: true *** True Line Result - else -** Processing line: ~ add_partition part, path, aggregate, final_result~ + # We can just do that +** Processing line: ~ calc~ - Inside source: true *** True Line Result - add_partition part, path, aggregate, final_result + calc ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ else~ -- Inside source: true -*** True Line Result - else -** Processing line: ~ final_result << { value: { __path__: [*path] } }~ -- Inside source: true -*** True Line Result - final_result << { value: { __path__: [*path] } } -** Processing line: ~ final_result << { value: part[:value] }~ -- Inside source: true -*** True Line Result - final_result << { value: part[:value] } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -58724,146 +67163,134 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def state_to_string state~ -- Inside source: true -*** True Line Result - def state_to_string state -** Processing line: ~ parts_queue = []~ -- Inside source: true -*** True Line Result - parts_queue = [] -** Processing line: ~ final_queue = []~ -- Inside source: true -*** True Line Result - final_queue = [] -** Processing line: ~ add_partition({ value: state.hash },~ +** Processing line: ~ # Whenever the user edits the grid,~ - Inside source: true *** True Line Result - add_partition({ value: state.hash }, -** Processing line: ~ [],~ + # Whenever the user edits the grid, +** Processing line: ~ # The search has to be recalculated upto the current step~ - Inside source: true *** True Line Result - [], -** Processing line: ~ parts_queue,~ + # The search has to be recalculated upto the current step +** Processing line: ~~ - Inside source: true *** True Line Result - parts_queue, -** Processing line: ~ final_queue)~ + +** Processing line: ~ def recalculate~ - Inside source: true *** True Line Result - final_queue) -** Processing line: ~ final_queue.reject {|i| i[:value].keys.length == 0}.map do |i|~ + def recalculate +** Processing line: ~ # Resets the search~ - Inside source: true *** True Line Result - final_queue.reject {|i| i[:value].keys.length == 0}.map do |i| -** Processing line: ~ i[:value].to_s~ + # Resets the search +** Processing line: ~ state.frontier = []~ - Inside source: true *** True Line Result - i[:value].to_s -** Processing line: ~ end.join("\n#==================================================#\n")~ + state.frontier = [] +** Processing line: ~ state.visited = {}~ - Inside source: true *** True Line Result - end.join("\n#==================================================#\n") -** Processing line: ~ end~ + state.visited = {} +** Processing line: ~ state.cell_numbers = []~ - Inside source: true *** True Line Result - end + state.cell_numbers = [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def state_from_string string~ +** Processing line: ~ # Moves the animation forward one step at a time~ - Inside source: true *** True Line Result - def state_from_string string -** Processing line: ~ Kernel.eval("$load_data = {}")~ + # Moves the animation forward one step at a time +** Processing line: ~ state.anim_steps.times { calc }~ - Inside source: true *** True Line Result - Kernel.eval("$load_data = {}") -** Processing line: ~ lines = string.split("\n#==================================================#\n")~ + state.anim_steps.times { calc } +** Processing line: ~ end~ - Inside source: true *** True Line Result - lines = string.split("\n#==================================================#\n") -** Processing line: ~ lines.each do |l|~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - lines.each do |l| -** Processing line: ~ puts "todo: #{l}"~ + +** Processing line: ~~ - Inside source: true *** True Line Result - puts "todo: #{l}" -** Processing line: ~ end~ + +** Processing line: ~ # Determines what the user is clicking and planning on dragging~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Determines what the user is clicking and planning on dragging +** Processing line: ~ # Click and drag input is initiated by a click on the appropriate item~ - Inside source: true *** True Line Result - -** Processing line: ~ GTK::OpenEntity.parse_from_hash $load_data~ + # Click and drag input is initiated by a click on the appropriate item +** Processing line: ~ # and ended by mouse up~ - Inside source: true *** True Line Result - GTK::OpenEntity.parse_from_hash $load_data -** Processing line: ~ end~ + # and ended by mouse up +** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Storing the value allows the user to continue the same edit as long as the +** Processing line: ~ # mouse left click is held~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_save_and_load args, assert~ + # mouse left click is held +** Processing line: ~ def detect_click_and_drag~ - Inside source: true *** True Line Result - def test_save_and_load args, assert -** Processing line: ~ args.state.item_1.name = "Jane"~ + def detect_click_and_drag +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - args.state.item_1.name = "Jane" -** Processing line: ~ string = state_to_string args.state~ + if inputs.mouse.up +** Processing line: ~ state.click_and_drag = :none~ - Inside source: true *** True Line Result - string = state_to_string args.state -** Processing line: ~ state = state_from_string string~ + state.click_and_drag = :none +** Processing line: ~ elsif star_clicked?~ - Inside source: true *** True Line Result - state = state_from_string string -** Processing line: ~ assert.equal! args.state.item_1.name, state.item_1.name~ + elsif star_clicked? +** Processing line: ~ state.click_and_drag = :star~ - Inside source: true *** True Line Result - assert.equal! args.state.item_1.name, state.item_1.name -** Processing line: ~ end~ + state.click_and_drag = :star +** Processing line: ~ elsif wall_clicked?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif wall_clicked? +** Processing line: ~ state.click_and_drag = :remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_save_and_load_big args, assert~ + state.click_and_drag = :remove_wall +** Processing line: ~ elsif grid_clicked?~ - Inside source: true *** True Line Result - def test_save_and_load_big args, assert -** Processing line: ~ size = 1000~ + elsif grid_clicked? +** Processing line: ~ state.click_and_drag = :add_wall~ - Inside source: true *** True Line Result - size = 1000 -** Processing line: ~ size.map_with_index do |i|~ + state.click_and_drag = :add_wall +** Processing line: ~ elsif slider_clicked?~ - Inside source: true *** True Line Result - size.map_with_index do |i| -** Processing line: ~ args.state.send("k#{i}=".to_sym, i)~ + elsif slider_clicked? +** Processing line: ~ state.click_and_drag = :slider~ - Inside source: true *** True Line Result - args.state.send("k#{i}=".to_sym, i) + state.click_and_drag = :slider +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -58872,406 +67299,390 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ string = state_to_string args.state~ -- Inside source: true -*** True Line Result - string = state_to_string args.state -** Processing line: ~ state = state_from_string string~ -- Inside source: true -*** True Line Result - state = state_from_string string -** Processing line: ~ size.map_with_index do |i|~ +** Processing line: ~ # Processes input based on what the user is currently dragging~ - Inside source: true *** True Line Result - size.map_with_index do |i| -** Processing line: ~ assert.equal! args.state.send("k#{i}".to_sym), state.send("k#{i}".to_sym)~ + # Processes input based on what the user is currently dragging +** Processing line: ~ def process_click_and_drag~ - Inside source: true *** True Line Result - assert.equal! args.state.send("k#{i}".to_sym), state.send("k#{i}".to_sym) -** Processing line: ~ assert.equal! args.state.send("k#{i}".to_sym), i~ + def process_click_and_drag +** Processing line: ~ if state.click_and_drag == :slider~ - Inside source: true *** True Line Result - assert.equal! args.state.send("k#{i}".to_sym), i -** Processing line: ~ assert.equal! state.send("k#{i}".to_sym), i~ + if state.click_and_drag == :slider +** Processing line: ~ input_slider~ - Inside source: true *** True Line Result - assert.equal! state.send("k#{i}".to_sym), i -** Processing line: ~ end~ + input_slider +** Processing line: ~ elsif state.click_and_drag == :star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + elsif state.click_and_drag == :star +** Processing line: ~ input_star~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + input_star +** Processing line: ~ elsif state.click_and_drag == :remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ def test_save_and_load_big_nested args, assert~ + elsif state.click_and_drag == :remove_wall +** Processing line: ~ input_remove_wall~ - Inside source: true *** True Line Result - def test_save_and_load_big_nested args, assert -** Processing line: ~ args.state.player_one.friend.nested_hash.k0 = 0~ + input_remove_wall +** Processing line: ~ elsif state.click_and_drag == :add_wall~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k0 = 0 -** Processing line: ~ args.state.player_one.friend.nested_hash.k1 = 1~ + elsif state.click_and_drag == :add_wall +** Processing line: ~ input_add_wall~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k1 = 1 -** Processing line: ~ args.state.player_one.friend.nested_hash.k2 = 2~ + input_add_wall +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k2 = 2 -** Processing line: ~ args.state.player_one.friend.nested_hash.k3 = 3~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k3 = 3 -** Processing line: ~ args.state.player_one.friend.nested_hash.k4 = 4~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k4 = 4 -** Processing line: ~ args.state.player_one.friend.nested_hash.k5 = 5~ + +** Processing line: ~ # This method is called when the user is dragging the slider~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k5 = 5 -** Processing line: ~ args.state.player_one.friend.nested_hash.k6 = 6~ + # This method is called when the user is dragging the slider +** Processing line: ~ # It moves the current animation step to the point represented by the slider~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k6 = 6 -** Processing line: ~ args.state.player_one.friend.nested_hash.k7 = 7~ + # It moves the current animation step to the point represented by the slider +** Processing line: ~ def input_slider~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k7 = 7 -** Processing line: ~ args.state.player_one.friend.nested_hash.k8 = 8~ + def input_slider +** Processing line: ~ mouse_x = inputs.mouse.point.x~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k8 = 8 -** Processing line: ~ args.state.player_one.friend.nested_hash.k9 = 9~ + mouse_x = inputs.mouse.point.x +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player_one.friend.nested_hash.k9 = 9 -** Processing line: ~ string = state_to_string args.state~ + +** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ - Inside source: true *** True Line Result - string = state_to_string args.state -** Processing line: ~ state = state_from_string string~ + # Bounds the mouse_x to the closest x value on the slider line +** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ - Inside source: true *** True Line Result - state = state_from_string string -** Processing line: ~ end~ + mouse_x = slider.x if mouse_x < slider.x +** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ - Inside source: true *** True Line Result - end + mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ $gtk.reset 100~ +** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ - Inside source: true *** True Line Result - $gtk.reset 100 -** Processing line: ~ $gtk.log_level = :off~ + # Sets the current search step to the one represented by the mouse x value +** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ - Inside source: true *** True Line Result - $gtk.log_level = :off -** Processing line: ~~ + # The slider's circle moves due to the render_slider method using anim_steps +** Processing line: ~ state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i~ - 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 + state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i ** Processing line: ~~ -- End of paragraph detected. +- Inside source: true *** True Line Result -** Processing line: ~*** Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb~ -- Header detected. +** Processing line: ~ recalculate~ +- Inside source: true *** True Line Result - + recalculate +** Processing line: ~ end~ +- Inside source: true *** True Line Result -*** Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Moves the star to the grid closest to the mouse~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/suggest_autocompletion_tests.rb~ + # Moves the star to the grid closest to the mouse +** Processing line: ~ # Only recalculates the search if the star changes position~ - Inside source: true *** True Line Result - # ./samples/10_advanced_debugging/03_unit_tests/suggest_autocompletion_tests.rb -** Processing line: ~ def default_suggest_autocompletion args~ + # Only recalculates the search if the star changes position +** Processing line: ~ # Called whenever the user is dragging the star~ - Inside source: true *** True Line Result - def default_suggest_autocompletion args -** Processing line: ~ {~ + # Called whenever the user is dragging the star +** Processing line: ~ def input_star~ - Inside source: true *** True Line Result - { -** Processing line: ~ index: 4,~ + def input_star +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - index: 4, -** Processing line: ~ text: "args.",~ + old_star = state.star.clone +** Processing line: ~ state.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - text: "args.", -** Processing line: ~ __meta__: {~ + state.star = cell_closest_to_mouse +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - __meta__: { -** Processing line: ~ other_options: [~ + unless old_star == state.star +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - other_options: [ -** Processing line: ~ {~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - { -** Processing line: ~ index: Fixnum,~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - index: Fixnum, -** Processing line: ~ file: "app/main.rb"~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - file: "app/main.rb" -** Processing line: ~ }~ + +** Processing line: ~ # Removes walls that are under the cursor~ - Inside source: true *** True Line Result - } -** Processing line: ~ ]~ + # Removes walls that are under the cursor +** Processing line: ~ def input_remove_wall~ - Inside source: true *** True Line Result - ] -** Processing line: ~ }~ + def input_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - } -** Processing line: ~ }~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - -** Processing line: ~ def assert_completion source, *expected~ + if mouse_inside_grid? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - def assert_completion source, *expected -** Processing line: ~ results = suggest_autocompletion text: (source.strip.gsub ":cursor", ""),~ + if state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - results = suggest_autocompletion text: (source.strip.gsub ":cursor", ""), -** Processing line: ~ index: (source.strip.index ":cursor")~ + state.walls.delete(cell_closest_to_mouse) +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - index: (source.strip.index ":cursor") -** Processing line: ~~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ puts results~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - puts results -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def test_args_completion args, assert~ -- Inside source: true -*** True Line Result - def test_args_completion args, assert -** Processing line: ~ $gtk.write_file_root "autocomplete.txt", ($gtk.suggest_autocompletion text: <<-S, index: 128).join("\n")~ +** Processing line: ~ # Adds walls at cells under the cursor~ - Inside source: true *** True Line Result - $gtk.write_file_root "autocomplete.txt", ($gtk.suggest_autocompletion text: <<-S, index: 128).join("\n") -** Processing line: ~ require 'app/game.rb'~ + # Adds walls at cells under the cursor +** Processing line: ~ def input_add_wall~ - Inside source: true *** True Line Result - require 'app/game.rb' -** Processing line: ~~ + def input_add_wall +** Processing line: ~ # Adds a wall to the hash~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + # Adds a wall to the hash +** Processing line: ~ # We can use the grid closest to mouse, because the cursor is inside the grid~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.gtk.suppress_mailbox = false~ + # We can use the grid closest to mouse, because the cursor is inside the grid +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - args.gtk.suppress_mailbox = false -** Processing line: ~ $game ||= Game.new~ + if mouse_inside_grid? +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - $game ||= Game.new -** Processing line: ~ $game.args = args~ + unless state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - $game.args = args -** Processing line: ~ $game.args.~ + state.walls[cell_closest_to_mouse] = true +** Processing line: ~ recalculate~ - Inside source: true *** True Line Result - $game.args. -** Processing line: ~ $game.tick~ + recalculate +** Processing line: ~ end~ - Inside source: true *** True Line Result - $game.tick -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ S~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - S + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ puts "contents:"~ +** Processing line: ~ # This method moves the search forward one step~ - Inside source: true *** True Line Result - puts "contents:" -** Processing line: ~ puts ($gtk.read_file "autocomplete.txt")~ + # This method moves the search forward one step +** Processing line: ~ # When the animation is playing it is called every tick~ - Inside source: true *** True Line Result - puts ($gtk.read_file "autocomplete.txt") -** Processing line: ~ end~ + # When the animation is playing it is called every tick +** Processing line: ~ # And called whenever the current step of the animation needs to be recalculated~ - Inside source: true *** True Line Result - end + # And called whenever the current step of the animation needs to be recalculated ** 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: ~*** Http - Retrieve Images - main.rb~ -- Header detected. +** Processing line: ~ # Moves the search forward one step~ +- Inside source: true *** True Line Result - + # Moves the search forward one step +** Processing line: ~ # Parameter called_from_tick is true if it is called from the tick method~ +- Inside source: true *** True Line Result -*** Http - Retrieve Images - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Parameter called_from_tick is true if it is called from the tick method +** Processing line: ~ # It is false when the search is being recalculated after user editing the grid~ +- Inside source: true *** True Line Result - + # It is false when the search is being recalculated after user editing the grid +** Processing line: ~ def calc~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/11_http/01_retrieve_images/app/main.rb~ + def calc +** Processing line: ~ # The setup to the search~ - Inside source: true *** True Line Result - # ./samples/11_http/01_retrieve_images/app/main.rb -** Processing line: ~ def tick args~ + # The setup to the search +** Processing line: ~ # Runs once when the there is no frontier or visited cells~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + # Runs once when the there is no frontier or visited cells +** Processing line: ~ if state.frontier.empty? && state.visited.empty?~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~~ + if state.frontier.empty? && state.visited.empty? +** Processing line: ~ state.frontier << state.star~ - Inside source: true *** True Line Result - -** Processing line: ~ # Show a warning at the start.~ + state.frontier << state.star +** Processing line: ~ state.visited[state.star] = true~ - Inside source: true *** True Line Result - # Show a warning at the start. -** Processing line: ~ args.state.warning_debounce ||= 11 * 60~ + state.visited[state.star] = true +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.warning_debounce ||= 11 * 60 -** Processing line: ~ if args.state.warning_debounce > 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if args.state.warning_debounce > 0 -** Processing line: ~ args.state.warning_debounce -= 1~ + +** Processing line: ~ # A step in the search~ - Inside source: true *** True Line Result - args.state.warning_debounce -= 1 -** Processing line: ~ args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]~ + # A step in the search +** Processing line: ~ unless state.frontier.empty?~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255] -** Processing line: ~ args.outputs.labels << [640, 500, "Quit in the next few seconds if this is a problem.", 10, 1, 255, 255, 255]~ + unless state.frontier.empty? +** Processing line: ~ # Takes the next frontier cell~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 500, "Quit in the next few seconds if this is a problem.", 10, 1, 255, 255, 255] -** Processing line: ~ args.outputs.labels << [640, 350, "#{(args.state.warning_debounce / 60.0).to_i}", 10, 1, 255, 255, 255]~ + # Takes the next frontier cell +** Processing line: ~ new_frontier = state.frontier.shift~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 350, "#{(args.state.warning_debounce / 60.0).to_i}", 10, 1, 255, 255, 255] -** Processing line: ~ return~ + new_frontier = state.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - return -** Processing line: ~ end~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + adjacent_neighbors(new_frontier).each do |neighbor| +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.download_debounce ||= 0 # start immediately, reset to non zero later.~ + # That have not been visited and are not walls +** Processing line: ~ unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - args.state.download_debounce ||= 0 # start immediately, reset to non zero later. -** Processing line: ~ args.state.photos ||= []~ + unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result - args.state.photos ||= [] -** Processing line: ~~ + # Add them to the frontier and mark them as visited +** Processing line: ~ state.frontier << neighbor~ - Inside source: true *** True Line Result - -** Processing line: ~ # Put a little pause between each download.~ + state.frontier << neighbor +** Processing line: ~ state.visited[neighbor] = true~ - Inside source: true *** True Line Result - # Put a little pause between each download. -** Processing line: ~ if args.state.download.nil?~ + state.visited[neighbor] = true +** Processing line: ~~ - Inside source: true *** True Line Result - if args.state.download.nil? -** Processing line: ~ if args.state.download_debounce > 0~ + +** Processing line: ~ # Also assign them a frontier number~ - Inside source: true *** True Line Result - if args.state.download_debounce > 0 -** Processing line: ~ args.state.download_debounce -= 1~ + # Also assign them a frontier number +** Processing line: ~ state.cell_numbers << neighbor~ - Inside source: true *** True Line Result - args.state.download_debounce -= 1 -** Processing line: ~ else~ + state.cell_numbers << neighbor +** Processing line: ~ end~ - Inside source: true *** True Line Result - else -** Processing line: ~ args.state.download = $gtk.http_get 'https://picsum.photos/200/300.jpg'~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.download = $gtk.http_get 'https://picsum.photos/200/300.jpg' + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -59284,46 +67695,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if !args.state.download.nil?~ +** Processing line: ~~ - Inside source: true *** True Line Result - if !args.state.download.nil? -** Processing line: ~ if args.state.download[:complete]~ + +** Processing line: ~ # Returns a list of adjacent cells~ - Inside source: true *** True Line Result - if args.state.download[:complete] -** Processing line: ~ if args.state.download[:http_response_code] == 200~ + # Returns a list of adjacent cells +** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ - Inside source: true *** True Line Result - if args.state.download[:http_response_code] == 200 -** Processing line: ~ fname = "sprites/#{args.state.photos.length}.jpg"~ + # Used to determine what the next cells to be added to the frontier are +** Processing line: ~ def adjacent_neighbors cell~ - Inside source: true *** True Line Result - fname = "sprites/#{args.state.photos.length}.jpg" -** Processing line: ~ $gtk.write_file fname, args.state.download[:response_data]~ + def adjacent_neighbors cell +** Processing line: ~ neighbors = []~ - Inside source: true *** True Line Result - $gtk.write_file fname, args.state.download[:response_data] -** Processing line: ~ args.state.photos << [ 100 + rand(1080), 500 - rand(480), fname, rand(80) - 40 ]~ + neighbors = [] +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.photos << [ 100 + rand(1080), 500 - rand(480), fname, rand(80) - 40 ] -** Processing line: ~ end~ + +** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ - Inside source: true *** True Line Result - end -** Processing line: ~ args.state.download = nil~ + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 +** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ - Inside source: true *** True Line Result - args.state.download = nil -** Processing line: ~ args.state.download_debounce = (rand(3) + 2) * 60~ + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 +** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ - Inside source: true *** True Line Result - args.state.download_debounce = (rand(3) + 2) * 60 -** Processing line: ~ end~ + neighbors << [cell.x, cell.y - 1] unless cell.y == 0 +** Processing line: ~ neighbors << [cell.x - 1, cell.y] unless cell.x == 0~ - Inside source: true *** True Line Result - end + neighbors << [cell.x - 1, cell.y] unless cell.x == 0 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ neighbors~ +- Inside source: true +*** True Line Result + neighbors ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -59332,486 +67751,482 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # draw any downloaded photos...~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - # draw any downloaded photos... -** Processing line: ~ args.state.photos.each { |i|~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - args.state.photos.each { |i| -** Processing line: ~ args.outputs.primitives << [i[0], i[1], 200, 300, i[2], i[3]].sprite~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the grid closest to the mouse helps with this~ - Inside source: true *** True Line Result - args.outputs.primitives << [i[0], i[1], 200, 300, i[2], i[3]].sprite -** Processing line: ~ }~ + # Finding the grid closest to the mouse helps with this +** Processing line: ~ def cell_closest_to_mouse~ - Inside source: true *** True Line Result - } -** Processing line: ~~ + def cell_closest_to_mouse +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draw a download progress bar...~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - # Draw a download progress bar... -** Processing line: ~ args.outputs.primitives << [0, 0, 1280, 30, 0, 0, 0, 255].solid~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - args.outputs.primitives << [0, 0, 1280, 30, 0, 0, 0, 255].solid -** Processing line: ~ if !args.state.download.nil?~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - if !args.state.download.nil? -** Processing line: ~ br = args.state.download[:response_read]~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - br = args.state.download[:response_read] -** Processing line: ~ total = args.state.download[:response_total]~ + [x, y] +** Processing line: ~ end~ - Inside source: true *** True Line Result - total = args.state.download[:response_total] -** Processing line: ~ if total != 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if total != 0 -** Processing line: ~ pct = br.to_f / total.to_f~ + +** Processing line: ~~ - Inside source: true *** True Line Result - pct = br.to_f / total.to_f -** Processing line: ~ args.outputs.primitives << [0, 0, 1280 * pct, 30, 0, 0, 255, 255].solid~ + +** Processing line: ~ # These methods detect when the buttons are clicked~ - Inside source: true *** True Line Result - args.outputs.primitives << [0, 0, 1280 * pct, 30, 0, 0, 255, 255].solid -** Processing line: ~ end~ + # These methods detect when the buttons are clicked +** Processing line: ~ def left_button_clicked?~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def left_button_clicked? +** Processing line: ~ (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)) || inputs.keyboard.key_up.left~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)) || inputs.keyboard.key_up.left +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ def right_button_clicked?~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + def right_button_clicked? +** Processing line: ~ (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)) || inputs.keyboard.key_up.right~ +- Inside source: true *** True Line Result - -** Processing line: ~*** Http - Web Server - main.rb~ -- Header detected. + (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)) || inputs.keyboard.key_up.right +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Signal that the user is going to be moving the slider~ +- Inside source: true *** True Line Result -*** Http - Web Server - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Signal that the user is going to be moving the slider +** Processing line: ~ def slider_clicked?~ +- Inside source: true *** True Line Result - + def slider_clicked? +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/11_http/02_web_server/app/main.rb~ + circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ - Inside source: true *** True Line Result - # ./samples/11_http/02_web_server/app/main.rb -** Processing line: ~ def tick args~ + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.state.port ||= 3000~ + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect)~ - Inside source: true *** True Line Result - args.state.port ||= 3000 -** Processing line: ~ # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build~ + inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build -** Processing line: ~ # to enable the http server in a production build, you need to manually start~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # to enable the http server in a production build, you need to manually start -** Processing line: ~ # the server up:~ + +** Processing line: ~ # Signal that the user is going to be moving the star~ - Inside source: true *** True Line Result - # the server up: -** Processing line: ~ args.gtk.start_server! port: args.state.port, enable_in_prod: true~ + # Signal that the user is going to be moving the star +** Processing line: ~ def star_clicked?~ - Inside source: true *** True Line Result - args.gtk.start_server! port: args.state.port, enable_in_prod: true -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + def star_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star))~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.labels << [640, 600, "Point your web browser at http://localhost:#{args.state.port}/", 10, 1, 255, 255, 255]~ + inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 600, "Point your web browser at http://localhost:#{args.state.port}/", 10, 1, 255, 255, 255] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.inputs.http_requests.each { |req|~ -- Inside source: true -*** True Line Result - args.inputs.http_requests.each { |req| -** Processing line: ~ puts("METHOD: #{req.method}");~ +** Processing line: ~ # Signal that the user is going to be removing walls~ - Inside source: true *** True Line Result - puts("METHOD: #{req.method}"); -** Processing line: ~ puts("URI: #{req.uri}");~ + # Signal that the user is going to be removing walls +** Processing line: ~ def wall_clicked?~ - Inside source: true *** True Line Result - puts("URI: #{req.uri}"); -** Processing line: ~ puts("HEADERS:");~ + def wall_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_a_wall?~ - Inside source: true *** True Line Result - puts("HEADERS:"); -** Processing line: ~ req.headers.each { |k,v| puts(" #{k}: #{v}") }~ + inputs.mouse.down && mouse_inside_a_wall? +** Processing line: ~ end~ - Inside source: true *** True Line Result - req.headers.each { |k,v| puts(" #{k}: #{v}") } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if (req.uri == '/')~ +** Processing line: ~ # Signal that the user is going to be adding walls~ - Inside source: true *** True Line Result - if (req.uri == '/') -** Processing line: ~ # headers and body can be nil if you don't care about them.~ + # Signal that the user is going to be adding walls +** Processing line: ~ def grid_clicked?~ - Inside source: true *** True Line Result - # headers and body can be nil if you don't care about them. -** Processing line: ~ # If you don't set the Content-Type, it will default to~ + def grid_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ - Inside source: true *** True Line Result - # If you don't set the Content-Type, it will default to -** Processing line: ~ # "text/html; charset=utf-8".~ + inputs.mouse.down && mouse_inside_grid? +** Processing line: ~ end~ - Inside source: true *** True Line Result - # "text/html; charset=utf-8". -** Processing line: ~ # Don't set Content-Length; we'll ignore it and calculate it for you~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Don't set Content-Length; we'll ignore it and calculate it for you -** Processing line: ~ args.state.reqnum += 1~ + +** Processing line: ~ # Returns whether the mouse is inside of a wall~ - Inside source: true *** True Line Result - args.state.reqnum += 1 -** Processing line: ~ req.respond 200, "hello

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

    \n", { 'X-DRGTK-header' => 'Powered by DragonRuby!' }~ + # Returns whether the mouse is inside of a wall +** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ - Inside source: true *** True Line Result - req.respond 200, "hello

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

    \n", { 'X-DRGTK-header' => 'Powered by DragonRuby!' } -** Processing line: ~ else~ + # Part of the condition that checks whether the user is removing a wall +** Processing line: ~ def mouse_inside_a_wall?~ - Inside source: true *** True Line Result - else -** Processing line: ~ req.reject~ + def mouse_inside_a_wall? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - req.reject + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ +- Inside source: true +*** True Line Result + return true if inputs.mouse.point.inside_rect?(scale_up(wall)) ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ }~ +** Processing line: ~~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** C Extensions - Basics - main.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ # Returns whether the mouse is inside of a grid~ +- Inside source: true *** True Line Result -*** C Extensions - Basics - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - + # Returns whether the mouse is inside of a grid +** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/12_c_extensions/01_basics/app/main.rb~ + # Part of the condition that checks whether the user is adding a wall +** Processing line: ~ def mouse_inside_grid?~ - Inside source: true *** True Line Result - # ./samples/12_c_extensions/01_basics/app/main.rb -** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ + def mouse_inside_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height]))~ - Inside source: true *** True Line Result - $gtk.ffi_misc.gtk_dlopen("ext") -** Processing line: ~ include FFI::CExt~ + inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height])) +** Processing line: ~ end~ - Inside source: true *** True Line Result - include FFI::CExt + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ # These methods provide handy aliases to colors~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.outputs.labels << [640, 500, "mouse.x = #{args.mouse.x.to_i}", 5, 1]~ + # These methods provide handy aliases to colors +** Processing line: ~~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 500, "mouse.x = #{args.mouse.x.to_i}", 5, 1] -** Processing line: ~ args.outputs.labels << [640, 460, "square(mouse.x) = #{square(args.mouse.x.to_i)}", 5, 1]~ + +** Processing line: ~ # Light brown~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 460, "square(mouse.x) = #{square(args.mouse.x.to_i)}", 5, 1] -** Processing line: ~ args.outputs.labels << [640, 420, "mouse.y = #{args.mouse.y.to_i}", 5, 1]~ + # Light brown +** Processing line: ~ def unvisited_color~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 420, "mouse.y = #{args.mouse.y.to_i}", 5, 1] -** Processing line: ~ args.outputs.labels << [640, 380, "square(mouse.y) = #{square(args.mouse.y.to_i)}", 5, 1]~ + def unvisited_color +** Processing line: ~ [221, 212, 213]~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 380, "square(mouse.y) = #{square(args.mouse.y.to_i)}", 5, 1] -** Processing line: ~ end~ + [221, 212, 213] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ # Black~ - 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. + # Black +** Processing line: ~ def grid_line_color~ +- Inside source: true *** True Line Result - -** Processing line: ~*** C Extensions - Intermediate - main.rb~ -- Header detected. + def grid_line_color +** Processing line: ~ [255, 255, 255]~ +- Inside source: true *** True Line Result - + [255, 255, 255] +** Processing line: ~ end~ +- Inside source: true *** True Line Result -*** C Extensions - Intermediate - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Dark Brown~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/12_c_extensions/02_intermediate/app/main.rb~ + # Dark Brown +** Processing line: ~ def visited_color~ - Inside source: true *** True Line Result - # ./samples/12_c_extensions/02_intermediate/app/main.rb -** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ + def visited_color +** Processing line: ~ [204, 191, 179]~ - Inside source: true *** True Line Result - $gtk.ffi_misc.gtk_dlopen("ext") -** Processing line: ~ include FFI::RE~ + [204, 191, 179] +** Processing line: ~ end~ - Inside source: true *** True Line Result - include FFI::RE + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def split_words(input)~ -- Inside source: true -*** True Line Result - def split_words(input) -** Processing line: ~ words = []~ +** Processing line: ~ # Blue~ - Inside source: true *** True Line Result - words = [] -** Processing line: ~ last = IntPointer.new~ + # Blue +** Processing line: ~ def frontier_color~ - Inside source: true *** True Line Result - last = IntPointer.new -** Processing line: ~ re = re_compile("\\w+")~ + def frontier_color +** Processing line: ~ [103, 136, 204]~ - Inside source: true *** True Line Result - re = re_compile("\\w+") -** Processing line: ~ first = re_matchp(re, input, last)~ + [103, 136, 204] +** Processing line: ~ end~ - Inside source: true *** True Line Result - first = re_matchp(re, input, last) -** Processing line: ~ while first != -1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - while first != -1 -** Processing line: ~ words << input.slice(first, last.value)~ + +** Processing line: ~ # Camo Green~ - Inside source: true *** True Line Result - words << input.slice(first, last.value) -** Processing line: ~ input = input.slice(last.value + first, input.length)~ + # Camo Green +** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result - input = input.slice(last.value + first, input.length) -** Processing line: ~ first = re_matchp(re, input, last)~ + def wall_color +** Processing line: ~ [134, 134, 120]~ - Inside source: true *** True Line Result - first = re_matchp(re, input, last) + [134, 134, 120] ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ words~ -- Inside source: true -*** True Line Result - words -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ # Next frontier to be expanded~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.outputs.labels << [640, 500, split_words("hello, dragonriders!").join(' '), 5, 1]~ + # Next frontier to be expanded +** Processing line: ~ def highlighter_yellow~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 500, split_words("hello, dragonriders!").join(' '), 5, 1] -** Processing line: ~ end~ + def highlighter_yellow +** Processing line: ~ [214, 231, 125]~ - Inside source: true *** True Line Result - end + [214, 231, 125] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ # The neighbors of the next frontier to be expanded~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + # The neighbors of the next frontier to be expanded +** Processing line: ~ def highlighter_green~ +- Inside source: true *** True Line Result - -** Processing line: ~*** C Extensions - Native Pixel Arrays - main.rb~ -- Header detected. + def highlighter_green +** Processing line: ~ [65, 191, 127]~ +- Inside source: true *** True Line Result - + [65, 191, 127] +** Processing line: ~ end~ +- Inside source: true *** True Line Result -*** C Extensions - Native Pixel Arrays - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Button background~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/12_c_extensions/03_native_pixel_arrays/app/main.rb~ + # Button background +** Processing line: ~ def gray~ - Inside source: true *** True Line Result - # ./samples/12_c_extensions/03_native_pixel_arrays/app/main.rb -** Processing line: ~ $gtk.ffi_misc.gtk_dlopen("ext")~ + def gray +** Processing line: ~ [190, 190, 190]~ - Inside source: true *** True Line Result - $gtk.ffi_misc.gtk_dlopen("ext") -** Processing line: ~ include FFI::CExt~ + [190, 190, 190] +** Processing line: ~ end~ - Inside source: true *** True Line Result - include FFI::CExt + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ # Button outline~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.state.rotation ||= 0~ + # Button outline +** Processing line: ~ def black~ - Inside source: true *** True Line Result - args.state.rotation ||= 0 -** Processing line: ~~ + def black +** Processing line: ~ [0, 0, 0]~ - Inside source: true *** True Line Result - -** Processing line: ~ update_scanner_texture # this calls into a C extension!~ + [0, 0, 0] +** Processing line: ~ end~ - Inside source: true *** True Line Result - update_scanner_texture # this calls into a C extension! + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # New/changed pixel arrays get uploaded to the GPU before we render~ +** Processing line: ~ # These methods make the code more concise~ - Inside source: true *** True Line Result - # New/changed pixel arrays get uploaded to the GPU before we render -** Processing line: ~ # anything. At that point, they can be scaled, rotated, and otherwise~ + # These methods make the code more concise +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - # anything. At that point, they can be scaled, rotated, and otherwise -** Processing line: ~ # used like any other sprite.~ + def grid +** Processing line: ~ state.grid~ - Inside source: true *** True Line Result - # used like any other sprite. -** Processing line: ~ w = 100~ + state.grid +** Processing line: ~ end~ - Inside source: true *** True Line Result - w = 100 -** Processing line: ~ h = 100~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - h = 100 -** Processing line: ~ x = (1280 - w) / 2~ + +** Processing line: ~ def buttons~ - Inside source: true *** True Line Result - x = (1280 - w) / 2 -** Processing line: ~ y = (720 - h) / 2~ + def buttons +** Processing line: ~ state.buttons~ - Inside source: true *** True Line Result - y = (720 - h) / 2 -** Processing line: ~ args.outputs.background_color = [64, 0, 128]~ + state.buttons +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.background_color = [64, 0, 128] -** Processing line: ~ args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.outputs.primitives << [x, y, w, h, :scanner, args.state.rotation].sprite -** Processing line: ~ args.state.rotation += 1~ + +** Processing line: ~ def slider~ - Inside source: true *** True Line Result - args.state.rotation += 1 -** Processing line: ~~ + def slider +** Processing line: ~ state.slider~ - Inside source: true *** True Line Result - -** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ + state.slider +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.primitives << args.gtk.current_framerate_primitives + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -59824,130 +68239,106 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Path Finding Algorithms - Breadth First Search - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Path Finding Algorithms - Breadth First Search - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. +** Processing line: ~ def tick args~ +- Inside source: true *** True Line Result - + def tick args +** Processing line: ~ # Pressing r resets the program~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/13_path_finding_algorithms/01_breadth_first_search/app/main.rb~ + # Pressing r resets the program +** Processing line: ~ if args.inputs.keyboard.key_down.r~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/01_breadth_first_search/app/main.rb -** Processing line: ~ # A visual demonstration of a breadth first search~ + if args.inputs.keyboard.key_down.r +** Processing line: ~ args.gtk.reset~ - Inside source: true *** True Line Result - # A visual demonstration of a breadth first search -** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ + args.gtk.reset +** Processing line: ~ reset~ - Inside source: true *** True Line Result - # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ + reset +** Processing line: ~ return~ - Inside source: true *** True Line Result - -** Processing line: ~ # An animation that can respond to user input in real time~ + return +** Processing line: ~ end~ - Inside source: true *** True Line Result - # An animation that can respond to user input in real time + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # A breadth first search expands in all directions one step at a time~ +** Processing line: ~ $detailed_breadth_first_search ||= DetailedBreadthFirstSearch.new(args)~ - Inside source: true *** True Line Result - # A breadth first search expands in all directions one step at a time -** Processing line: ~ # The frontier is a queue of cells to be expanded from~ + $detailed_breadth_first_search ||= DetailedBreadthFirstSearch.new(args) +** Processing line: ~ $detailed_breadth_first_search.args = args~ - Inside source: true *** True Line Result - # The frontier is a queue of cells to be expanded from -** Processing line: ~ # The visited hash allows quick lookups of cells that have been expanded from~ + $detailed_breadth_first_search.args = args +** Processing line: ~ $detailed_breadth_first_search.tick~ - Inside source: true *** True Line Result - # The visited hash allows quick lookups of cells that have been expanded from -** Processing line: ~ # The walls hash allows quick lookup of whether a cell is a wall~ + $detailed_breadth_first_search.tick +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The walls hash allows quick lookup of whether a cell is a wall + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The breadth first search starts by adding the red star to the frontier array~ -- Inside source: true -*** True Line Result - # The breadth first search starts by adding the red star to the frontier array -** Processing line: ~ # and marking it as visited~ +** Processing line: ~~ - Inside source: true *** True Line Result - # and marking it as visited -** Processing line: ~ # Each step a cell is removed from the front of the frontier array (queue)~ + +** Processing line: ~ def reset~ - Inside source: true *** True Line Result - # Each step a cell is removed from the front of the frontier array (queue) -** Processing line: ~ # Unless the neighbor is a wall or visited, it is added to the frontier array~ + def reset +** Processing line: ~ $detailed_breadth_first_search = nil~ - Inside source: true *** True Line Result - # Unless the neighbor is a wall or visited, it is added to the frontier array -** Processing line: ~ # The neighbor is then marked as visited~ + $detailed_breadth_first_search = nil +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The neighbor is then marked as visited + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The frontier is blue~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - # The frontier is blue -** Processing line: ~ # Visited cells are light brown~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - # Visited cells are light brown -** Processing line: ~ # Walls are camo green~ -- Inside source: true + +** Processing line: ~*** Path Finding Algorithms - Breadcrumbs - main.rb~ +- Header detected. *** True Line Result - # Walls are camo green -** Processing line: ~ # Even when walls are visited, they will maintain their wall color~ -- Inside source: true + *** True Line Result - # Even when walls are visited, they will maintain their wall color -** Processing line: ~~ -- Inside source: true +*** Path Finding Algorithms - Breadcrumbs - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result -** Processing line: ~ # The star can be moved by clicking and dragging~ -- Inside source: true *** True Line Result - # The star can be moved by clicking and dragging -** Processing line: ~ # Walls can be added and removed by clicking and dragging~ -- Inside source: true -*** True Line Result - # Walls can be added and removed by clicking and dragging -** Processing line: ~~ +#+begin_src ruby +** Processing line: ~ # ./samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb~ - Inside source: true *** True Line Result - -** Processing line: ~ class BreadthFirstSearch~ + # ./samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb +** Processing line: ~ class Breadcrumbs~ - Inside source: true *** True Line Result - class BreadthFirstSearch + class Breadcrumbs ** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result @@ -59956,98 +68347,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def initialize(args)~ -- Inside source: true -*** True Line Result - def initialize(args) -** Processing line: ~ # Variables to edit the size and appearance of the grid~ +** Processing line: ~ # This method is called every frame/tick~ - Inside source: true *** True Line Result - # Variables to edit the size and appearance of the grid -** Processing line: ~ # Freely customizable to user's liking~ + # This method is called every frame/tick +** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ - Inside source: true *** True Line Result - # Freely customizable to user's liking -** Processing line: ~ args.state.grid.width = 30~ + # Every tick, the current state of the search is rendered on the screen, +** Processing line: ~ # User input is processed, and~ - Inside source: true *** True Line Result - args.state.grid.width = 30 -** Processing line: ~ args.state.grid.height = 15~ + # User input is processed, and +** Processing line: ~ # The next step in the search is calculated~ - Inside source: true *** True Line Result - args.state.grid.height = 15 -** Processing line: ~ args.state.grid.cell_size = 40~ + # The next step in the search is calculated +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - args.state.grid.cell_size = 40 -** Processing line: ~~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - -** Processing line: ~ # Stores which step of the animation is being rendered~ + defaults +** Processing line: ~ # If the grid has not been searched~ - Inside source: true *** True Line Result - # Stores which step of the animation is being rendered -** Processing line: ~ # When the user moves the star or messes with the walls,~ + # If the grid has not been searched +** Processing line: ~ if search.came_from.empty?~ - Inside source: true *** True Line Result - # When the user moves the star or messes with the walls, -** Processing line: ~ # the breadth first search is recalculated up to this step~ + if search.came_from.empty? +** Processing line: ~ calc~ - Inside source: true *** True Line Result - # the breadth first search is recalculated up to this step -** Processing line: ~ args.state.anim_steps = 0~ + calc +** Processing line: ~ # Calc Path~ - Inside source: true *** True Line Result - args.state.anim_steps = 0 -** Processing line: ~~ + # Calc Path +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # At some step the animation will end,~ + end +** Processing line: ~ render~ - Inside source: true *** True Line Result - # At some step the animation will end, -** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ + render +** Processing line: ~ input~ - Inside source: true *** True Line Result - # and further steps won't change anything (the whole grid will be explored) -** Processing line: ~ # This step is roughly the grid's width * height~ + input +** Processing line: ~ end~ - Inside source: true *** True Line Result - # This step is roughly the grid's width * height -** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # When anim_steps equals max_steps no more calculations will occur -** Processing line: ~ # and the slider will be at the end~ + +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - # and the slider will be at the end -** Processing line: ~ args.state.max_steps = args.state.grid.width * args.state.grid.height~ + def defaults +** Processing line: ~ # Variables to edit the size and appearance of the grid~ - Inside source: true *** True Line Result - args.state.max_steps = args.state.grid.width * args.state.grid.height -** Processing line: ~~ + # Variables to edit the size and appearance of the grid +** Processing line: ~ # Freely customizable to user's liking~ - Inside source: true *** True Line Result - -** Processing line: ~ # Whether the animation should play or not~ + # Freely customizable to user's liking +** Processing line: ~ grid.width ||= 30~ - Inside source: true *** True Line Result - # Whether the animation should play or not -** Processing line: ~ # If true, every tick moves anim_steps forward one~ + grid.width ||= 30 +** Processing line: ~ grid.height ||= 15~ - Inside source: true *** True Line Result - # If true, every tick moves anim_steps forward one -** Processing line: ~ # Pressing the stepwise animation buttons will pause the animation~ + grid.height ||= 15 +** Processing line: ~ grid.cell_size ||= 40~ - Inside source: true *** True Line Result - # Pressing the stepwise animation buttons will pause the animation -** Processing line: ~ args.state.play = true~ + grid.cell_size ||= 40 +** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result - args.state.play = true + grid.rect ||= [0, 0, grid.width, grid.height] ** Processing line: ~~ - Inside source: true *** True Line Result @@ -60064,14 +68451,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Walls are stored in a hash for quick look up when doing the search -** Processing line: ~ args.state.star = [0, 0]~ +** Processing line: ~ grid.star ||= [2, 8]~ - Inside source: true *** True Line Result - args.state.star = [0, 0] -** Processing line: ~ args.state.walls = {~ + grid.star ||= [2, 8] +** Processing line: ~ grid.target ||= [10, 5]~ - Inside source: true *** True Line Result - args.state.walls = { + grid.target ||= [10, 5] +** Processing line: ~ grid.walls ||= {~ +- Inside source: true +*** True Line Result + grid.walls ||= { ** Processing line: ~ [3, 3] => true,~ - Inside source: true *** True Line Result @@ -60144,10 +68535,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [4, 11] => true, -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ [13, 0] => true,~ - Inside source: true *** True Line Result @@ -60236,10 +68623,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [14, 10] => true, -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ [21, 8] => true,~ - Inside source: true *** True Line Result @@ -60344,370 +68727,154 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # from the center outward -** Processing line: ~ args.state.visited = {}~ -- Inside source: true -*** True Line Result - args.state.visited = {} -** Processing line: ~ args.state.frontier = []~ -- Inside source: true -*** True Line Result - args.state.frontier = [] -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # What the user is currently editing on the grid~ -- Inside source: true -*** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # Possible values are: :none, :slider, :star, :remove_wall, :add_wall~ -- Inside source: true -*** True Line Result - # Possible values are: :none, :slider, :star, :remove_wall, :add_wall -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # We store this value, because we want to remember the value even when~ -- Inside source: true -*** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ -- Inside source: true -*** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ -- Inside source: true -*** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ args.state.click_and_drag = :none~ -- Inside source: true -*** True Line Result - args.state.click_and_drag = :none -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Store the rects of the buttons that control the animation~ -- Inside source: true -*** True Line Result - # Store the rects of the buttons that control the animation -** Processing line: ~ # They are here for user customization~ -- Inside source: true -*** True Line Result - # They are here for user customization -** Processing line: ~ # Editing these might require recentering the text inside them~ -- Inside source: true -*** True Line Result - # Editing these might require recentering the text inside them -** Processing line: ~ # Those values can be found in the render_button methods~ -- Inside source: true -*** True Line Result - # Those values can be found in the render_button methods -** Processing line: ~ args.state.buttons.left = [450, 600, 50, 50]~ -- Inside source: true -*** True Line Result - args.state.buttons.left = [450, 600, 50, 50] -** Processing line: ~ args.state.buttons.center = [500, 600, 200, 50]~ -- Inside source: true -*** True Line Result - args.state.buttons.center = [500, 600, 200, 50] -** Processing line: ~ args.state.buttons.right = [700, 600, 50, 50]~ -- Inside source: true -*** True Line Result - args.state.buttons.right = [700, 600, 50, 50] -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The variables below are related to the slider~ -- Inside source: true -*** True Line Result - # The variables below are related to the slider -** Processing line: ~ # They allow the user to customize them~ -- Inside source: true -*** True Line Result - # They allow the user to customize them -** Processing line: ~ # They also give a central location for the render and input methods to get~ -- Inside source: true -*** True Line Result - # They also give a central location for the render and input methods to get -** Processing line: ~ # information from~ -- Inside source: true -*** True Line Result - # information from -** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ -- Inside source: true -*** True Line Result - # x & y are the coordinates of the leftmost part of the slider line -** Processing line: ~ args.state.slider.x = 400~ -- Inside source: true -*** True Line Result - args.state.slider.x = 400 -** Processing line: ~ args.state.slider.y = 675~ -- Inside source: true -*** True Line Result - args.state.slider.y = 675 -** Processing line: ~ # This is the width of the line~ -- Inside source: true -*** True Line Result - # This is the width of the line -** Processing line: ~ args.state.slider.w = 360~ -- Inside source: true -*** True Line Result - args.state.slider.w = 360 -** Processing line: ~ # This is the offset for the circle~ -- Inside source: true -*** True Line Result - # This is the offset for the circle -** Processing line: ~ # Allows the center of the circle to be on the line,~ -- Inside source: true -*** True Line Result - # Allows the center of the circle to be on the line, -** Processing line: ~ # as opposed to the upper right corner~ -- Inside source: true -*** True Line Result - # as opposed to the upper right corner -** Processing line: ~ args.state.slider.offset = 20~ -- Inside source: true -*** True Line Result - args.state.slider.offset = 20 -** Processing line: ~ # This is the spacing between each of the notches on the slider~ -- Inside source: true -*** True Line Result - # This is the spacing between each of the notches on the slider -** Processing line: ~ # Notches are places where the circle can rest on the slider line~ -- Inside source: true -*** True Line Result - # Notches are places where the circle can rest on the slider line -** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ -- Inside source: true -*** True Line Result - # There needs to be a notch for each step before the maximum number of steps -** Processing line: ~ args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f~ -- Inside source: true -*** True Line Result - args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # This method is called every frame/tick~ -- Inside source: true -*** True Line Result - # This method is called every frame/tick -** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ -- Inside source: true -*** True Line Result - # Every tick, the current state of the search is rendered on the screen, -** Processing line: ~ # User input is processed, and~ -- Inside source: true -*** True Line Result - # User input is processed, and -** Processing line: ~ # The next step in the search is calculated~ -- Inside source: true -*** True Line Result - # The next step in the search is calculated -** Processing line: ~ def tick~ -- Inside source: true -*** True Line Result - def tick -** Processing line: ~ render~ -- Inside source: true -*** True Line Result - render -** Processing line: ~ input~ -- Inside source: true -*** True Line Result - input -** Processing line: ~ # If animation is playing, and max steps have not been reached~ -- Inside source: true -*** True Line Result - # If animation is playing, and max steps have not been reached -** Processing line: ~ # Move the search a step forward~ -- Inside source: true -*** True Line Result - # Move the search a step forward -** Processing line: ~ if state.play && state.anim_steps < state.max_steps~ -- Inside source: true -*** True Line Result - if state.play && state.anim_steps < state.max_steps -** Processing line: ~ # Variable that tells the program what step to recalculate up to~ -- Inside source: true -*** True Line Result - # Variable that tells the program what step to recalculate up to -** Processing line: ~ state.anim_steps += 1~ -- Inside source: true -*** True Line Result - state.anim_steps += 1 -** Processing line: ~ calc~ -- Inside source: true -*** True Line Result - calc -** Processing line: ~ end~ +** Processing line: ~ # The cells from which the search is to expand~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # The cells from which the search is to expand +** Processing line: ~ search.frontier ||= []~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + search.frontier ||= [] +** Processing line: ~ # A hash of where each cell was expanded from~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws everything onto the screen~ + # A hash of where each cell was expanded from +** Processing line: ~ # The key is a cell, and the value is the cell it came from~ - Inside source: true *** True Line Result - # Draws everything onto the screen -** Processing line: ~ def render~ + # The key is a cell, and the value is the cell it came from +** Processing line: ~ search.came_from ||= {}~ - Inside source: true *** True Line Result - def render -** Processing line: ~ render_buttons~ + search.came_from ||= {} +** Processing line: ~ # Cells that are part of the path from the target to the star~ - Inside source: true *** True Line Result - render_buttons -** Processing line: ~ render_slider~ + # Cells that are part of the path from the target to the star +** Processing line: ~ search.path ||= {}~ - Inside source: true *** True Line Result - render_slider + search.path ||= {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ render_background~ -- Inside source: true -*** True Line Result - render_background -** Processing line: ~ render_visited~ -- Inside source: true -*** True Line Result - render_visited -** Processing line: ~ render_frontier~ -- Inside source: true -*** True Line Result - render_frontier -** Processing line: ~ render_walls~ -- Inside source: true -*** True Line Result - render_walls -** Processing line: ~ render_star~ +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - render_star -** Processing line: ~ end~ + # What the user is currently editing on the grid +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - -** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - # The methods below subdivide the task of drawing everything to the screen -** Processing line: ~~ + # they are still clicking down on the mouse. +** Processing line: ~ state.current_input ||= :none~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws the buttons that control the animation step and state~ + state.current_input ||= :none +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Draws the buttons that control the animation step and state -** Processing line: ~ def render_buttons~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def render_buttons -** Processing line: ~ render_left_button~ + +** Processing line: ~ def calc~ - Inside source: true *** True Line Result - render_left_button -** Processing line: ~ render_center_button~ + def calc +** Processing line: ~ # Setup the search to start from the star~ - Inside source: true *** True Line Result - render_center_button -** Processing line: ~ render_right_button~ + # Setup the search to start from the star +** Processing line: ~ search.frontier << grid.star~ - Inside source: true *** True Line Result - render_right_button -** Processing line: ~ end~ + search.frontier << grid.star +** Processing line: ~ search.came_from[grid.star] = nil~ - Inside source: true *** True Line Result - end + search.came_from[grid.star] = nil ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Draws the button which steps the search backward~ +** Processing line: ~ # Until there are no more cells to expand from~ - Inside source: true *** True Line Result - # Draws the button which steps the search backward -** Processing line: ~ # Shows the user where to click to move the search backward~ + # Until there are no more cells to expand from +** Processing line: ~ until search.frontier.empty?~ - Inside source: true *** True Line Result - # Shows the user where to click to move the search backward -** Processing line: ~ def render_left_button~ + until search.frontier.empty? +** Processing line: ~ # Takes the next frontier cell~ - Inside source: true *** True Line Result - def render_left_button -** Processing line: ~ # Draws the gray button, and a black border~ + # Takes the next frontier cell +** Processing line: ~ new_frontier = search.frontier.shift~ - Inside source: true *** True Line Result - # Draws the gray button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + new_frontier = search.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.left, gray]~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - outputs.solids << [buttons.left, gray] -** Processing line: ~ outputs.borders << [buttons.left, black]~ + adjacent_neighbors(new_frontier).each do |neighbor| +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - outputs.borders << [buttons.left, black] -** Processing line: ~~ + # That have not been visited and are not walls +** Processing line: ~ unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders an explanatory label in the center of the button~ + unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + # Add them to the frontier and mark them as visited in the first grid +** Processing line: ~ # Unless the target has been visited~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ + # Unless the target has been visited +** Processing line: ~ # Add the neighbor to the frontier and remember which cell it came from~ - Inside source: true *** True Line Result - # If the button size is changed, the label might need to be edited as well -** Processing line: ~ # to keep the label in the center of the button~ + # Add the neighbor to the frontier and remember which cell it came from +** Processing line: ~ search.frontier << neighbor~ - Inside source: true *** True Line Result - # to keep the label in the center of the button -** Processing line: ~ label_x = buttons.left.x + 20~ + search.frontier << neighbor +** Processing line: ~ search.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - label_x = buttons.left.x + 20 -** Processing line: ~ label_y = buttons.left.y + 35~ + search.came_from[neighbor] = new_frontier +** Processing line: ~ end~ - Inside source: true *** True Line Result - label_y = buttons.left.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, "<"]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, "<"] + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -60716,62 +68883,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_center_button~ +** Processing line: ~~ - Inside source: true *** True Line Result - def render_center_button -** Processing line: ~ # Draws the gray button, and a black border~ + +** Processing line: ~ # Draws everything onto the screen~ - Inside source: true *** True Line Result - # Draws the gray button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + # Draws everything onto the screen +** Processing line: ~ def render~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.center, gray]~ + def render +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - outputs.solids << [buttons.center, gray] -** Processing line: ~ outputs.borders << [buttons.center, black]~ + render_background +** Processing line: ~ # render_heat_map~ - Inside source: true *** True Line Result - outputs.borders << [buttons.center, black] -** Processing line: ~~ + # render_heat_map +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders an explanatory label in the center of the button~ + render_walls +** Processing line: ~ # render_path~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + # render_path +** Processing line: ~ # render_labels~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ + # render_labels +** Processing line: ~ render_arrows~ - Inside source: true *** True Line Result - # If the button size is changed, the label might need to be edited as well -** Processing line: ~ # to keep the label in the center of the button~ + render_arrows +** Processing line: ~ render_star~ - Inside source: true *** True Line Result - # to keep the label in the center of the button -** Processing line: ~ label_x = buttons.center.x + 37~ + render_star +** Processing line: ~ render_target~ - Inside source: true *** True Line Result - label_x = buttons.center.x + 37 -** Processing line: ~ label_y = buttons.center.y + 35~ + render_target +** Processing line: ~ unless grid.walls.has_key?(grid.target)~ - Inside source: true *** True Line Result - label_y = buttons.center.y + 35 -** Processing line: ~ label_text = state.play ? "Pause Animation" : "Play Animation"~ + unless grid.walls.has_key?(grid.target) +** Processing line: ~ render_trail~ - Inside source: true *** True Line Result - label_text = state.play ? "Pause Animation" : "Play Animation" -** Processing line: ~ outputs.labels << [label_x, label_y, label_text]~ + render_trail +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, label_text] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -60780,106 +68947,110 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_right_button~ +** Processing line: ~ def render_trail(current_cell=grid.target)~ - Inside source: true *** True Line Result - def render_right_button -** Processing line: ~ # Draws the gray button, and a black border~ + def render_trail(current_cell=grid.target) +** Processing line: ~ return if current_cell == grid.star~ - Inside source: true *** True Line Result - # Draws the gray button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + return if current_cell == grid.star +** Processing line: ~ parent_cell = search.came_from[current_cell]~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.right, gray]~ + parent_cell = search.came_from[current_cell] +** Processing line: ~ if current_cell && parent_cell~ - Inside source: true *** True Line Result - outputs.solids << [buttons.right, gray] -** Processing line: ~ outputs.borders << [buttons.right, black]~ + if current_cell && parent_cell +** Processing line: ~ outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size,~ - Inside source: true *** True Line Result - outputs.borders << [buttons.right, black] + outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size, +** Processing line: ~ (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple]~ +- Inside source: true +*** True Line Result + (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders an explanatory label in the center of the button~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + end +** Processing line: ~ render_trail(parent_cell)~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ label_x = buttons.right.x + 20~ + render_trail(parent_cell) +** Processing line: ~ end~ - Inside source: true *** True Line Result - label_x = buttons.right.x + 20 -** Processing line: ~ label_y = buttons.right.y + 35~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - label_y = buttons.right.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, ">"]~ + +** Processing line: ~ def render_arrows~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, ">"] -** Processing line: ~ end~ + def render_arrows +** Processing line: ~ search.came_from.each do |child, parent|~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + search.came_from.each do |child, parent| +** Processing line: ~ if parent && child~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws the slider so the user can move it and see the progress of the search~ + if parent && child +** Processing line: ~ arrow_cell = [(child.x + parent.x) / 2, (child.y + parent.y) / 2]~ - Inside source: true *** True Line Result - # Draws the slider so the user can move it and see the progress of the search -** Processing line: ~ def render_slider~ + arrow_cell = [(child.x + parent.x) / 2, (child.y + parent.y) / 2] +** Processing line: ~ if parent.x > child.x # If the parent cell is to the right of the child cell~ - Inside source: true *** True Line Result - def render_slider -** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ + if parent.x > child.x # If the parent cell is to the right of the child cell +** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 0] # Point the arrow to the right~ - Inside source: true *** True Line Result - # Using primitives hides the line under the white circle of the slider -** Processing line: ~ # Draws the line~ + outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 0] # Point the arrow to the right +** Processing line: ~ elsif parent.x < child.x # If the parent cell is to the right of the child cell~ - Inside source: true *** True Line Result - # Draws the line -** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ + elsif parent.x < child.x # If the parent cell is to the right of the child cell +** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 180] # Point the arrow to the right~ - Inside source: true *** True Line Result - outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line -** Processing line: ~ # The circle needs to be offset so that the center of the circle~ + outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 180] # Point the arrow to the right +** Processing line: ~ elsif parent.y > child.y # If the parent cell is to the right of the child cell~ - Inside source: true *** True Line Result - # The circle needs to be offset so that the center of the circle -** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ + elsif parent.y > child.y # If the parent cell is to the right of the child cell +** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 90] # Point the arrow to the right~ - Inside source: true *** True Line Result - # overlaps the line instead of the upper right corner of the circle -** Processing line: ~ # The circle's x value is also moved based on the current seach step~ + outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 90] # Point the arrow to the right +** Processing line: ~ elsif parent.y < child.y # If the parent cell is to the right of the child cell~ - Inside source: true *** True Line Result - # The circle's x value is also moved based on the current seach step -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ + elsif parent.y < child.y # If the parent cell is to the right of the child cell +** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 270] # Point the arrow to the right~ - Inside source: true *** True Line Result - circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ + outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 270] # Point the arrow to the right +** Processing line: ~ end~ - Inside source: true *** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.primitives << [circle_rect, 'circle-white.png'].sprite + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -60888,6 +69059,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ +- Inside source: true +*** True Line Result + # The methods below subdivide the task of drawing everything to the screen +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ # Draws what the grid looks like with nothing on it~ - Inside source: true *** True Line Result @@ -60912,18 +69091,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws a rectangle the size of the entire grid to represent unvisited cells~ +** Processing line: ~ # Draws both grids~ - Inside source: true *** True Line Result - # Draws a rectangle the size of the entire grid to represent unvisited cells + # Draws both grids ** Processing line: ~ def render_unvisited~ - Inside source: true *** True Line Result def render_unvisited -** Processing line: ~ outputs.solids << [scale_up([0, 0, grid.width, grid.height]), unvisited_color]~ +** Processing line: ~ outputs.solids << [scale_up(grid.rect), unvisited_color]~ - Inside source: true *** True Line Result - outputs.solids << [scale_up([0, 0, grid.width, grid.height]), unvisited_color] + outputs.solids << [scale_up(grid.rect), unvisited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61016,26 +69195,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the area that is going to be searched from~ -- Inside source: true -*** True Line Result - # Draws the area that is going to be searched from -** Processing line: ~ # The frontier is the most outward parts of the search~ +** Processing line: ~ # Draws the walls on both grids~ - Inside source: true *** True Line Result - # The frontier is the most outward parts of the search -** Processing line: ~ def render_frontier~ + # Draws the walls on both grids +** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result - def render_frontier -** Processing line: ~ outputs.solids << state.frontier.map do |cell|~ + def render_walls +** Processing line: ~ grid.walls.each_key do |wall|~ - Inside source: true *** True Line Result - outputs.solids << state.frontier.map do |cell| -** Processing line: ~ [scale_up([cell.x, cell.y]), frontier_color]~ + grid.walls.each_key do |wall| +** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - [scale_up([cell.x, cell.y]), frontier_color] + outputs.solids << [scale_up(wall), wall_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61048,26 +69223,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the walls~ +** Processing line: ~ # Renders the star on both grids~ - Inside source: true *** True Line Result - # Draws the walls -** Processing line: ~ def render_walls~ + # Renders the star on both grids +** Processing line: ~ def render_star~ - Inside source: true *** True Line Result - def render_walls -** Processing line: ~ outputs.solids << state.walls.map do |wall|~ + def render_star +** Processing line: ~ outputs.sprites << [scale_up(grid.star), 'star.png']~ - Inside source: true *** True Line Result - outputs.solids << state.walls.map do |wall| -** Processing line: ~ [scale_up([wall.x, wall.y]), wall_color]~ + outputs.sprites << [scale_up(grid.star), 'star.png'] +** Processing line: ~ end~ - Inside source: true *** True Line Result - [scale_up([wall.x, wall.y]), wall_color] -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ # Renders the target on both grids~ +- Inside source: true +*** True Line Result + # Renders the target on both grids +** Processing line: ~ def render_target~ +- Inside source: true +*** True Line Result + def render_target +** Processing line: ~ outputs.sprites << [scale_up(grid.target), 'target.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [scale_up(grid.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61076,22 +69263,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders cells that have been searched in the appropriate color~ +** Processing line: ~ # Labels the grids~ - Inside source: true *** True Line Result - # Renders cells that have been searched in the appropriate color -** Processing line: ~ def render_visited~ + # Labels the grids +** Processing line: ~ def render_labels~ - Inside source: true *** True Line Result - def render_visited -** Processing line: ~ outputs.solids << state.visited.map do |cell|~ + def render_labels +** Processing line: ~ outputs.labels << [200, 625, "Without early exit"]~ - Inside source: true *** True Line Result - outputs.solids << state.visited.map do |cell| -** Processing line: ~ [scale_up([cell.x, cell.y]), visited_color]~ + outputs.labels << [200, 625, "Without early exit"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - [scale_up([cell.x, cell.y]), visited_color] + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Renders the path based off of the search.path hash~ +- Inside source: true +*** True Line Result + # Renders the path based off of the search.path hash +** Processing line: ~ def render_path~ +- Inside source: true +*** True Line Result + def render_path +** Processing line: ~ # If the star and target are disconnected there will only be one path~ +- Inside source: true +*** True Line Result + # If the star and target are disconnected there will only be one path +** Processing line: ~ # The path should not render in that case~ +- Inside source: true +*** True Line Result + # The path should not render in that case +** Processing line: ~ unless search.path.size == 1~ +- Inside source: true +*** True Line Result + unless search.path.size == 1 +** Processing line: ~ search.path.each_key do | cell |~ +- Inside source: true +*** True Line Result + search.path.each_key do | cell | +** Processing line: ~ # Renders path on both grids~ +- Inside source: true +*** True Line Result + # Renders path on both grids +** Processing line: ~ outputs.solids << [scale_up(cell), path_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [scale_up(cell), path_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61104,18 +69331,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the star~ +** Processing line: ~ # Calculates the path from the target to the star after the search is over~ - Inside source: true *** True Line Result - # Renders the star -** Processing line: ~ def render_star~ + # Calculates the path from the target to the star after the search is over +** Processing line: ~ # Relies on the came_from hash~ - Inside source: true *** True Line Result - def render_star -** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ + # Relies on the came_from hash +** Processing line: ~ # Fills the search.path hash, which is later rendered on screen~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(state.star), 'star.png'] + # Fills the search.path hash, which is later rendered on screen +** Processing line: ~ def calc_path~ +- Inside source: true +*** True Line Result + def calc_path +** Processing line: ~ endpoint = grid.target~ +- Inside source: true +*** True Line Result + endpoint = grid.target +** Processing line: ~ while endpoint~ +- Inside source: true +*** True Line Result + while endpoint +** Processing line: ~ search.path[endpoint] = true~ +- Inside source: true +*** True Line Result + search.path[endpoint] = true +** Processing line: ~ endpoint = search.came_from[endpoint]~ +- Inside source: true +*** True Line Result + endpoint = search.came_from[endpoint] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61220,110 +69471,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # This method processes user input every tick -** Processing line: ~ # This method allows the user to use the buttons, slider, and edit the grid~ -- Inside source: true -*** True Line Result - # This method allows the user to use the buttons, slider, and edit the grid -** Processing line: ~ # There are 2 types of input:~ -- Inside source: true -*** True Line Result - # There are 2 types of input: -** Processing line: ~ # Button Input~ -- Inside source: true -*** True Line Result - # Button Input -** Processing line: ~ # Click and Drag Input~ -- Inside source: true -*** True Line Result - # Click and Drag Input -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # Button Input is used for the backward step and forward step buttons~ -- Inside source: true -*** True Line Result - # Button Input is used for the backward step and forward step buttons -** Processing line: ~ # Input is detected by mouse up within the bounds of the rect~ -- Inside source: true -*** True Line Result - # Input is detected by mouse up within the bounds of the rect -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # Click and Drag Input is used for moving the star, adding walls,~ -- Inside source: true -*** True Line Result - # Click and Drag Input is used for moving the star, adding walls, -** Processing line: ~ # removing walls, and the slider~ -- Inside source: true -*** True Line Result - # removing walls, and the slider -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # When the mouse is down on the star, the click_and_drag variable is set to :star~ -- Inside source: true -*** True Line Result - # When the mouse is down on the star, the click_and_drag variable is set to :star -** Processing line: ~ # While click_and_drag equals :star, the cursor's position is used to calculate the~ -- Inside source: true -*** True Line Result - # While click_and_drag equals :star, the cursor's position is used to calculate the -** Processing line: ~ # appropriate drag behavior~ -- Inside source: true -*** True Line Result - # appropriate drag behavior -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # When the mouse goes up click_and_drag is set to :none~ -- Inside source: true -*** True Line Result - # When the mouse goes up click_and_drag is set to :none -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # A variable has to be used because the star has to continue being edited even~ -- Inside source: true -*** True Line Result - # A variable has to be used because the star has to continue being edited even -** Processing line: ~ # when the cursor is no longer over the star~ -- Inside source: true -*** True Line Result - # when the cursor is no longer over the star -** Processing line: ~ #~ +** Processing line: ~ # Any method with "1" is related to the first grid~ - Inside source: true *** True Line Result - # -** Processing line: ~ # Similar things occur for the other Click and Drag inputs~ + # Any method with "1" is related to the first grid +** Processing line: ~ # Any method with "2" is related to the second grid~ - Inside source: true *** True Line Result - # Similar things occur for the other Click and Drag inputs + # Any method with "2" is related to the second grid ** Processing line: ~ def input~ - Inside source: true *** True Line Result def input -** Processing line: ~ # Checks whether any of the buttons are being clicked~ -- Inside source: true -*** True Line Result - # Checks whether any of the buttons are being clicked -** Processing line: ~ input_buttons~ -- Inside source: true -*** True Line Result - input_buttons -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The detection and processing of click and drag inputs are separate~ -- Inside source: true -*** True Line Result - # The detection and processing of click and drag inputs are separate ** Processing line: ~ # The program has to remember that the user is dragging an object~ - Inside source: true *** True Line Result @@ -61332,78 +69491,78 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # even when the mouse is no longer over that object -** Processing line: ~ detect_click_and_drag~ +** Processing line: ~ # So detecting input and processing input is separate~ - Inside source: true *** True Line Result - detect_click_and_drag -** Processing line: ~ process_click_and_drag~ + # So detecting input and processing input is separate +** Processing line: ~ # detect_input~ - Inside source: true *** True Line Result - process_click_and_drag -** Processing line: ~ end~ + # detect_input +** Processing line: ~ # process_input~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # process_input +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - -** Processing line: ~ # Detects and Process input for each button~ + if inputs.mouse.up +** Processing line: ~ state.current_input = :none~ - Inside source: true *** True Line Result - # Detects and Process input for each button -** Processing line: ~ def input_buttons~ + state.current_input = :none +** Processing line: ~ elsif star_clicked?~ - Inside source: true *** True Line Result - def input_buttons -** Processing line: ~ input_left_button~ + elsif star_clicked? +** Processing line: ~ state.current_input = :star~ - Inside source: true *** True Line Result - input_left_button -** Processing line: ~ input_center_button~ + state.current_input = :star +** Processing line: ~ end~ - Inside source: true *** True Line Result - input_center_button -** Processing line: ~ input_next_step_button~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - input_next_step_button -** Processing line: ~ end~ + +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if mouse_inside_grid? +** Processing line: ~ unless grid.target == cell_closest_to_mouse~ - Inside source: true *** True Line Result - -** Processing line: ~ # Checks if the previous step button is clicked~ + unless grid.target == cell_closest_to_mouse +** Processing line: ~ grid.target = cell_closest_to_mouse~ - Inside source: true *** True Line Result - # Checks if the previous step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ + grid.target = cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If it is, it pauses the animation and moves the search one step backward -** Processing line: ~ def input_left_button~ + end +** Processing line: ~ if state.current_input == :star~ - Inside source: true *** True Line Result - def input_left_button -** Processing line: ~ if left_button_clicked?~ + if state.current_input == :star +** Processing line: ~ unless grid.star == cell_closest_to_mouse~ - Inside source: true *** True Line Result - if left_button_clicked? -** Processing line: ~ state.play = false~ + unless grid.star == cell_closest_to_mouse +** Processing line: ~ grid.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - state.play = false -** Processing line: ~ state.anim_steps -= 1~ + grid.star = cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.anim_steps -= 1 -** Processing line: ~ recalculate~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - recalculate + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61416,134 +69575,134 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Controls the play/pause button~ +** Processing line: ~ # Determines what the user is editing and stores the value~ - Inside source: true *** True Line Result - # Controls the play/pause button -** Processing line: ~ # Inverses whether the animation is playing or not when clicked~ + # Determines what the user is editing and stores the value +** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ - Inside source: true *** True Line Result - # Inverses whether the animation is playing or not when clicked -** Processing line: ~ def input_center_button~ + # Storing the value allows the user to continue the same edit as long as the +** Processing line: ~ # mouse left click is held~ - Inside source: true *** True Line Result - def input_center_button -** Processing line: ~ if center_button_clicked? or inputs.keyboard.key_down.space~ + # mouse left click is held +** Processing line: ~ def detect_input~ - Inside source: true *** True Line Result - if center_button_clicked? or inputs.keyboard.key_down.space -** Processing line: ~ state.play = !state.play~ + def detect_input +** Processing line: ~ # When the mouse is up, nothing is being edited~ - Inside source: true *** True Line Result - state.play = !state.play -** Processing line: ~ end~ + # When the mouse is up, nothing is being edited +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + if inputs.mouse.up +** Processing line: ~ state.current_input = :none~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.current_input = :none +** Processing line: ~ # When the star in the no second grid is clicked~ - Inside source: true *** True Line Result - -** Processing line: ~ # Checks if the next step button is clicked~ + # When the star in the no second grid is clicked +** Processing line: ~ elsif star_clicked?~ - Inside source: true *** True Line Result - # Checks if the next step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ + elsif star_clicked? +** Processing line: ~ state.current_input = :star~ - Inside source: true *** True Line Result - # If it is, it pauses the animation and moves the search one step forward -** Processing line: ~ def input_next_step_button~ + state.current_input = :star +** Processing line: ~ # When the target in the no second grid is clicked~ - Inside source: true *** True Line Result - def input_next_step_button -** Processing line: ~ if right_button_clicked?~ + # When the target in the no second grid is clicked +** Processing line: ~ elsif target_clicked?~ - Inside source: true *** True Line Result - if right_button_clicked? -** Processing line: ~ state.play = false~ + elsif target_clicked? +** Processing line: ~ state.current_input = :target~ - Inside source: true *** True Line Result - state.play = false -** Processing line: ~ state.anim_steps += 1~ + state.current_input = :target +** Processing line: ~ # When a wall in the first grid is clicked~ - Inside source: true *** True Line Result - state.anim_steps += 1 -** Processing line: ~ calc~ + # When a wall in the first grid is clicked +** Processing line: ~ elsif wall_clicked?~ - Inside source: true *** True Line Result - calc -** Processing line: ~ end~ + elsif wall_clicked? +** Processing line: ~ state.current_input = :remove_wall~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.current_input = :remove_wall +** Processing line: ~ # When the first grid is clicked~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # When the first grid is clicked +** Processing line: ~ elsif grid_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Determines what the user is editing and stores the value~ + elsif grid_clicked? +** Processing line: ~ state.current_input = :add_wall~ - Inside source: true *** True Line Result - # Determines what the user is editing and stores the value -** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ + state.current_input = :add_wall +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Storing the value allows the user to continue the same edit as long as the -** Processing line: ~ # mouse left click is held~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # mouse left click is held -** Processing line: ~ def detect_click_and_drag~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def detect_click_and_drag -** Processing line: ~ if inputs.mouse.up~ + +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ state.click_and_drag = :none~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_input~ - Inside source: true *** True Line Result - state.click_and_drag = :none -** Processing line: ~ elsif star_clicked?~ + def process_input +** Processing line: ~ if state.current_input == :star~ - Inside source: true *** True Line Result - elsif star_clicked? -** Processing line: ~ state.click_and_drag = :star~ + if state.current_input == :star +** Processing line: ~ input_star~ - Inside source: true *** True Line Result - state.click_and_drag = :star -** Processing line: ~ elsif wall_clicked?~ + input_star +** Processing line: ~ elsif state.current_input == :target~ - Inside source: true *** True Line Result - elsif wall_clicked? -** Processing line: ~ state.click_and_drag = :remove_wall~ + elsif state.current_input == :target +** Processing line: ~ input_target~ - Inside source: true *** True Line Result - state.click_and_drag = :remove_wall -** Processing line: ~ elsif grid_clicked?~ + input_target +** Processing line: ~ elsif state.current_input == :remove_wall~ - Inside source: true *** True Line Result - elsif grid_clicked? -** Processing line: ~ state.click_and_drag = :add_wall~ + elsif state.current_input == :remove_wall +** Processing line: ~ input_remove_wall~ - Inside source: true *** True Line Result - state.click_and_drag = :add_wall -** Processing line: ~ elsif slider_clicked?~ + input_remove_wall +** Processing line: ~ elsif state.current_input == :add_wall~ - Inside source: true *** True Line Result - elsif slider_clicked? -** Processing line: ~ state.click_and_drag = :slider~ + elsif state.current_input == :add_wall +** Processing line: ~ input_add_wall~ - Inside source: true *** True Line Result - state.click_and_drag = :slider + input_add_wall ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61556,46 +69715,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ -- Inside source: true -*** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_click_and_drag~ -- Inside source: true -*** True Line Result - def process_click_and_drag -** Processing line: ~ if state.click_and_drag == :star~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ - Inside source: true *** True Line Result - if state.click_and_drag == :star -** Processing line: ~ input_star~ + # Moves the star to the cell closest to the mouse in the first grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - input_star -** Processing line: ~ elsif state.click_and_drag == :remove_wall~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :remove_wall -** Processing line: ~ input_remove_wall~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star~ - Inside source: true *** True Line Result - input_remove_wall -** Processing line: ~ elsif state.click_and_drag == :add_wall~ + def input_star +** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :add_wall -** Processing line: ~ input_add_wall~ + old_star = grid.star.clone +** Processing line: ~ grid.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - input_add_wall -** Processing line: ~ elsif state.click_and_drag == :slider~ + grid.star = cell_closest_to_mouse +** Processing line: ~ unless old_star == grid.star~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :slider -** Processing line: ~ input_slider~ + unless old_star == grid.star +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - input_slider + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61608,38 +69759,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the grid closest to the mouse~ +** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ - Inside source: true *** True Line Result - # Moves the star to the grid closest to the mouse -** Processing line: ~ # Only recalculates the search if the star changes position~ + # Moves the target to the grid closest to the mouse in the first grid +** Processing line: ~ # Only reset_searchs the search if the target changes position~ - Inside source: true *** True Line Result - # Only recalculates the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + # Only reset_searchs the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def input_target~ - Inside source: true *** True Line Result - def input_star -** Processing line: ~ old_star = state.star.clone~ + def input_target +** Processing line: ~ old_target = grid.target.clone~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ state.star = cell_closest_to_mouse~ + old_target = grid.target.clone +** Processing line: ~ grid.target = cell_closest_to_mouse~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse -** Processing line: ~ unless old_star == state.star~ + grid.target = cell_closest_to_mouse +** Processing line: ~ unless old_target == grid.target~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ recalculate~ + unless old_target == grid.target +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - recalculate + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61652,10 +69803,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls that are under the cursor~ +** Processing line: ~ # Removes walls in the first grid that are under the cursor~ - Inside source: true *** True Line Result - # Removes walls that are under the cursor + # Removes walls in the first grid that are under the cursor ** Processing line: ~ def input_remove_wall~ - Inside source: true *** True Line Result @@ -61676,18 +69827,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result if mouse_inside_grid? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ +** Processing line: ~ if grid.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ + if grid.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse) -** Processing line: ~ recalculate~ + grid.walls.delete(cell_closest_to_mouse) +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - recalculate + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61704,10 +69855,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds walls at cells under the cursor~ +** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Adds walls at cells under the cursor + # Adds a wall in the first grid in the cell the mouse is over ** Processing line: ~ def input_add_wall~ - Inside source: true *** True Line Result @@ -61716,18 +69867,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result if mouse_inside_grid? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ +** Processing line: ~ unless grid.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ + unless grid.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ grid.walls[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse] = true -** Processing line: ~ recalculate~ + grid.walls[cell_closest_to_mouse] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - recalculate + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -61739,259 +69890,47 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # This method is called when the user is editing the slider~ -- Inside source: true -*** True Line Result - # This method is called when the user is editing the slider -** Processing line: ~ # It pauses the animation and moves the white circle to the closest integer point~ -- Inside source: true -*** True Line Result - # It pauses the animation and moves the white circle to the closest integer point -** Processing line: ~ # on the slider~ -- Inside source: true -*** True Line Result - # on the slider -** Processing line: ~ # Changes the step of the search to be animated~ -- Inside source: true -*** True Line Result - # Changes the step of the search to be animated -** Processing line: ~ def input_slider~ -- Inside source: true -*** True Line Result - def input_slider -** Processing line: ~ state.play = false~ -- Inside source: true -*** True Line Result - state.play = false -** Processing line: ~ mouse_x = inputs.mouse.point.x~ -- Inside source: true -*** True Line Result - mouse_x = inputs.mouse.point.x -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ -- Inside source: true -*** True Line Result - # Bounds the mouse_x to the closest x value on the slider line -** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ -- Inside source: true -*** True Line Result - mouse_x = slider.x if mouse_x < slider.x -** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ -- Inside source: true -*** True Line Result - mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ -- Inside source: true -*** True Line Result - # Sets the current search step to the one represented by the mouse x value -** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ -- Inside source: true -*** True Line Result - # The slider's circle moves due to the render_slider method using anim_steps -** Processing line: ~ state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i~ -- Inside source: true -*** True Line Result - state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ recalculate~ -- Inside source: true -*** True Line Result - recalculate -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Whenever the user edits the grid,~ -- Inside source: true -*** True Line Result - # Whenever the user edits the grid, -** Processing line: ~ # The search has to be recalculated upto the current step~ -- Inside source: true -*** True Line Result - # The search has to be recalculated upto the current step -** Processing line: ~ # with the current grid as the initial state of the grid~ -- Inside source: true -*** True Line Result - # with the current grid as the initial state of the grid -** Processing line: ~ def recalculate~ -- Inside source: true -*** True Line Result - def recalculate -** Processing line: ~ # Resets the search~ -- Inside source: true -*** True Line Result - # Resets the search -** Processing line: ~ state.frontier = []~ -- Inside source: true -*** True Line Result - state.frontier = [] -** Processing line: ~ state.visited = {}~ -- Inside source: true -*** True Line Result - state.visited = {} -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Moves the animation forward one step at a time~ -- Inside source: true -*** True Line Result - # Moves the animation forward one step at a time -** Processing line: ~ state.anim_steps.times { calc }~ -- Inside source: true -*** True Line Result - state.anim_steps.times { calc } -** 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: ~ # This method moves the search forward one step~ -- Inside source: true -*** True Line Result - # This method moves the search forward one step -** Processing line: ~ # When the animation is playing it is called every tick~ -- Inside source: true -*** True Line Result - # When the animation is playing it is called every tick -** Processing line: ~ # And called whenever the current step of the animation needs to be recalculated~ -- Inside source: true -*** True Line Result - # And called whenever the current step of the animation needs to be recalculated -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Moves the search forward one step~ -- Inside source: true -*** True Line Result - # Moves the search forward one step -** Processing line: ~ # Parameter called_from_tick is true if it is called from the tick method~ -- Inside source: true -*** True Line Result - # Parameter called_from_tick is true if it is called from the tick method -** Processing line: ~ # It is false when the search is being recalculated after user editing the grid~ -- Inside source: true -*** True Line Result - # It is false when the search is being recalculated after user editing the grid -** Processing line: ~ def calc~ -- Inside source: true -*** True Line Result - def calc -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The setup to the search~ -- Inside source: true -*** True Line Result - # The setup to the search -** Processing line: ~ # Runs once when the there is no frontier or visited cells~ -- Inside source: true -*** True Line Result - # Runs once when the there is no frontier or visited cells -** Processing line: ~ if state.frontier.empty? && state.visited.empty?~ -- Inside source: true -*** True Line Result - if state.frontier.empty? && state.visited.empty? -** Processing line: ~ state.frontier << state.star~ -- Inside source: true -*** True Line Result - state.frontier << state.star -** Processing line: ~ state.visited[state.star] = true~ -- Inside source: true -*** True Line Result - state.visited[state.star] = true -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # A step in the search~ -- Inside source: true -*** True Line Result - # A step in the search -** Processing line: ~ unless state.frontier.empty?~ -- Inside source: true -*** True Line Result - unless state.frontier.empty? -** Processing line: ~ # Takes the next frontier cell~ -- Inside source: true -*** True Line Result - # Takes the next frontier cell -** Processing line: ~ new_frontier = state.frontier.shift~ -- Inside source: true -*** True Line Result - new_frontier = state.frontier.shift -** Processing line: ~ # For each of its neighbors~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ + +** Processing line: ~~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do |neighbor| -** Processing line: ~ # That have not been visited and are not walls~ + +** Processing line: ~ # Whenever the user edits the grid,~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ + # Whenever the user edits the grid, +** Processing line: ~ # The search has to be reset_searchd upto the current step~ - Inside source: true *** True Line Result - unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited~ + # The search has to be reset_searchd upto the current step +** Processing line: ~ # with the current grid as the initial state of the grid~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited -** Processing line: ~ state.frontier << neighbor~ + # with the current grid as the initial state of the grid +** Processing line: ~ def reset_search~ - Inside source: true *** True Line Result - state.frontier << neighbor -** Processing line: ~ state.visited[neighbor] = true~ + def reset_search +** Processing line: ~ # Reset_Searchs the search~ - Inside source: true *** True Line Result - state.visited[neighbor] = true -** Processing line: ~ end~ + # Reset_Searchs the search +** Processing line: ~ search.frontier = []~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + search.frontier = [] +** Processing line: ~ search.came_from = {}~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + search.came_from = {} +** Processing line: ~ search.path = {}~ - Inside source: true *** True Line Result - end + search.path = {} ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62024,14 +69963,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ +** Processing line: ~ # Gets all the valid neighbors into the array~ - Inside source: true *** True Line Result - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 -** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ + # Gets all the valid neighbors into the array +** Processing line: ~ # From southern neighbor, clockwise~ - Inside source: true *** True Line Result - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 + # From southern neighbor, clockwise ** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ - Inside source: true *** True Line Result @@ -62040,122 +69979,110 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result neighbors << [cell.x - 1, cell.y] unless cell.x == 0 -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ neighbors~ +** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ - Inside source: true *** True Line Result - neighbors -** Processing line: ~ end~ + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 +** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ - Inside source: true *** True Line Result - end + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ -- Inside source: true -*** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ +** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse helps with this~ + # Sorts the neighbors so the rendered path is a zigzag path +** Processing line: ~ # Cells in a diagonal direction are given priority~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse helps with this -** Processing line: ~ def cell_closest_to_mouse~ + # Cells in a diagonal direction are given priority +** Processing line: ~ # Comment this line to see the difference~ - Inside source: true *** True Line Result - def cell_closest_to_mouse -** Processing line: ~ # Closest cell to the mouse~ + # Comment this line to see the difference +** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ - Inside source: true *** True Line Result - # Closest cell to the mouse -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } +** Processing line: ~~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + +** Processing line: ~ neighbors~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Bound x and y to the grid~ + neighbors +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Bound x and y to the grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + +** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + # Finds the vertical and horizontal distance of a cell from the star +** Processing line: ~ # and returns the larger value~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + # and returns the larger value +** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ - Inside source: true *** True Line Result - [x, y] -** Processing line: ~ end~ + # This method is used to have a zigzag pattern in the rendered path +** Processing line: ~ # A cell that is [5, 5] from the star,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # A cell that is [5, 5] from the star, +** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ - Inside source: true *** True Line Result - -** Processing line: ~ # These methods detect when the buttons are clicked~ + # is explored before over a cell that is [0, 7] away. +** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ - Inside source: true *** True Line Result - # These methods detect when the buttons are clicked -** Processing line: ~ def left_button_clicked?~ + # So, if possible, the search tries to go diagonal (zigzag) first +** Processing line: ~ def proximity_to_star(x, y)~ - Inside source: true *** True Line Result - def left_button_clicked? -** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)~ + def proximity_to_star(x, y) +** Processing line: ~ distance_x = (grid.star.x - x).abs~ - Inside source: true *** True Line Result - inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left) -** Processing line: ~ end~ + distance_x = (grid.star.x - x).abs +** Processing line: ~ distance_y = (grid.star.y - y).abs~ - Inside source: true *** True Line Result - end + distance_y = (grid.star.y - y).abs ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def center_button_clicked?~ -- Inside source: true -*** True Line Result - def center_button_clicked? -** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.center)~ +** Processing line: ~ if distance_x > distance_y~ - Inside source: true *** True Line Result - inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.center) -** Processing line: ~ end~ + if distance_x > distance_y +** Processing line: ~ return distance_x~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + return distance_x +** Processing line: ~ else~ - Inside source: true *** True Line Result - -** Processing line: ~ def right_button_clicked?~ + else +** Processing line: ~ return distance_y~ - Inside source: true *** True Line Result - def right_button_clicked? -** Processing line: ~ inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)~ + return distance_y +** Processing line: ~ end~ - Inside source: true *** True Line Result - inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right) + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62164,54 +70091,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the slider~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the slider -** Processing line: ~ # Is the mouse down on the circle of the slider?~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - # Is the mouse down on the circle of the slider? -** Processing line: ~ def slider_clicked?~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse helps with this~ - Inside source: true *** True Line Result - def slider_clicked? -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ + # Finding the cell closest to the mouse helps with this +** Processing line: ~ def cell_closest_to_mouse~ - Inside source: true *** True Line Result - circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ + def cell_closest_to_mouse +** Processing line: ~ # Closest cell to the mouse in the first grid~ - Inside source: true *** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ + # Closest cell to the mouse in the first grid +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect)~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect) -** Processing line: ~ end~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Bound x and y to the grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Bound x and y to the grid +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star -** Processing line: ~ def star_clicked?~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - def star_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star))~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star)) + [x, y] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62220,18 +70147,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls~ +** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls -** Processing line: ~ def wall_clicked?~ + # Signal that the user is going to be moving the star from the first grid +** Processing line: ~ def star_clicked?~ - Inside source: true *** True Line Result - def wall_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_a_wall?~ + def star_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.star))~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_a_wall? + inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62240,18 +70167,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls~ +** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls -** Processing line: ~ def grid_clicked?~ + # Signal that the user is going to be moving the target from the first grid +** Processing line: ~ def target_clicked?~ - Inside source: true *** True Line Result - def grid_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ + def target_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.target))~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_grid? + inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62260,38 +70187,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a wall~ -- Inside source: true -*** True Line Result - # Returns whether the mouse is inside of a wall -** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ -- Inside source: true -*** True Line Result - # Part of the condition that checks whether the user is removing a wall -** Processing line: ~ def mouse_inside_a_wall?~ -- Inside source: true -*** True Line Result - def mouse_inside_a_wall? -** Processing line: ~ state.walls.each_key do | wall |~ -- Inside source: true -*** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up([wall.x, wall.y]))~ -- Inside source: true -*** True Line Result - return true if inputs.mouse.point.inside_rect?(scale_up([wall.x, wall.y])) -** Processing line: ~ end~ +** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Signal that the user is going to be adding walls from the first grid +** Processing line: ~ def grid_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + def grid_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ - Inside source: true *** True Line Result - false + inputs.mouse.down && mouse_inside_grid? ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62300,10 +70207,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a grid~ +** Processing line: ~ # Returns whether the mouse is inside of the first grid~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of a grid + # Returns whether the mouse is inside of the first grid ** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ - Inside source: true *** True Line Result @@ -62312,10 +70219,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def mouse_inside_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height]))~ +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height])) + inputs.mouse.point.inside_rect?(scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62324,10 +70231,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # These methods provide handy aliases to colors~ - Inside source: true *** True Line Result @@ -62348,66 +70251,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [221, 212, 213] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Black~ -- Inside source: true -*** True Line Result - # Black -** Processing line: ~ def grid_line_color~ -- Inside source: true -*** True Line Result - def grid_line_color -** Processing line: ~ [255, 255, 255]~ -- Inside source: true -*** True Line Result - [255, 255, 255] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Dark Brown~ -- Inside source: true -*** True Line Result - # Dark Brown -** Processing line: ~ def visited_color~ -- Inside source: true -*** True Line Result - def visited_color -** Processing line: ~ [204, 191, 179]~ -- Inside source: true -*** True Line Result - [204, 191, 179] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Blue~ -- Inside source: true -*** True Line Result - # Blue -** Processing line: ~ def frontier_color~ -- Inside source: true -*** True Line Result - def frontier_color -** Processing line: ~ [103, 136, 204]~ +** Processing line: ~ # [255, 255, 255]~ - Inside source: true *** True Line Result - [103, 136, 204] + # [255, 255, 255] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62436,18 +70283,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Button Background~ +** Processing line: ~ # Pastel White~ - Inside source: true *** True Line Result - # Button Background -** Processing line: ~ def gray~ + # Pastel White +** Processing line: ~ def path_color~ - Inside source: true *** True Line Result - def gray -** Processing line: ~ [190, 190, 190]~ + def path_color +** Processing line: ~ [231, 230, 228]~ - Inside source: true *** True Line Result - [190, 190, 190] + [231, 230, 228] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62456,18 +70303,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Button Outline~ -- Inside source: true -*** True Line Result - # Button Outline -** Processing line: ~ def black~ +** Processing line: ~ def red~ - Inside source: true *** True Line Result - def black -** Processing line: ~ [0, 0, 0]~ + def red +** Processing line: ~ [255, 0, 0]~ - Inside source: true *** True Line Result - [0, 0, 0] + [255, 0, 0] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62476,18 +70319,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods make the code more concise~ -- Inside source: true -*** True Line Result - # These methods make the code more concise -** Processing line: ~ def grid~ +** Processing line: ~ def purple~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + def purple +** Processing line: ~ [149, 64, 191]~ - Inside source: true *** True Line Result - state.grid + [149, 64, 191] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62496,14 +70335,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def buttons~ +** Processing line: ~ # Makes code more concise~ - Inside source: true *** True Line Result - def buttons -** Processing line: ~ state.buttons~ + # Makes code more concise +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - state.buttons + def grid +** Processing line: ~ state.grid~ +- Inside source: true +*** True Line Result + state.grid ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62512,14 +70355,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def slider~ +** Processing line: ~ def search~ - Inside source: true *** True Line Result - def slider -** Processing line: ~ state.slider~ + def search +** Processing line: ~ state.search~ - Inside source: true *** True Line Result - state.slider + state.search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62580,18 +70423,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $breadth_first_search ||= BreadthFirstSearch.new(args)~ +** Processing line: ~ $breadcrumbs ||= Breadcrumbs.new(args)~ - Inside source: true *** True Line Result - $breadth_first_search ||= BreadthFirstSearch.new(args) -** Processing line: ~ $breadth_first_search.args = args~ + $breadcrumbs ||= Breadcrumbs.new(args) +** Processing line: ~ $breadcrumbs.args = args~ - Inside source: true *** True Line Result - $breadth_first_search.args = args -** Processing line: ~ $breadth_first_search.tick~ + $breadcrumbs.args = args +** Processing line: ~ $breadcrumbs.tick~ - Inside source: true *** True Line Result - $breadth_first_search.tick + $breadcrumbs.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62608,10 +70451,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def reset -** Processing line: ~ $breadth_first_search = nil~ +** Processing line: ~ $breadcrumbs = nil~ - Inside source: true *** True Line Result - $breadth_first_search = nil + $breadcrumbs = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -62620,450 +70463,198 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Path Finding Algorithms - Detailed Breadth First Search - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Path Finding Algorithms - Detailed Breadth First Search - 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/13_path_finding_algorithms/02_detailed_breadth_first_search/app/main.rb~ -- Inside source: true -*** True Line Result - # ./samples/13_path_finding_algorithms/02_detailed_breadth_first_search/app/main.rb -** Processing line: ~ # A visual demonstration of a breadth first search~ -- Inside source: true -*** True Line Result - # A visual demonstration of a breadth first search -** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ -- Inside source: true -*** True Line Result - # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # An animation that can respond to user input in real time~ -- Inside source: true -*** True Line Result - # An animation that can respond to user input in real time -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # A breadth first search expands in all directions one step at a time~ -- Inside source: true -*** True Line Result - # A breadth first search expands in all directions one step at a time -** Processing line: ~ # The frontier is a queue of cells to be expanded from~ -- Inside source: true -*** True Line Result - # The frontier is a queue of cells to be expanded from -** Processing line: ~ # The visited hash allows quick lookups of cells that have been expanded from~ -- Inside source: true -*** True Line Result - # The visited hash allows quick lookups of cells that have been expanded from -** Processing line: ~ # The walls hash allows quick lookup of whether a cell is a wall~ -- Inside source: true -*** True Line Result - # The walls hash allows quick lookup of whether a cell is a wall -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The breadth first search starts by adding the red star to the frontier array~ -- Inside source: true -*** True Line Result - # The breadth first search starts by adding the red star to the frontier array -** Processing line: ~ # and marking it as visited~ -- Inside source: true -*** True Line Result - # and marking it as visited -** Processing line: ~ # Each step a cell is removed from the front of the frontier array (queue)~ -- Inside source: true -*** True Line Result - # Each step a cell is removed from the front of the frontier array (queue) -** Processing line: ~ # Unless the neighbor is a wall or visited, it is added to the frontier array~ -- Inside source: true -*** True Line Result - # Unless the neighbor is a wall or visited, it is added to the frontier array -** Processing line: ~ # The neighbor is then marked as visited~ -- Inside source: true -*** True Line Result - # The neighbor is then marked as visited -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The frontier is blue~ -- Inside source: true -*** True Line Result - # The frontier is blue -** Processing line: ~ # Visited cells are light brown~ -- Inside source: true -*** True Line Result - # Visited cells are light brown -** Processing line: ~ # Walls are camo green~ -- Inside source: true -*** True Line Result - # Walls are camo green -** Processing line: ~ # Even when walls are visited, they will maintain their wall color~ -- Inside source: true -*** True Line Result - # Even when walls are visited, they will maintain their wall color -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # This search numbers the order in which new cells are explored~ -- Inside source: true -*** True Line Result - # This search numbers the order in which new cells are explored -** Processing line: ~ # The next cell from where the search will continue is highlighted yellow~ -- Inside source: true -*** True Line Result - # The next cell from where the search will continue is highlighted yellow -** Processing line: ~ # And the cells that will be considered for expansion are in semi-transparent green~ -- Inside source: true -*** True Line Result - # And the cells that will be considered for expansion are in semi-transparent green -** Processing line: ~~ +** Processing line: ~ # # Representation of how far away visited cells are from the star~ - Inside source: true *** True Line Result - -** Processing line: ~ # The star can be moved by clicking and dragging~ + # # Representation of how far away visited cells are from the star +** Processing line: ~ # # Replaces the render_visited method~ - Inside source: true *** True Line Result - # The star can be moved by clicking and dragging -** Processing line: ~ # Walls can be added and removed by clicking and dragging~ + # # Replaces the render_visited method +** Processing line: ~ # # Visually demonstrates the effectiveness of early exit for pathfinding~ - Inside source: true *** True Line Result - # Walls can be added and removed by clicking and dragging -** Processing line: ~~ + # # Visually demonstrates the effectiveness of early exit for pathfinding +** Processing line: ~ # def render_heat_map~ - Inside source: true *** True Line Result - -** Processing line: ~ class DetailedBreadthFirstSearch~ + # def render_heat_map +** Processing line: ~ # # THIS CODE NEEDS SOME FIXING DUE TO REFACTORING~ - Inside source: true *** True Line Result - class DetailedBreadthFirstSearch -** Processing line: ~ attr_gtk~ + # # THIS CODE NEEDS SOME FIXING DUE TO REFACTORING +** Processing line: ~ # search.came_from.each_key do | cell |~ - Inside source: true *** True Line Result - attr_gtk -** Processing line: ~~ + # search.came_from.each_key do | cell | +** Processing line: ~ # distance = (grid.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize(args)~ + # distance = (grid.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs +** Processing line: ~ # max_distance = grid.width + grid.height~ - Inside source: true *** True Line Result - def initialize(args) -** Processing line: ~ # Variables to edit the size and appearance of the grid~ + # max_distance = grid.width + grid.height +** Processing line: ~ # alpha = 255.to_i * distance.to_i / max_distance.to_i~ - Inside source: true *** True Line Result - # Variables to edit the size and appearance of the grid -** Processing line: ~ # Freely customizable to user's liking~ + # alpha = 255.to_i * distance.to_i / max_distance.to_i +** Processing line: ~ # outputs.solids << [scale_up(visited_cell), red, alpha]~ - Inside source: true *** True Line Result - # Freely customizable to user's liking -** Processing line: ~ args.state.grid.width = 9~ + # outputs.solids << [scale_up(visited_cell), red, alpha] +** Processing line: ~ # # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ - Inside source: true *** True Line Result - args.state.grid.width = 9 -** Processing line: ~ args.state.grid.height = 4~ + # # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] +** Processing line: ~ # end~ - Inside source: true *** True Line Result - args.state.grid.height = 4 -** Processing line: ~ args.state.grid.cell_size = 90~ + # end +** Processing line: ~ # end~ - Inside source: true *** True Line Result - args.state.grid.cell_size = 90 + # end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Stores which step of the animation is being rendered~ -- Inside source: true -*** True Line Result - # Stores which step of the animation is being rendered -** Processing line: ~ # When the user moves the star or messes with the walls,~ -- Inside source: true -*** True Line Result - # When the user moves the star or messes with the walls, -** Processing line: ~ # the breadth first search is recalculated up to this step~ -- Inside source: true -*** True Line Result - # the breadth first search is recalculated up to this step -** Processing line: ~ args.state.anim_steps = 0~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - args.state.anim_steps = 0 +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ # At some step the animation will end,~ -- Inside source: true -*** True Line Result - # At some step the animation will end, -** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ -- Inside source: true -*** True Line Result - # and further steps won't change anything (the whole grid will be explored) -** Processing line: ~ # This step is roughly the grid's width * height~ -- Inside source: true -*** True Line Result - # This step is roughly the grid's width * height -** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ -- Inside source: true -*** True Line Result - # When anim_steps equals max_steps no more calculations will occur -** Processing line: ~ # and the slider will be at the end~ -- Inside source: true -*** True Line Result - # and the slider will be at the end -** Processing line: ~ args.state.max_steps = args.state.grid.width * args.state.grid.height~ -- Inside source: true -*** True Line Result - args.state.max_steps = args.state.grid.width * args.state.grid.height -** Processing line: ~~ -- Inside source: true +** Processing line: ~*** Path Finding Algorithms - Early Exit - main.rb~ +- Header detected. *** True Line Result -** Processing line: ~ # The location of the star and walls of the grid~ -- Inside source: true -*** True Line Result - # The location of the star and walls of the grid -** Processing line: ~ # They can be modified to have a different initial grid~ -- Inside source: true -*** True Line Result - # They can be modified to have a different initial grid -** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ -- Inside source: true -*** True Line Result - # Walls are stored in a hash for quick look up when doing the search -** Processing line: ~ args.state.star = [3, 2]~ -- Inside source: true -*** True Line Result - args.state.star = [3, 2] -** Processing line: ~ args.state.walls = {}~ -- Inside source: true *** True Line Result - args.state.walls = {} -** Processing line: ~~ -- Inside source: true +*** Path Finding Algorithms - Early Exit - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result -** Processing line: ~ # Variables that are used by the breadth first search~ -- Inside source: true -*** True Line Result - # Variables that are used by the breadth first search -** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ -- Inside source: true -*** True Line Result - # Storing cells that the search has visited, prevents unnecessary steps -** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ -- Inside source: true -*** True Line Result - # Expanding the frontier of the search in order makes the search expand -** Processing line: ~ # from the center outward~ -- Inside source: true -*** True Line Result - # from the center outward -** Processing line: ~ args.state.visited = {}~ -- Inside source: true -*** True Line Result - args.state.visited = {} -** Processing line: ~ args.state.frontier = []~ -- Inside source: true *** True Line Result - args.state.frontier = [] -** Processing line: ~ args.state.cell_numbers = []~ +#+begin_src ruby +** Processing line: ~ # ./samples/13_path_finding_algorithms/04_early_exit/app/main.rb~ - Inside source: true *** True Line Result - args.state.cell_numbers = [] -** Processing line: ~~ + # ./samples/13_path_finding_algorithms/04_early_exit/app/main.rb +** Processing line: ~ # Comparison of a breadth first search with and without early exit~ - Inside source: true *** True Line Result - -** Processing line: ~~ + # Comparison of a breadth first search with and without early exit +** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result - + # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # What the user is currently editing on the grid~ +** Processing line: ~ # Demonstrates the exploration difference caused by early exit~ - Inside source: true *** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # Possible values are: :none, :slider, :star, :remove_wall, :add_wall~ + # Demonstrates the exploration difference caused by early exit +** Processing line: ~ # Also demonstrates how breadth first search is used for path generation~ - Inside source: true *** True Line Result - # Possible values are: :none, :slider, :star, :remove_wall, :add_wall + # Also demonstrates how breadth first search is used for path generation ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # We store this value, because we want to remember the value even when~ -- Inside source: true -*** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ -- Inside source: true -*** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ -- Inside source: true -*** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ args.state.click_and_drag = :none~ -- Inside source: true -*** True Line Result - args.state.click_and_drag = :none -** Processing line: ~~ +** Processing line: ~ # The left grid is a breadth first search without early exit~ - Inside source: true *** True Line Result - -** Processing line: ~ # The x, y, w, h values for the buttons~ + # The left grid is a breadth first search without early exit +** Processing line: ~ # The right grid is a breadth first search with early exit~ - Inside source: true *** True Line Result - # The x, y, w, h values for the buttons -** Processing line: ~ # Allow easy movement of the buttons location~ + # The right grid is a breadth first search with early exit +** Processing line: ~ # The red squares represent how far the search expanded~ - Inside source: true *** True Line Result - # Allow easy movement of the buttons location -** Processing line: ~ # A centralized location to get values to detect input and draw the buttons~ + # The red squares represent how far the search expanded +** Processing line: ~ # The darker the red, the farther the search proceeded~ - Inside source: true *** True Line Result - # A centralized location to get values to detect input and draw the buttons -** Processing line: ~ # Editing these values might mean needing to edit the label offsets~ + # The darker the red, the farther the search proceeded +** Processing line: ~ # Comparison of the heat map reveals how much searching can be saved by early exit~ - Inside source: true *** True Line Result - # Editing these values might mean needing to edit the label offsets -** Processing line: ~ # which can be found in the appropriate render button methods~ + # Comparison of the heat map reveals how much searching can be saved by early exit +** Processing line: ~ # The white path shows path generation via breadth first search~ - Inside source: true *** True Line Result - # which can be found in the appropriate render button methods -** Processing line: ~ args.state.buttons.left = [450, 600, 160, 50]~ + # The white path shows path generation via breadth first search +** Processing line: ~ class EarlyExitBreadthFirstSearch~ - Inside source: true *** True Line Result - args.state.buttons.left = [450, 600, 160, 50] -** Processing line: ~ args.state.buttons.right = [610, 600, 160, 50]~ + class EarlyExitBreadthFirstSearch +** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result - args.state.buttons.right = [610, 600, 160, 50] + attr_gtk ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The variables below are related to the slider~ -- Inside source: true -*** True Line Result - # The variables below are related to the slider -** Processing line: ~ # They allow the user to customize them~ -- Inside source: true -*** True Line Result - # They allow the user to customize them -** Processing line: ~ # They also give a central location for the render and input methods to get~ -- Inside source: true -*** True Line Result - # They also give a central location for the render and input methods to get -** Processing line: ~ # information from~ -- Inside source: true -*** True Line Result - # information from -** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ -- Inside source: true -*** True Line Result - # x & y are the coordinates of the leftmost part of the slider line -** Processing line: ~ args.state.slider.x = 400~ -- Inside source: true -*** True Line Result - args.state.slider.x = 400 -** Processing line: ~ args.state.slider.y = 675~ -- Inside source: true -*** True Line Result - args.state.slider.y = 675 -** Processing line: ~ # This is the width of the line~ -- Inside source: true -*** True Line Result - # This is the width of the line -** Processing line: ~ args.state.slider.w = 360~ -- Inside source: true -*** True Line Result - args.state.slider.w = 360 -** Processing line: ~ # This is the offset for the circle~ -- Inside source: true -*** True Line Result - # This is the offset for the circle -** Processing line: ~ # Allows the center of the circle to be on the line,~ +** Processing line: ~ # This method is called every frame/tick~ - Inside source: true *** True Line Result - # Allows the center of the circle to be on the line, -** Processing line: ~ # as opposed to the upper right corner~ + # This method is called every frame/tick +** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ - Inside source: true *** True Line Result - # as opposed to the upper right corner -** Processing line: ~ args.state.slider.offset = 20~ + # Every tick, the current state of the search is rendered on the screen, +** Processing line: ~ # User input is processed, and~ - Inside source: true *** True Line Result - args.state.slider.offset = 20 -** Processing line: ~ # This is the spacing between each of the notches on the slider~ + # User input is processed, and +** Processing line: ~ # The next step in the search is calculated~ - Inside source: true *** True Line Result - # This is the spacing between each of the notches on the slider -** Processing line: ~ # Notches are places where the circle can rest on the slider line~ + # The next step in the search is calculated +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - # Notches are places where the circle can rest on the slider line -** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - # There needs to be a notch for each step before the maximum number of steps -** Processing line: ~ args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f~ + defaults +** Processing line: ~ # If the grid has not been searched~ - Inside source: true *** True Line Result - args.state.slider.spacing = args.state.slider.w.to_f / args.state.max_steps.to_f -** Processing line: ~ end~ + # If the grid has not been searched +** Processing line: ~ if state.visited.empty?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if state.visited.empty? +** Processing line: ~ # Complete the search~ - Inside source: true *** True Line Result - -** Processing line: ~ # This method is called every frame/tick~ + # Complete the search +** Processing line: ~ state.max_steps.times { step }~ - Inside source: true *** True Line Result - # This method is called every frame/tick -** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ + state.max_steps.times { step } +** Processing line: ~ # And calculate the path~ - Inside source: true *** True Line Result - # Every tick, the current state of the search is rendered on the screen, -** Processing line: ~ # User input is processed, and~ + # And calculate the path +** Processing line: ~ calc_path~ - Inside source: true *** True Line Result - # User input is processed, and -** Processing line: ~ def tick~ + calc_path +** Processing line: ~ end~ - Inside source: true *** True Line Result - def tick + end ** Processing line: ~ render~ - Inside source: true *** True Line Result @@ -63080,214 +70671,182 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method is called from tick and renders everything every tick~ -- Inside source: true -*** True Line Result - # This method is called from tick and renders everything every tick -** Processing line: ~ def render~ -- Inside source: true -*** True Line Result - def render -** Processing line: ~ render_buttons~ -- Inside source: true -*** True Line Result - render_buttons -** Processing line: ~ render_slider~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - render_slider -** Processing line: ~~ + def defaults +** Processing line: ~ # Variables to edit the size and appearance of the grid~ - Inside source: true *** True Line Result - -** Processing line: ~ render_background~ + # Variables to edit the size and appearance of the grid +** Processing line: ~ # Freely customizable to user's liking~ - Inside source: true *** True Line Result - render_background -** Processing line: ~ render_visited~ + # Freely customizable to user's liking +** Processing line: ~ grid.width ||= 15~ - Inside source: true *** True Line Result - render_visited -** Processing line: ~ render_frontier~ + grid.width ||= 15 +** Processing line: ~ grid.height ||= 15~ - Inside source: true *** True Line Result - render_frontier -** Processing line: ~ render_walls~ + grid.height ||= 15 +** Processing line: ~ grid.cell_size ||= 40~ - Inside source: true *** True Line Result - render_walls -** Processing line: ~ render_star~ + grid.cell_size ||= 40 +** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result - render_star + grid.rect ||= [0, 0, grid.width, grid.height] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ render_highlights~ +** Processing line: ~ # At some step the animation will end,~ - Inside source: true *** True Line Result - render_highlights -** Processing line: ~ render_cell_numbers~ + # At some step the animation will end, +** Processing line: ~ # and further steps won't change anything (the whole grid.widthill be explored)~ - Inside source: true *** True Line Result - render_cell_numbers -** Processing line: ~ end~ + # and further steps won't change anything (the whole grid.widthill be explored) +** Processing line: ~ # This step is roughly the grid's width * height~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # This step is roughly the grid's width * height +** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ - Inside source: true *** True Line Result - -** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ + # When anim_steps equals max_steps no more calculations will occur +** Processing line: ~ # and the slider will be at the end~ - Inside source: true *** True Line Result - # The methods below subdivide the task of drawing everything to the screen + # and the slider will be at the end +** Processing line: ~ state.max_steps ||= args.state.grid.width * args.state.grid.height~ +- Inside source: true +*** True Line Result + state.max_steps ||= args.state.grid.width * args.state.grid.height ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Draws the buttons that move the search backward or forward~ +** Processing line: ~ # The location of the star and walls of the grid~ - Inside source: true *** True Line Result - # Draws the buttons that move the search backward or forward -** Processing line: ~ # These buttons are rendered so the user knows where to click to move the search~ + # The location of the star and walls of the grid +** Processing line: ~ # They can be modified to have a different initial grid~ - Inside source: true *** True Line Result - # These buttons are rendered so the user knows where to click to move the search -** Processing line: ~ def render_buttons~ + # They can be modified to have a different initial grid +** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ - Inside source: true *** True Line Result - def render_buttons -** Processing line: ~ render_left_button~ + # Walls are stored in a hash for quick look up when doing the search +** Processing line: ~ state.star ||= [2, 8]~ - Inside source: true *** True Line Result - render_left_button -** Processing line: ~ render_right_button~ + state.star ||= [2, 8] +** Processing line: ~ state.target ||= [10, 5]~ - Inside source: true *** True Line Result - render_right_button -** Processing line: ~ end~ + state.target ||= [10, 5] +** Processing line: ~ state.walls ||= {}~ - Inside source: true *** True Line Result - end + state.walls ||= {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the button which steps the search backward~ -- Inside source: true -*** True Line Result - # Renders the button which steps the search backward -** Processing line: ~ # Shows the user where to click to move the search backward~ -- Inside source: true -*** True Line Result - # Shows the user where to click to move the search backward -** Processing line: ~ def render_left_button~ -- Inside source: true -*** True Line Result - def render_left_button -** Processing line: ~ # Draws the gray button, and a black border~ +** Processing line: ~ # Variables that are used by the breadth first search~ - Inside source: true *** True Line Result - # Draws the gray button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + # Variables that are used by the breadth first search +** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.left, gray]~ + # Storing cells that the search has visited, prevents unnecessary steps +** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ - Inside source: true *** True Line Result - outputs.solids << [buttons.left, gray] -** Processing line: ~ outputs.borders << [buttons.left, black]~ + # Expanding the frontier of the search in order makes the search expand +** Processing line: ~ # from the center outward~ - Inside source: true *** True Line Result - outputs.borders << [buttons.left, black] + # from the center outward ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders an explanatory label in the center of the button~ -- Inside source: true -*** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ -- Inside source: true -*** True Line Result - # Explains to the user what the button does -** Processing line: ~ label_x = buttons.left.x + 05~ -- Inside source: true -*** True Line Result - label_x = buttons.left.x + 05 -** Processing line: ~ label_y = buttons.left.y + 35~ +** Processing line: ~ # Visited cells in the first grid~ - Inside source: true *** True Line Result - label_y = buttons.left.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, "< Step backward"]~ + # Visited cells in the first grid +** Processing line: ~ state.visited ||= {}~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, "< Step backward"] -** Processing line: ~ end~ + state.visited ||= {} +** Processing line: ~ # Visited cells in the second grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Visited cells in the second grid +** Processing line: ~ state.early_exit_visited ||= {}~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the button which steps the search forward~ + state.early_exit_visited ||= {} +** Processing line: ~ # The cells from which the search is to expand~ - Inside source: true *** True Line Result - # Renders the button which steps the search forward -** Processing line: ~ # Shows the user where to click to move the search forward~ + # The cells from which the search is to expand +** Processing line: ~ state.frontier ||= []~ - Inside source: true *** True Line Result - # Shows the user where to click to move the search forward -** Processing line: ~ def render_right_button~ + state.frontier ||= [] +** Processing line: ~ # A hash of where each cell was expanded from~ - Inside source: true *** True Line Result - def render_right_button -** Processing line: ~ # Draws the gray button, and a black border~ + # A hash of where each cell was expanded from +** Processing line: ~ # The key is a cell, and the value is the cell it came from~ - Inside source: true *** True Line Result - # Draws the gray button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + # The key is a cell, and the value is the cell it came from +** Processing line: ~ state.came_from ||= {}~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.right, gray]~ + state.came_from ||= {} +** Processing line: ~ # Cells that are part of the path from the target to the star~ - Inside source: true *** True Line Result - outputs.solids << [buttons.right, gray] -** Processing line: ~ outputs.borders << [buttons.right, black]~ + # Cells that are part of the path from the target to the star +** Processing line: ~ state.path ||= {}~ - Inside source: true *** True Line Result - outputs.borders << [buttons.right, black] + state.path ||= {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders an explanatory label in the center of the button~ +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + # What the user is currently editing on the grid +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ label_x = buttons.right.x + 10~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - label_x = buttons.right.x + 10 -** Processing line: ~ label_y = buttons.right.y + 35~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - label_y = buttons.right.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, "Step forward >"]~ + # they are still clicking down on the mouse. +** Processing line: ~ state.current_input ||= :none~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, "Step forward >"] + state.current_input ||= :none ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63296,54 +70855,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the slider so the user can move it and see the progress of the search~ -- Inside source: true -*** True Line Result - # Draws the slider so the user can move it and see the progress of the search -** Processing line: ~ def render_slider~ -- Inside source: true -*** True Line Result - def render_slider -** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ -- Inside source: true -*** True Line Result - # Using primitives hides the line under the white circle of the slider -** Processing line: ~ # Draws the line~ +** Processing line: ~ # Draws everything onto the screen~ - Inside source: true *** True Line Result - # Draws the line -** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ + # Draws everything onto the screen +** Processing line: ~ def render~ - Inside source: true *** True Line Result - outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line -** Processing line: ~ # The circle needs to be offset so that the center of the circle~ + def render +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - # The circle needs to be offset so that the center of the circle -** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ + render_background +** Processing line: ~ render_heat_map~ - Inside source: true *** True Line Result - # overlaps the line instead of the upper right corner of the circle -** Processing line: ~ # The circle's x value is also moved based on the current seach step~ + render_heat_map +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - # The circle's x value is also moved based on the current seach step -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ + render_walls +** Processing line: ~ render_path~ - Inside source: true *** True Line Result - circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ + render_path +** Processing line: ~ render_star~ - Inside source: true *** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ + render_star +** Processing line: ~ render_target~ - Inside source: true *** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ + render_target +** Processing line: ~ render_labels~ - Inside source: true *** True Line Result - outputs.primitives << [circle_rect, 'circle-white.png'].sprite + render_labels ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63352,18 +70899,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws what the grid looks like with nothing on it~ +** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ - Inside source: true *** True Line Result - # Draws what the grid looks like with nothing on it -** Processing line: ~ # Which is a bunch of unvisited cells~ + # The methods below subdivide the task of drawing everything to the screen +** Processing line: ~~ - Inside source: true *** True Line Result - # Which is a bunch of unvisited cells -** Processing line: ~ # Drawn first so other things can draw on top of it~ + +** Processing line: ~ # Draws what the grid looks like with nothing on it~ - Inside source: true *** True Line Result - # Drawn first so other things can draw on top of it + # Draws what the grid looks like with nothing on it ** Processing line: ~ def render_background~ - Inside source: true *** True Line Result @@ -63372,14 +70919,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result render_unvisited -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The grid lines make the cells appear separate~ -- Inside source: true -*** True Line Result - # The grid lines make the cells appear separate ** Processing line: ~ render_grid_lines~ - Inside source: true *** True Line Result @@ -63392,26 +70931,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws a rectangle the size of the entire grid to represent unvisited cells~ -- Inside source: true -*** True Line Result - # Draws a rectangle the size of the entire grid to represent unvisited cells -** Processing line: ~ # Unvisited cells are the default cell~ +** Processing line: ~ # Draws both grids~ - Inside source: true *** True Line Result - # Unvisited cells are the default cell + # Draws both grids ** Processing line: ~ def render_unvisited~ - Inside source: true *** True Line Result def render_unvisited -** Processing line: ~ background = [0, 0, grid.width, grid.height]~ +** Processing line: ~ outputs.solids << [scale_up(grid.rect), unvisited_color]~ - Inside source: true *** True Line Result - background = [0, 0, grid.width, grid.height] -** Processing line: ~ outputs.solids << [scale_up(background), unvisited_color]~ + outputs.solids << [scale_up(grid.rect), unvisited_color] +** Processing line: ~ outputs.solids << [early_exit_scale_up(grid.rect), unvisited_color]~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(background), unvisited_color] + outputs.solids << [early_exit_scale_up(grid.rect), unvisited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63432,10 +70967,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for x in 0..grid.width -** Processing line: ~ outputs.lines << [scale_up(vertical_line(x)), grid_line_color]~ +** Processing line: ~ outputs.lines << vertical_line(x)~ - Inside source: true *** True Line Result - outputs.lines << [scale_up(vertical_line(x)), grid_line_color] + outputs.lines << vertical_line(x) +** Processing line: ~ outputs.lines << early_exit_vertical_line(x)~ +- Inside source: true +*** True Line Result + outputs.lines << early_exit_vertical_line(x) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63448,10 +70987,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for y in 0..grid.height -** Processing line: ~ outputs.lines << [scale_up(horizontal_line(y)), grid_line_color]~ +** Processing line: ~ outputs.lines << horizontal_line(y)~ - Inside source: true *** True Line Result - outputs.lines << [scale_up(horizontal_line(y)), grid_line_color] + outputs.lines << horizontal_line(y) +** Processing line: ~ outputs.lines << early_exit_horizontal_line(y)~ +- Inside source: true +*** True Line Result + outputs.lines << early_exit_horizontal_line(y) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63464,18 +71007,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to get a vertical line given an index~ +** Processing line: ~ # Easy way to draw vertical lines given an index~ - Inside source: true *** True Line Result - # Easy way to get a vertical line given an index + # Easy way to draw vertical lines given an index ** Processing line: ~ def vertical_line column~ - Inside source: true *** True Line Result def vertical_line column -** Processing line: ~ [column, 0, column, grid.height]~ +** Processing line: ~ scale_up([column, 0, column, grid.height])~ - Inside source: true *** True Line Result - [column, 0, column, grid.height] + scale_up([column, 0, column, grid.height]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63484,18 +71027,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to get a horizontal line given an index~ +** Processing line: ~ # Easy way to draw horizontal lines given an index~ - Inside source: true *** True Line Result - # Easy way to get a horizontal line given an index + # Easy way to draw horizontal lines given an index ** Processing line: ~ def horizontal_line row~ - Inside source: true *** True Line Result def horizontal_line row -** Processing line: ~ [0, row, grid.width, row]~ +** Processing line: ~ scale_up([0, row, grid.width, row])~ - Inside source: true *** True Line Result - [0, row, grid.width, row] + scale_up([0, row, grid.width, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63504,30 +71047,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the area that is going to be searched from~ +** Processing line: ~ # Easy way to draw vertical lines given an index~ - Inside source: true *** True Line Result - # Draws the area that is going to be searched from -** Processing line: ~ # The frontier is the most outward parts of the search~ + # Easy way to draw vertical lines given an index +** Processing line: ~ def early_exit_vertical_line column~ - Inside source: true *** True Line Result - # The frontier is the most outward parts of the search -** Processing line: ~ def render_frontier~ + def early_exit_vertical_line column +** Processing line: ~ scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ - Inside source: true *** True Line Result - def render_frontier -** Processing line: ~ state.frontier.each do |cell|~ + scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.frontier.each do |cell| -** Processing line: ~ outputs.solids << [scale_up(cell), frontier_color]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(cell), frontier_color] -** Processing line: ~ end~ + +** Processing line: ~ # Easy way to draw horizontal lines given an index~ - Inside source: true *** True Line Result - end + # Easy way to draw horizontal lines given an index +** Processing line: ~ def early_exit_horizontal_line row~ +- Inside source: true +*** True Line Result + def early_exit_horizontal_line row +** Processing line: ~ scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ +- Inside source: true +*** True Line Result + scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63536,10 +71087,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the walls~ +** Processing line: ~ # Draws the walls on both grids~ - Inside source: true *** True Line Result - # Draws the walls + # Draws the walls on both grids ** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result @@ -63552,6 +71103,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result outputs.solids << [scale_up(wall), wall_color] +** Processing line: ~ outputs.solids << [early_exit_scale_up(wall), wall_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [early_exit_scale_up(wall), wall_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63564,26 +71119,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders cells that have been searched in the appropriate color~ +** Processing line: ~ # Renders the star on both grids~ - Inside source: true *** True Line Result - # Renders cells that have been searched in the appropriate color -** Processing line: ~ def render_visited~ + # Renders the star on both grids +** Processing line: ~ def render_star~ - Inside source: true *** True Line Result - def render_visited -** Processing line: ~ state.visited.each_key do |cell|~ + def render_star +** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - state.visited.each_key do |cell| -** Processing line: ~ outputs.solids << [scale_up(cell), visited_color]~ + outputs.sprites << [scale_up(state.star), 'star.png'] +** Processing line: ~ outputs.sprites << [early_exit_scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(cell), visited_color] -** Processing line: ~ end~ + outputs.sprites << [early_exit_scale_up(state.star), 'star.png'] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Renders the target on both grids~ +- Inside source: true +*** True Line Result + # Renders the target on both grids +** Processing line: ~ def render_target~ +- Inside source: true +*** True Line Result + def render_target +** Processing line: ~ outputs.sprites << [scale_up(state.target), 'target.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [scale_up(state.target), 'target.png'] +** Processing line: ~ outputs.sprites << [early_exit_scale_up(state.target), 'target.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [early_exit_scale_up(state.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63592,18 +71167,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the star~ +** Processing line: ~ # Labels the grids~ - Inside source: true *** True Line Result - # Renders the star -** Processing line: ~ def render_star~ + # Labels the grids +** Processing line: ~ def render_labels~ - Inside source: true *** True Line Result - def render_star -** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ + def render_labels +** Processing line: ~ outputs.labels << [200, 625, "Without early exit"]~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(state.star), 'star.png'] + outputs.labels << [200, 625, "Without early exit"] +** Processing line: ~ outputs.labels << [875, 625, "With early exit"]~ +- Inside source: true +*** True Line Result + outputs.labels << [875, 625, "With early exit"] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63612,46 +71191,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Cells have a number rendered in them based on when they were explored~ +** Processing line: ~ # Renders the path based off of the state.path hash~ - Inside source: true *** True Line Result - # Cells have a number rendered in them based on when they were explored -** Processing line: ~ # This is based off of their index in the cell_numbers array~ + # Renders the path based off of the state.path hash +** Processing line: ~ def render_path~ - Inside source: true *** True Line Result - # This is based off of their index in the cell_numbers array -** Processing line: ~ # Cells are added to this array the same time they are added to the frontier array~ + def render_path +** Processing line: ~ # If the star and target are disconnected there will only be one path~ - Inside source: true *** True Line Result - # Cells are added to this array the same time they are added to the frontier array -** Processing line: ~ def render_cell_numbers~ + # If the star and target are disconnected there will only be one path +** Processing line: ~ # The path should not render in that case~ - Inside source: true *** True Line Result - def render_cell_numbers -** Processing line: ~ state.cell_numbers.each_with_index do |cell, index|~ + # The path should not render in that case +** Processing line: ~ unless state.path.size == 1~ - Inside source: true *** True Line Result - state.cell_numbers.each_with_index do |cell, index| -** Processing line: ~ # Math that approx centers the number in the cell~ + unless state.path.size == 1 +** Processing line: ~ state.path.each_key do | cell |~ - Inside source: true *** True Line Result - # Math that approx centers the number in the cell -** Processing line: ~ label_x = (cell.x * grid.cell_size) + grid.cell_size / 2 - 5~ + state.path.each_key do | cell | +** Processing line: ~ # Renders path on both grids~ - Inside source: true *** True Line Result - label_x = (cell.x * grid.cell_size) + grid.cell_size / 2 - 5 -** Processing line: ~ label_y = (cell.y * grid.cell_size) + (grid.cell_size / 2) + 5~ + # Renders path on both grids +** Processing line: ~ outputs.solids << [scale_up(cell), path_color]~ - Inside source: true *** True Line Result - label_y = (cell.y * grid.cell_size) + (grid.cell_size / 2) + 5 -** Processing line: ~~ + outputs.solids << [scale_up(cell), path_color] +** Processing line: ~ outputs.solids << [early_exit_scale_up(cell), path_color]~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.labels << [label_x, label_y, (index + 1).to_s]~ + outputs.solids << [early_exit_scale_up(cell), path_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, (index + 1).to_s] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63664,70 +71243,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # The next frontier to be expanded is highlighted yellow~ +** Processing line: ~ # Calculates the path from the target to the star after the search is over~ - Inside source: true *** True Line Result - # The next frontier to be expanded is highlighted yellow -** Processing line: ~ # Its adjacent non-wall neighbors have their border highlighted green~ + # Calculates the path from the target to the star after the search is over +** Processing line: ~ # Relies on the came_from hash~ - Inside source: true *** True Line Result - # Its adjacent non-wall neighbors have their border highlighted green -** Processing line: ~ # This is to show the user how the search expands~ + # Relies on the came_from hash +** Processing line: ~ # Fills the state.path hash, which is later rendered on screen~ - Inside source: true *** True Line Result - # This is to show the user how the search expands -** Processing line: ~ def render_highlights~ + # Fills the state.path hash, which is later rendered on screen +** Processing line: ~ def calc_path~ - Inside source: true *** True Line Result - def render_highlights -** Processing line: ~ return if state.frontier.empty?~ + def calc_path +** Processing line: ~ endpoint = state.target~ - Inside source: true *** True Line Result - return if state.frontier.empty? -** Processing line: ~~ + endpoint = state.target +** Processing line: ~ while endpoint~ - Inside source: true *** True Line Result - -** Processing line: ~ # Highlight the next frontier to be expanded yellow~ + while endpoint +** Processing line: ~ state.path[endpoint] = true~ - Inside source: true *** True Line Result - # Highlight the next frontier to be expanded yellow -** Processing line: ~ next_frontier = state.frontier[0]~ + state.path[endpoint] = true +** Processing line: ~ endpoint = state.came_from[endpoint]~ - Inside source: true *** True Line Result - next_frontier = state.frontier[0] -** Processing line: ~ outputs.solids << [scale_up(next_frontier), highlighter_yellow]~ + endpoint = state.came_from[endpoint] +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(next_frontier), highlighter_yellow] + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Neighbors have a semi-transparent green layer over them~ +** Processing line: ~ # Representation of how far away visited cells are from the star~ - Inside source: true *** True Line Result - # Neighbors have a semi-transparent green layer over them -** Processing line: ~ # Unless the neighbor is a wall~ + # Representation of how far away visited cells are from the star +** Processing line: ~ # Replaces the render_visited method~ - Inside source: true *** True Line Result - # Unless the neighbor is a wall -** Processing line: ~ adjacent_neighbors(next_frontier).each do |neighbor|~ + # Replaces the render_visited method +** Processing line: ~ # Visually demonstrates the effectiveness of early exit for pathfinding~ - Inside source: true *** True Line Result - adjacent_neighbors(next_frontier).each do |neighbor| -** Processing line: ~ unless state.walls.has_key?(neighbor)~ + # Visually demonstrates the effectiveness of early exit for pathfinding +** Processing line: ~ def render_heat_map~ - Inside source: true *** True Line Result - unless state.walls.has_key?(neighbor) -** Processing line: ~ outputs.solids << [scale_up(neighbor), highlighter_green, 70]~ + def render_heat_map +** Processing line: ~ state.visited.each_key do | visited_cell |~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(neighbor), highlighter_green, 70] -** Processing line: ~ end~ + state.visited.each_key do | visited_cell | +** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ - Inside source: true *** True Line Result - end + distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs +** Processing line: ~ max_distance = grid.width + grid.height~ +- Inside source: true +*** True Line Result + max_distance = grid.width + grid.height +** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ +- Inside source: true +*** True Line Result + alpha = 255.to_i * distance.to_i / max_distance.to_i +** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ +- Inside source: true +*** True Line Result + outputs.solids << [scale_up(visited_cell), red, alpha] +** Processing line: ~ # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ +- Inside source: true +*** True Line Result + # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ state.early_exit_visited.each_key do | visited_cell |~ +- Inside source: true +*** True Line Result + state.early_exit_visited.each_key do | visited_cell | +** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ +- Inside source: true +*** True Line Result + distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs +** Processing line: ~ max_distance = grid.width + grid.height~ +- Inside source: true +*** True Line Result + max_distance = grid.width + grid.height +** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ +- Inside source: true +*** True Line Result + alpha = 255.to_i * distance.to_i / max_distance.to_i +** Processing line: ~ outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ +- Inside source: true +*** True Line Result + outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -63740,22 +71367,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ +- Inside source: true +*** True Line Result + # Translates the given cell grid.width + 1 to the right and then scales up +** Processing line: ~ # Used to draw cells for the second grid~ +- Inside source: true +*** True Line Result + # Used to draw cells for the second grid +** Processing line: ~ # This method does not work for lines,~ +- Inside source: true +*** True Line Result + # This method does not work for lines, +** Processing line: ~ # so separate methods exist for the grid lines~ +- Inside source: true +*** True Line Result + # so separate methods exist for the grid lines +** Processing line: ~ def early_exit_scale_up(cell)~ +- Inside source: true +*** True Line Result + def early_exit_scale_up(cell) +** Processing line: ~ cell_clone = cell.clone~ +- Inside source: true +*** True Line Result + cell_clone = cell.clone +** Processing line: ~ cell_clone.x += grid.width + 1~ +- Inside source: true +*** True Line Result + cell_clone.x += grid.width + 1 +** Processing line: ~ scale_up(cell_clone)~ +- Inside source: true +*** True Line Result + scale_up(cell_clone) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Cell Size is used when rendering to allow the grid to be scaled up or down~ +** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ - Inside source: true *** True Line Result - # Cell Size is used when rendering to allow the grid to be scaled up or down -** Processing line: ~ # Cells in the frontier array and visited hash and walls hash are stored as x & y~ + # In code, the cells are represented as 1x1 rectangles +** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ - Inside source: true *** True Line Result - # Cells in the frontier array and visited hash and walls hash are stored as x & y -** Processing line: ~ # Scaling up cells and lines when rendering allows omitting of width and height~ + # When drawn, the cells are larger than 1x1 rectangles +** Processing line: ~ # This method is used to scale up cells, and lines~ - Inside source: true *** True Line Result - # Scaling up cells and lines when rendering allows omitting of width and height + # This method is used to scale up cells, and lines +** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ +- Inside source: true +*** True Line Result + # Objects are scaled up according to the grid.cell_size variable +** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ +- Inside source: true +*** True Line Result + # This allows for easy customization of the visual scale of the grid ** Processing line: ~ def scale_up(cell)~ - Inside source: true *** True Line Result @@ -63828,254 +71499,258 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # This method processes user input every tick~ - Inside source: true *** True Line Result # This method processes user input every tick -** Processing line: ~ # This method allows the user to use the buttons, slider, and edit the grid~ +** Processing line: ~ # Any method with "1" is related to the first grid~ - Inside source: true *** True Line Result - # This method allows the user to use the buttons, slider, and edit the grid -** Processing line: ~ # There are 2 types of input:~ + # Any method with "1" is related to the first grid +** Processing line: ~ # Any method with "2" is related to the second grid~ - Inside source: true *** True Line Result - # There are 2 types of input: -** Processing line: ~ # Button Input~ + # Any method with "2" is related to the second grid +** Processing line: ~ def input~ - Inside source: true *** True Line Result - # Button Input -** Processing line: ~ # Click and Drag Input~ + def input +** Processing line: ~ # The program has to remember that the user is dragging an object~ - Inside source: true *** True Line Result - # Click and Drag Input -** Processing line: ~ #~ + # The program has to remember that the user is dragging an object +** Processing line: ~ # even when the mouse is no longer over that object~ - Inside source: true *** True Line Result - # -** Processing line: ~ # Button Input is used for the backward step and forward step buttons~ + # even when the mouse is no longer over that object +** Processing line: ~ # So detecting input and processing input is separate~ - Inside source: true *** True Line Result - # Button Input is used for the backward step and forward step buttons -** Processing line: ~ # Input is detected by mouse up within the bounds of the rect~ + # So detecting input and processing input is separate +** Processing line: ~ detect_input~ - Inside source: true *** True Line Result - # Input is detected by mouse up within the bounds of the rect -** Processing line: ~ #~ + detect_input +** Processing line: ~ process_input~ - Inside source: true *** True Line Result - # -** Processing line: ~ # Click and Drag Input is used for moving the star, adding walls,~ + process_input +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Click and Drag Input is used for moving the star, adding walls, -** Processing line: ~ # removing walls, and the slider~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # removing walls, and the slider -** Processing line: ~ #~ + +** Processing line: ~ # Determines what the user is editing and stores the value~ - Inside source: true *** True Line Result - # -** Processing line: ~ # When the mouse is down on the star, the click_and_drag variable is set to :star~ + # Determines what the user is editing and stores the value +** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ - Inside source: true *** True Line Result - # When the mouse is down on the star, the click_and_drag variable is set to :star -** Processing line: ~ # While click_and_drag equals :star, the cursor's position is used to calculate the~ + # Storing the value allows the user to continue the same edit as long as the +** Processing line: ~ # mouse left click is held~ - Inside source: true *** True Line Result - # While click_and_drag equals :star, the cursor's position is used to calculate the -** Processing line: ~ # appropriate drag behavior~ + # mouse left click is held +** Processing line: ~ def detect_input~ - Inside source: true *** True Line Result - # appropriate drag behavior -** Processing line: ~ #~ + def detect_input +** Processing line: ~ # When the mouse is up, nothing is being edited~ - Inside source: true *** True Line Result - # -** Processing line: ~ # When the mouse goes up click_and_drag is set to :none~ + # When the mouse is up, nothing is being edited +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - # When the mouse goes up click_and_drag is set to :none -** Processing line: ~ #~ + if inputs.mouse.up +** Processing line: ~ state.current_input = :none~ - Inside source: true *** True Line Result - # -** Processing line: ~ # A variable has to be used because the star has to continue being edited even~ + state.current_input = :none +** Processing line: ~ # When the star in the no second grid is clicked~ - Inside source: true *** True Line Result - # A variable has to be used because the star has to continue being edited even -** Processing line: ~ # when the cursor is no longer over the star~ + # When the star in the no second grid is clicked +** Processing line: ~ elsif star_clicked?~ - Inside source: true *** True Line Result - # when the cursor is no longer over the star -** Processing line: ~ #~ + elsif star_clicked? +** Processing line: ~ state.current_input = :star~ - Inside source: true *** True Line Result - # -** Processing line: ~ # Similar things occur for the other Click and Drag inputs~ + state.current_input = :star +** Processing line: ~ # When the star in the second grid is clicked~ - Inside source: true *** True Line Result - # Similar things occur for the other Click and Drag inputs -** Processing line: ~ def input~ + # When the star in the second grid is clicked +** Processing line: ~ elsif star2_clicked?~ - Inside source: true *** True Line Result - def input -** Processing line: ~ # Processes inputs for the buttons~ + elsif star2_clicked? +** Processing line: ~ state.current_input = :star2~ - Inside source: true *** True Line Result - # Processes inputs for the buttons -** Processing line: ~ input_buttons~ + state.current_input = :star2 +** Processing line: ~ # When the target in the no second grid is clicked~ - Inside source: true *** True Line Result - input_buttons -** Processing line: ~~ + # When the target in the no second grid is clicked +** Processing line: ~ elsif target_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Detects which if any click and drag input is occurring~ + elsif target_clicked? +** Processing line: ~ state.current_input = :target~ - Inside source: true *** True Line Result - # Detects which if any click and drag input is occurring -** Processing line: ~ detect_click_and_drag~ + state.current_input = :target +** Processing line: ~ # When the target in the second grid is clicked~ - Inside source: true *** True Line Result - detect_click_and_drag -** Processing line: ~~ + # When the target in the second grid is clicked +** Processing line: ~ elsif target2_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Does the appropriate click and drag input based on the click_and_drag variable~ + elsif target2_clicked? +** Processing line: ~ state.current_input = :target2~ - Inside source: true *** True Line Result - # Does the appropriate click and drag input based on the click_and_drag variable -** Processing line: ~ process_click_and_drag~ + state.current_input = :target2 +** Processing line: ~ # When a wall in the first grid is clicked~ - Inside source: true *** True Line Result - process_click_and_drag -** Processing line: ~ end~ + # When a wall in the first grid is clicked +** Processing line: ~ elsif wall_clicked?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif wall_clicked? +** Processing line: ~ state.current_input = :remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # Detects and Process input for each button~ + state.current_input = :remove_wall +** Processing line: ~ # When a wall in the second grid is clicked~ - Inside source: true *** True Line Result - # Detects and Process input for each button -** Processing line: ~ def input_buttons~ + # When a wall in the second grid is clicked +** Processing line: ~ elsif wall2_clicked?~ - Inside source: true *** True Line Result - def input_buttons -** Processing line: ~ input_left_button~ + elsif wall2_clicked? +** Processing line: ~ state.current_input = :remove_wall2~ - Inside source: true *** True Line Result - input_left_button -** Processing line: ~ input_right_button~ + state.current_input = :remove_wall2 +** Processing line: ~ # When the first grid is clicked~ - Inside source: true *** True Line Result - input_right_button -** Processing line: ~ end~ + # When the first grid is clicked +** Processing line: ~ elsif grid_clicked?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif grid_clicked? +** Processing line: ~ state.current_input = :add_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # Checks if the previous step button is clicked~ + state.current_input = :add_wall +** Processing line: ~ # When the second grid is clicked~ - Inside source: true *** True Line Result - # Checks if the previous step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ + # When the second grid is clicked +** Processing line: ~ elsif grid2_clicked?~ - Inside source: true *** True Line Result - # If it is, it pauses the animation and moves the search one step backward -** Processing line: ~ def input_left_button~ + elsif grid2_clicked? +** Processing line: ~ state.current_input = :add_wall2~ - Inside source: true *** True Line Result - def input_left_button -** Processing line: ~ if left_button_clicked?~ + state.current_input = :add_wall2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - if left_button_clicked? -** Processing line: ~ unless state.anim_steps == 0~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - unless state.anim_steps == 0 -** Processing line: ~ state.anim_steps -= 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.anim_steps -= 1 -** Processing line: ~ recalculate~ + +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ - Inside source: true *** True Line Result - recalculate -** Processing line: ~ end~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_input~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def process_input +** Processing line: ~ if state.current_input == :star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + if state.current_input == :star +** Processing line: ~ input_star~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + input_star +** Processing line: ~ elsif state.current_input == :star2~ - Inside source: true *** True Line Result - -** Processing line: ~ # Checks if the next step button is clicked~ + elsif state.current_input == :star2 +** Processing line: ~ input_star2~ - Inside source: true *** True Line Result - # Checks if the next step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ + input_star2 +** Processing line: ~ elsif state.current_input == :target~ - Inside source: true *** True Line Result - # If it is, it pauses the animation and moves the search one step forward -** Processing line: ~ def input_right_button~ + elsif state.current_input == :target +** Processing line: ~ input_target~ - Inside source: true *** True Line Result - def input_right_button -** Processing line: ~ if right_button_clicked?~ + input_target +** Processing line: ~ elsif state.current_input == :target2~ - Inside source: true *** True Line Result - if right_button_clicked? -** Processing line: ~ unless state.anim_steps == state.max_steps~ + elsif state.current_input == :target2 +** Processing line: ~ input_target2~ - Inside source: true *** True Line Result - unless state.anim_steps == state.max_steps -** Processing line: ~ state.anim_steps += 1~ + input_target2 +** Processing line: ~ elsif state.current_input == :remove_wall~ - Inside source: true *** True Line Result - state.anim_steps += 1 -** Processing line: ~ # Although normally recalculate would be called here~ + elsif state.current_input == :remove_wall +** Processing line: ~ input_remove_wall~ - Inside source: true *** True Line Result - # Although normally recalculate would be called here -** Processing line: ~ # because the right button only moves the search forward~ + input_remove_wall +** Processing line: ~ elsif state.current_input == :remove_wall2~ - Inside source: true *** True Line Result - # because the right button only moves the search forward -** Processing line: ~ # We can just do that~ + elsif state.current_input == :remove_wall2 +** Processing line: ~ input_remove_wall2~ - Inside source: true *** True Line Result - # We can just do that -** Processing line: ~ calc~ + input_remove_wall2 +** Processing line: ~ elsif state.current_input == :add_wall~ - Inside source: true *** True Line Result - calc -** Processing line: ~ end~ + elsif state.current_input == :add_wall +** Processing line: ~ input_add_wall~ - Inside source: true *** True Line Result - end + input_add_wall +** Processing line: ~ elsif state.current_input == :add_wall2~ +- Inside source: true +*** True Line Result + elsif state.current_input == :add_wall2 +** Processing line: ~ input_add_wall2~ +- Inside source: true +*** True Line Result + input_add_wall2 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64088,50 +71763,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Whenever the user edits the grid,~ -- Inside source: true -*** True Line Result - # Whenever the user edits the grid, -** Processing line: ~ # The search has to be recalculated upto the current step~ -- Inside source: true -*** True Line Result - # The search has to be recalculated upto the current step -** Processing line: ~~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def recalculate~ + # Moves the star to the cell closest to the mouse in the first grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - def recalculate -** Processing line: ~ # Resets the search~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - # Resets the search -** Processing line: ~ state.frontier = []~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star~ - Inside source: true *** True Line Result - state.frontier = [] -** Processing line: ~ state.visited = {}~ + def input_star +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - state.visited = {} -** Processing line: ~ state.cell_numbers = []~ + old_star = state.star.clone +** Processing line: ~ state.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - state.cell_numbers = [] -** Processing line: ~~ + state.star = cell_closest_to_mouse +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the animation forward one step at a time~ + unless old_star == state.star +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - # Moves the animation forward one step at a time -** Processing line: ~ state.anim_steps.times { calc }~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.anim_steps.times { calc } + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64140,74 +71807,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Determines what the user is clicking and planning on dragging~ + # Moves the star to the cell closest to the mouse in the second grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - # Determines what the user is clicking and planning on dragging -** Processing line: ~ # Click and drag input is initiated by a click on the appropriate item~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - # Click and drag input is initiated by a click on the appropriate item -** Processing line: ~ # and ended by mouse up~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star2~ - Inside source: true *** True Line Result - # and ended by mouse up -** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ + def input_star2 +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - # Storing the value allows the user to continue the same edit as long as the -** Processing line: ~ # mouse left click is held~ + old_star = state.star.clone +** Processing line: ~ state.star = cell_closest_to_mouse2~ - Inside source: true *** True Line Result - # mouse left click is held -** Processing line: ~ def detect_click_and_drag~ + state.star = cell_closest_to_mouse2 +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - def detect_click_and_drag -** Processing line: ~ if inputs.mouse.up~ + unless old_star == state.star +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ state.click_and_drag = :none~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.click_and_drag = :none -** Processing line: ~ elsif star_clicked?~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif star_clicked? -** Processing line: ~ state.click_and_drag = :star~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.click_and_drag = :star -** Processing line: ~ elsif wall_clicked?~ + +** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ - Inside source: true *** True Line Result - elsif wall_clicked? -** Processing line: ~ state.click_and_drag = :remove_wall~ + # Moves the target to the grid closest to the mouse in the first grid +** Processing line: ~ # Only reset_searchs the search if the target changes position~ - Inside source: true *** True Line Result - state.click_and_drag = :remove_wall -** Processing line: ~ elsif grid_clicked?~ + # Only reset_searchs the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - elsif grid_clicked? -** Processing line: ~ state.click_and_drag = :add_wall~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def input_target~ - Inside source: true *** True Line Result - state.click_and_drag = :add_wall -** Processing line: ~ elsif slider_clicked?~ + def input_target +** Processing line: ~ old_target = state.target.clone~ - Inside source: true *** True Line Result - elsif slider_clicked? -** Processing line: ~ state.click_and_drag = :slider~ + old_target = state.target.clone +** Processing line: ~ state.target = cell_closest_to_mouse~ - Inside source: true *** True Line Result - state.click_and_drag = :slider + state.target = cell_closest_to_mouse +** Processing line: ~ unless old_target == state.target~ +- Inside source: true +*** True Line Result + unless old_target == state.target +** Processing line: ~ reset_search~ +- Inside source: true +*** True Line Result + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64220,46 +71895,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Processes input based on what the user is currently dragging~ -- Inside source: true -*** True Line Result - # Processes input based on what the user is currently dragging -** Processing line: ~ def process_click_and_drag~ -- Inside source: true -*** True Line Result - def process_click_and_drag -** Processing line: ~ if state.click_and_drag == :slider~ +** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - if state.click_and_drag == :slider -** Processing line: ~ input_slider~ + # Moves the target to the cell closest to the mouse in the second grid +** Processing line: ~ # Only reset_searchs the search if the target changes position~ - Inside source: true *** True Line Result - input_slider -** Processing line: ~ elsif state.click_and_drag == :star~ + # Only reset_searchs the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :star -** Processing line: ~ input_star~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def input_target2~ - Inside source: true *** True Line Result - input_star -** Processing line: ~ elsif state.click_and_drag == :remove_wall~ + def input_target2 +** Processing line: ~ old_target = state.target.clone~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :remove_wall -** Processing line: ~ input_remove_wall~ + old_target = state.target.clone +** Processing line: ~ state.target = cell_closest_to_mouse2~ - Inside source: true *** True Line Result - input_remove_wall -** Processing line: ~ elsif state.click_and_drag == :add_wall~ + state.target = cell_closest_to_mouse2 +** Processing line: ~ unless old_target == state.target~ - Inside source: true *** True Line Result - elsif state.click_and_drag == :add_wall -** Processing line: ~ input_add_wall~ + unless old_target == state.target +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - input_add_wall + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64272,102 +71939,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method is called when the user is dragging the slider~ +** Processing line: ~ # Removes walls in the first grid that are under the cursor~ - Inside source: true *** True Line Result - # This method is called when the user is dragging the slider -** Processing line: ~ # It moves the current animation step to the point represented by the slider~ + # Removes walls in the first grid that are under the cursor +** Processing line: ~ def input_remove_wall~ - Inside source: true *** True Line Result - # It moves the current animation step to the point represented by the slider -** Processing line: ~ def input_slider~ + def input_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - def input_slider -** Processing line: ~ mouse_x = inputs.mouse.point.x~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - mouse_x = inputs.mouse.point.x -** Processing line: ~~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - -** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result - # Bounds the mouse_x to the closest x value on the slider line -** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ + if mouse_inside_grid? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - mouse_x = slider.x if mouse_x < slider.x -** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ + if state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w -** Processing line: ~~ + state.walls.delete(cell_closest_to_mouse) +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - -** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Sets the current search step to the one represented by the mouse x value -** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The slider's circle moves due to the render_slider method using anim_steps -** Processing line: ~ state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.anim_steps = ((mouse_x - slider.x) / slider.spacing).to_i + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ recalculate~ -- Inside source: true -*** True Line Result - recalculate -** Processing line: ~ end~ +** Processing line: ~ # Removes walls in the second grid that are under the cursor~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Removes walls in the second grid that are under the cursor +** Processing line: ~ def input_remove_wall2~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the star to the grid closest to the mouse~ + def input_remove_wall2 +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - # Moves the star to the grid closest to the mouse -** Processing line: ~ # Only recalculates the search if the star changes position~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - # Only recalculates the search if the star changes position -** Processing line: ~ # Called whenever the user is dragging the star~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - # Called whenever the user is dragging the star -** Processing line: ~ def input_star~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_inside_grid2?~ - Inside source: true *** True Line Result - def input_star -** Processing line: ~ old_star = state.star.clone~ + if mouse_inside_grid2? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ state.star = cell_closest_to_mouse~ + if state.walls.has_key?(cell_closest_to_mouse2) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse -** Processing line: ~ unless old_star == state.star~ + state.walls.delete(cell_closest_to_mouse2) +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ recalculate~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - recalculate + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64380,42 +72043,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls that are under the cursor -** Processing line: ~ def input_remove_wall~ -- Inside source: true -*** True Line Result - def input_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ -- Inside source: true -*** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ +** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + # Adds a wall in the first grid in the cell the mouse is over +** Processing line: ~ def input_add_wall~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted + def input_add_wall ** Processing line: ~ if mouse_inside_grid?~ - Inside source: true *** True Line Result if mouse_inside_grid? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ + unless state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse) -** Processing line: ~ recalculate~ + state.walls[cell_closest_to_mouse] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - recalculate + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64432,38 +72083,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds walls at cells under the cursor~ -- Inside source: true -*** True Line Result - # Adds walls at cells under the cursor -** Processing line: ~ def input_add_wall~ +** Processing line: ~~ - Inside source: true *** True Line Result - def input_add_wall -** Processing line: ~ # Adds a wall to the hash~ + +** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Adds a wall to the hash -** Processing line: ~ # We can use the grid closest to mouse, because the cursor is inside the grid~ + # Adds a wall in the second grid in the cell the mouse is over +** Processing line: ~ def input_add_wall2~ - Inside source: true *** True Line Result - # We can use the grid closest to mouse, because the cursor is inside the grid -** Processing line: ~ if mouse_inside_grid?~ + def input_add_wall2 +** Processing line: ~ if mouse_inside_grid2?~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ + if mouse_inside_grid2? +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ + unless state.walls.has_key?(cell_closest_to_mouse2) +** Processing line: ~ state.walls[cell_closest_to_mouse2] = true~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse] = true -** Processing line: ~ recalculate~ + state.walls[cell_closest_to_mouse2] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - recalculate + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64480,18 +72127,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method moves the search forward one step~ +** Processing line: ~ # Whenever the user edits the grid,~ - Inside source: true *** True Line Result - # This method moves the search forward one step -** Processing line: ~ # When the animation is playing it is called every tick~ + # Whenever the user edits the grid, +** Processing line: ~ # The search has to be reset_searchd upto the current step~ - Inside source: true *** True Line Result - # When the animation is playing it is called every tick -** Processing line: ~ # And called whenever the current step of the animation needs to be recalculated~ + # The search has to be reset_searchd upto the current step +** Processing line: ~ # with the current grid as the initial state of the grid~ +- Inside source: true +*** True Line Result + # with the current grid as the initial state of the grid +** Processing line: ~ def reset_search~ +- Inside source: true +*** True Line Result + def reset_search +** Processing line: ~ # Reset_Searchs the search~ +- Inside source: true +*** True Line Result + # Reset_Searchs the search +** Processing line: ~ state.frontier = []~ +- Inside source: true +*** True Line Result + state.frontier = [] +** Processing line: ~ state.visited = {}~ +- Inside source: true +*** True Line Result + state.visited = {} +** Processing line: ~ state.early_exit_visited = {}~ +- Inside source: true +*** True Line Result + state.early_exit_visited = {} +** Processing line: ~ state.came_from = {}~ +- Inside source: true +*** True Line Result + state.came_from = {} +** Processing line: ~ state.path = {}~ +- Inside source: true +*** True Line Result + state.path = {} +** Processing line: ~ end~ - Inside source: true *** True Line Result - # And called whenever the current step of the animation needs to be recalculated + end ** Processing line: ~~ - Inside source: true *** True Line Result @@ -64500,38 +72179,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Moves the search forward one step -** Processing line: ~ # Parameter called_from_tick is true if it is called from the tick method~ +** Processing line: ~ def step~ - Inside source: true *** True Line Result - # Parameter called_from_tick is true if it is called from the tick method -** Processing line: ~ # It is false when the search is being recalculated after user editing the grid~ + def step +** Processing line: ~ # The setup to the search~ - Inside source: true *** True Line Result - # It is false when the search is being recalculated after user editing the grid -** Processing line: ~ def calc~ + # The setup to the search +** Processing line: ~ # Runs once when there are no visited cells~ - Inside source: true *** True Line Result - def calc -** Processing line: ~ # The setup to the search~ + # Runs once when there are no visited cells +** Processing line: ~ if state.visited.empty?~ - Inside source: true *** True Line Result - # The setup to the search -** Processing line: ~ # Runs once when the there is no frontier or visited cells~ + if state.visited.empty? +** Processing line: ~ state.visited[state.star] = true~ - Inside source: true *** True Line Result - # Runs once when the there is no frontier or visited cells -** Processing line: ~ if state.frontier.empty? && state.visited.empty?~ + state.visited[state.star] = true +** Processing line: ~ state.early_exit_visited[state.star] = true~ - Inside source: true *** True Line Result - if state.frontier.empty? && state.visited.empty? + state.early_exit_visited[state.star] = true ** Processing line: ~ state.frontier << state.star~ - Inside source: true *** True Line Result state.frontier << state.star -** Processing line: ~ state.visited[state.star] = true~ +** Processing line: ~ state.came_from[state.star] = nil~ - Inside source: true *** True Line Result - state.visited[state.star] = true + state.came_from[state.star] = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64572,30 +72251,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited~ -- Inside source: true -*** True Line Result - # Add them to the frontier and mark them as visited -** Processing line: ~ state.frontier << neighbor~ +** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ - Inside source: true *** True Line Result - state.frontier << neighbor + # Add them to the frontier and mark them as visited in the first grid ** Processing line: ~ state.visited[neighbor] = true~ - Inside source: true *** True Line Result state.visited[neighbor] = true +** Processing line: ~ # Unless the target has been visited~ +- Inside source: true +*** True Line Result + # Unless the target has been visited +** Processing line: ~ unless state.visited.has_key?(state.target)~ +- Inside source: true +*** True Line Result + unless state.visited.has_key?(state.target) +** Processing line: ~ # Mark the neighbor as visited in the second grid as well~ +- Inside source: true +*** True Line Result + # Mark the neighbor as visited in the second grid as well +** Processing line: ~ state.early_exit_visited[neighbor] = true~ +- Inside source: true +*** True Line Result + state.early_exit_visited[neighbor] = true +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Also assign them a frontier number~ +** Processing line: ~ # Add the neighbor to the frontier and remember which cell it came from~ - Inside source: true *** True Line Result - # Also assign them a frontier number -** Processing line: ~ state.cell_numbers << neighbor~ + # Add the neighbor to the frontier and remember which cell it came from +** Processing line: ~ state.frontier << neighbor~ - Inside source: true *** True Line Result - state.cell_numbers << neighbor + state.frontier << neighbor +** Processing line: ~ state.came_from[neighbor] = new_frontier~ +- Inside source: true +*** True Line Result + state.came_from[neighbor] = new_frontier ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64628,10 +72327,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Used to determine what the next cells to be added to the frontier are -** Processing line: ~ def adjacent_neighbors cell~ +** Processing line: ~ def adjacent_neighbors(cell)~ - Inside source: true *** True Line Result - def adjacent_neighbors cell + def adjacent_neighbors(cell) ** Processing line: ~ neighbors = []~ - Inside source: true *** True Line Result @@ -64640,14 +72339,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ +** Processing line: ~ # Gets all the valid neighbors into the array~ - Inside source: true *** True Line Result - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 -** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ + # Gets all the valid neighbors into the array +** Processing line: ~ # From southern neighbor, clockwise~ - Inside source: true *** True Line Result - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 + # From southern neighbor, clockwise ** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ - Inside source: true *** True Line Result @@ -64656,6 +72355,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result neighbors << [cell.x - 1, cell.y] unless cell.x == 0 +** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ +- Inside source: true +*** True Line Result + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 +** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ +- Inside source: true +*** True Line Result + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ +- Inside source: true +*** True Line Result + # Sorts the neighbors so the rendered path is a zigzag path +** Processing line: ~ # Cells in a diagonal direction are given priority~ +- Inside source: true +*** True Line Result + # Cells in a diagonal direction are given priority +** Processing line: ~ # Comment this line to see the difference~ +- Inside source: true +*** True Line Result + # Comment this line to see the difference +** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ +- Inside source: true +*** True Line Result + neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } ** Processing line: ~~ - Inside source: true *** True Line Result @@ -64672,6 +72399,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ +- Inside source: true +*** True Line Result + # Finds the vertical and horizontal distance of a cell from the star +** Processing line: ~ # and returns the larger value~ +- Inside source: true +*** True Line Result + # and returns the larger value +** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ +- Inside source: true +*** True Line Result + # This method is used to have a zigzag pattern in the rendered path +** Processing line: ~ # A cell that is [5, 5] from the star,~ +- Inside source: true +*** True Line Result + # A cell that is [5, 5] from the star, +** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ +- Inside source: true +*** True Line Result + # is explored before over a cell that is [0, 7] away. +** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ +- Inside source: true +*** True Line Result + # So, if possible, the search tries to go diagonal (zigzag) first +** Processing line: ~ def proximity_to_star(x, y)~ +- Inside source: true +*** True Line Result + def proximity_to_star(x, y) +** Processing line: ~ distance_x = (state.star.x - x).abs~ +- Inside source: true +*** True Line Result + distance_x = (state.star.x - x).abs +** Processing line: ~ distance_y = (state.star.y - y).abs~ +- Inside source: true +*** True Line Result + distance_y = (state.star.y - y).abs +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if distance_x > distance_y~ +- Inside source: true +*** True Line Result + if distance_x > distance_y +** Processing line: ~ return distance_x~ +- Inside source: true +*** True Line Result + return distance_x +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ return distance_y~ +- Inside source: true +*** True Line Result + return distance_y +** 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: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result @@ -64680,14 +72475,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the grid closest to the mouse helps with this~ +** Processing line: ~ # Finding the cell closest to the mouse helps with this~ - Inside source: true *** True Line Result - # Finding the grid closest to the mouse helps with this + # Finding the cell closest to the mouse helps with this ** Processing line: ~ def cell_closest_to_mouse~ - Inside source: true *** True Line Result def cell_closest_to_mouse +** Processing line: ~ # Closest cell to the mouse in the first grid~ +- Inside source: true +*** True Line Result + # Closest cell to the mouse in the first grid ** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result @@ -64696,6 +72495,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Bound x and y to the grid~ +- Inside source: true +*** True Line Result + # Bound x and y to the grid ** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result @@ -64704,6 +72507,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ +- Inside source: true +*** True Line Result + # Return closest cell ** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result @@ -64716,70 +72523,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # These methods detect when the buttons are clicked~ -- Inside source: true -*** True Line Result - # These methods detect when the buttons are clicked -** Processing line: ~ def left_button_clicked?~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - def left_button_clicked? -** Processing line: ~ (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)) || inputs.keyboard.key_up.left~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.left)) || inputs.keyboard.key_up.left -** Processing line: ~ end~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Finding the cell closest to the mouse in the second grid helps with this +** Processing line: ~ def cell_closest_to_mouse2~ - Inside source: true *** True Line Result - -** Processing line: ~ def right_button_clicked?~ + def cell_closest_to_mouse2 +** Processing line: ~ # Closest cell grid to the mouse in the second~ - Inside source: true *** True Line Result - def right_button_clicked? -** Processing line: ~ (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)) || inputs.keyboard.key_up.right~ + # Closest cell grid to the mouse in the second +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - (inputs.mouse.up && inputs.mouse.point.inside_rect?(buttons.right)) || inputs.keyboard.key_up.right -** Processing line: ~ end~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Translate the cell to the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the slider~ + # Translate the cell to the first grid +** Processing line: ~ x -= grid.width + 1~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the slider -** Processing line: ~ def slider_clicked?~ + x -= grid.width + 1 +** Processing line: ~ # Bound x and y to the first grid~ - Inside source: true *** True Line Result - def slider_clicked? -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing)~ + # Bound x and y to the first grid +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - circle_x = (slider.x - slider.offset) + (state.anim_steps * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect)~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(circle_rect) + [x, y] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64788,10 +72587,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the star~ +** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star + # Signal that the user is going to be moving the star from the first grid ** Processing line: ~ def star_clicked?~ - Inside source: true *** True Line Result @@ -64808,18 +72607,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls~ +** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls -** Processing line: ~ def wall_clicked?~ + # Signal that the user is going to be moving the star from the second grid +** Processing line: ~ def star2_clicked?~ - Inside source: true *** True Line Result - def wall_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_a_wall?~ + def star2_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.star))~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_a_wall? + inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64828,18 +72627,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls~ +** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls -** Processing line: ~ def grid_clicked?~ + # Signal that the user is going to be moving the target from the first grid +** Processing line: ~ def target_clicked?~ - Inside source: true *** True Line Result - def grid_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ + def target_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.target))~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_grid? + inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64848,38 +72647,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a wall~ +** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of a wall -** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ + # Signal that the user is going to be moving the target from the second grid +** Processing line: ~ def target2_clicked?~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is removing a wall -** Processing line: ~ def mouse_inside_a_wall?~ + def target2_clicked? +** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.target))~ - Inside source: true *** True Line Result - def mouse_inside_a_wall? -** Processing line: ~ state.walls.each_key do | wall |~ + inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.target)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(scale_up(wall)) -** Processing line: ~ end~ + +** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Signal that the user is going to be removing walls from the first grid +** Processing line: ~ def wall_clicked?~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + def wall_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_wall?~ - Inside source: true *** True Line Result - false + inputs.mouse.down && mouse_inside_wall? ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64888,22 +72687,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a grid~ -- Inside source: true -*** True Line Result - # Returns whether the mouse is inside of a grid -** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ +** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is adding a wall -** Processing line: ~ def mouse_inside_grid?~ + # Signal that the user is going to be removing walls from the second grid +** Processing line: ~ def wall2_clicked?~ - Inside source: true *** True Line Result - def mouse_inside_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height]))~ + def wall2_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_wall2?~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(scale_up([0, 0, grid.width, grid.height])) + inputs.mouse.down && mouse_inside_wall2? ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64912,26 +72707,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods provide handy aliases to colors~ +** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ - Inside source: true *** True Line Result - # These methods provide handy aliases to colors + # Signal that the user is going to be adding walls from the first grid +** Processing line: ~ def grid_clicked?~ +- Inside source: true +*** True Line Result + def grid_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ +- Inside source: true +*** True Line Result + inputs.mouse.down && mouse_inside_grid? +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Light brown~ +** Processing line: ~ # Signal that the user is going to be adding walls from the second grid~ - Inside source: true *** True Line Result - # Light brown -** Processing line: ~ def unvisited_color~ + # Signal that the user is going to be adding walls from the second grid +** Processing line: ~ def grid2_clicked?~ - Inside source: true *** True Line Result - def unvisited_color -** Processing line: ~ [221, 212, 213]~ + def grid2_clicked? +** Processing line: ~ inputs.mouse.down && mouse_inside_grid2?~ - Inside source: true *** True Line Result - [221, 212, 213] + inputs.mouse.down && mouse_inside_grid2? ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64940,38 +72747,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Black~ +** Processing line: ~ # Returns whether the mouse is inside of a wall in the first grid~ - Inside source: true *** True Line Result - # Black -** Processing line: ~ def grid_line_color~ + # Returns whether the mouse is inside of a wall in the first grid +** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ - Inside source: true *** True Line Result - def grid_line_color -** Processing line: ~ [255, 255, 255]~ + # Part of the condition that checks whether the user is removing a wall +** Processing line: ~ def mouse_inside_wall?~ - Inside source: true *** True Line Result - [255, 255, 255] -** Processing line: ~ end~ + def mouse_inside_wall? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ - Inside source: true *** True Line Result - -** Processing line: ~ # Dark Brown~ + return true if inputs.mouse.point.inside_rect?(scale_up(wall)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Dark Brown -** Processing line: ~ def visited_color~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def visited_color -** Processing line: ~ [204, 191, 179]~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - [204, 191, 179] + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -64980,38 +72787,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Blue~ +** Processing line: ~ # Returns whether the mouse is inside of a wall in the second grid~ - Inside source: true *** True Line Result - # Blue -** Processing line: ~ def frontier_color~ + # Returns whether the mouse is inside of a wall in the second grid +** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ - Inside source: true *** True Line Result - def frontier_color -** Processing line: ~ [103, 136, 204]~ + # Part of the condition that checks whether the user is removing a wall +** Processing line: ~ def mouse_inside_wall2?~ - Inside source: true *** True Line Result - [103, 136, 204] -** Processing line: ~ end~ + def mouse_inside_wall2? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(early_exit_scale_up(wall))~ - Inside source: true *** True Line Result - -** Processing line: ~ # Camo Green~ + return true if inputs.mouse.point.inside_rect?(early_exit_scale_up(wall)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Camo Green -** Processing line: ~ def wall_color~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def wall_color -** Processing line: ~ [134, 134, 120]~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - [134, 134, 120] + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65020,18 +72827,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Next frontier to be expanded~ +** Processing line: ~ # Returns whether the mouse is inside of the first grid~ - Inside source: true *** True Line Result - # Next frontier to be expanded -** Processing line: ~ def highlighter_yellow~ + # Returns whether the mouse is inside of the first grid +** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ - Inside source: true *** True Line Result - def highlighter_yellow -** Processing line: ~ [214, 231, 125]~ + # Part of the condition that checks whether the user is adding a wall +** Processing line: ~ def mouse_inside_grid?~ - Inside source: true *** True Line Result - [214, 231, 125] + def mouse_inside_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ +- Inside source: true +*** True Line Result + inputs.mouse.point.inside_rect?(scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65040,18 +72851,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # The neighbors of the next frontier to be expanded~ +** Processing line: ~ # Returns whether the mouse is inside of the second grid~ - Inside source: true *** True Line Result - # The neighbors of the next frontier to be expanded -** Processing line: ~ def highlighter_green~ + # Returns whether the mouse is inside of the second grid +** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ - Inside source: true *** True Line Result - def highlighter_green -** Processing line: ~ [65, 191, 127]~ + # Part of the condition that checks whether the user is adding a wall +** Processing line: ~ def mouse_inside_grid2?~ - Inside source: true *** True Line Result - [65, 191, 127] + def mouse_inside_grid2? +** Processing line: ~ inputs.mouse.point.inside_rect?(early_exit_scale_up(grid.rect))~ +- Inside source: true +*** True Line Result + inputs.mouse.point.inside_rect?(early_exit_scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65060,18 +72875,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Button background~ +** Processing line: ~ # These methods provide handy aliases to colors~ - Inside source: true *** True Line Result - # Button background -** Processing line: ~ def gray~ + # These methods provide handy aliases to colors +** Processing line: ~~ - Inside source: true *** True Line Result - def gray -** Processing line: ~ [190, 190, 190]~ + +** Processing line: ~ # Light brown~ - Inside source: true *** True Line Result - [190, 190, 190] + # Light brown +** Processing line: ~ def unvisited_color~ +- Inside source: true +*** True Line Result + def unvisited_color +** Processing line: ~ [221, 212, 213]~ +- Inside source: true +*** True Line Result + [221, 212, 213] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65080,18 +72903,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Button outline~ +** Processing line: ~ # Camo Green~ - Inside source: true *** True Line Result - # Button outline -** Processing line: ~ def black~ + # Camo Green +** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result - def black -** Processing line: ~ [0, 0, 0]~ + def wall_color +** Processing line: ~ [134, 134, 120]~ - Inside source: true *** True Line Result - [0, 0, 0] + [134, 134, 120] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65100,18 +72923,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods make the code more concise~ +** Processing line: ~ # Pastel White~ - Inside source: true *** True Line Result - # These methods make the code more concise -** Processing line: ~ def grid~ + # Pastel White +** Processing line: ~ def path_color~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + def path_color +** Processing line: ~ [231, 230, 228]~ - Inside source: true *** True Line Result - state.grid + [231, 230, 228] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65120,14 +72943,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def buttons~ +** Processing line: ~ def red~ - Inside source: true *** True Line Result - def buttons -** Processing line: ~ state.buttons~ + def red +** Processing line: ~ [255, 0, 0]~ - Inside source: true *** True Line Result - state.buttons + [255, 0, 0] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65136,14 +72959,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def slider~ +** Processing line: ~ # Makes code more concise~ - Inside source: true *** True Line Result - def slider -** Processing line: ~ state.slider~ + # Makes code more concise +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - state.slider + def grid +** Processing line: ~ state.grid~ +- Inside source: true +*** True Line Result + state.grid ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65156,18 +72983,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ # Method that is called by DragonRuby periodically~ - Inside source: true *** True Line Result - + # Method that is called by DragonRuby periodically +** Processing line: ~ # Used for updating animations and calculations~ +- Inside source: true +*** True Line Result + # Used for updating animations and calculations ** Processing line: ~ def tick args~ - Inside source: true *** True Line Result def tick args -** Processing line: ~ # Pressing r resets the program~ +** Processing line: ~~ - Inside source: true *** True Line Result - # Pressing r resets the program + +** Processing line: ~ # Pressing r will reset the application~ +- Inside source: true +*** True Line Result + # Pressing r will reset the application ** Processing line: ~ if args.inputs.keyboard.key_down.r~ - Inside source: true *** True Line Result @@ -65192,18 +73027,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ $detailed_breadth_first_search ||= DetailedBreadthFirstSearch.new(args)~ +** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ - Inside source: true *** True Line Result - $detailed_breadth_first_search ||= DetailedBreadthFirstSearch.new(args) -** Processing line: ~ $detailed_breadth_first_search.args = args~ + # Every tick, new args are passed, and the Breadth First Search tick is called +** Processing line: ~ $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)~ - Inside source: true *** True Line Result - $detailed_breadth_first_search.args = args -** Processing line: ~ $detailed_breadth_first_search.tick~ + $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args) +** Processing line: ~ $early_exit_breadth_first_search.args = args~ - Inside source: true *** True Line Result - $detailed_breadth_first_search.tick + $early_exit_breadth_first_search.args = args +** Processing line: ~ $early_exit_breadth_first_search.tick~ +- Inside source: true +*** True Line Result + $early_exit_breadth_first_search.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65220,10 +73059,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def reset -** Processing line: ~ $detailed_breadth_first_search = nil~ +** Processing line: ~ $early_exit_breadth_first_search = nil~ - Inside source: true *** True Line Result - $detailed_breadth_first_search = nil + $early_exit_breadth_first_search = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65240,26 +73079,74 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Path Finding Algorithms - Breadcrumbs - main.rb~ +** Processing line: ~*** Path Finding Algorithms - Dijkstra - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Path Finding Algorithms - Breadcrumbs - main.rb +*** Path Finding Algorithms - Dijkstra - 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/13_path_finding_algorithms/03_breadcrumbs/app/main.rb~ +** Processing line: ~ # ./samples/13_path_finding_algorithms/05_dijkstra/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb -** Processing line: ~ class Breadcrumbs~ + # ./samples/13_path_finding_algorithms/05_dijkstra/app/main.rb +** Processing line: ~ # Demonstrates how Dijkstra's Algorithm allows movement costs to be considered~ - Inside source: true *** True Line Result - class Breadcrumbs + # Demonstrates how Dijkstra's Algorithm allows movement costs to be considered +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ +- Inside source: true +*** True Line Result + # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # The first grid is a breadth first search with an early exit.~ +- Inside source: true +*** True Line Result + # The first grid is a breadth first search with an early exit. +** Processing line: ~ # It shows a heat map of all the cells that were visited by the search and their relative distance.~ +- Inside source: true +*** True Line Result + # It shows a heat map of all the cells that were visited by the search and their relative distance. +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # The second grid is an implementation of Dijkstra's algorithm.~ +- Inside source: true +*** True Line Result + # The second grid is an implementation of Dijkstra's algorithm. +** Processing line: ~ # Light green cells have 5 times the movement cost of regular cells.~ +- Inside source: true +*** True Line Result + # Light green cells have 5 times the movement cost of regular cells. +** Processing line: ~ # The heat map will darken based on movement cost.~ +- Inside source: true +*** True Line Result + # The heat map will darken based on movement cost. +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Dark green cells are walls, and the search cannot go through them.~ +- Inside source: true +*** True Line Result + # Dark green cells are walls, and the search cannot go through them. +** Processing line: ~ class Movement_Costs~ +- Inside source: true +*** True Line Result + class Movement_Costs ** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result @@ -65292,26 +73179,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result defaults -** Processing line: ~ # If the grid has not been searched~ -- Inside source: true -*** True Line Result - # If the grid has not been searched -** Processing line: ~ if search.came_from.empty?~ -- Inside source: true -*** True Line Result - if search.came_from.empty? -** Processing line: ~ calc~ -- Inside source: true -*** True Line Result - calc -** Processing line: ~ # Calc Path~ -- Inside source: true -*** True Line Result - # Calc Path -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~ render~ - Inside source: true *** True Line Result @@ -65320,6 +73187,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result input +** Processing line: ~ calc~ +- Inside source: true +*** True Line Result + calc ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65340,18 +73211,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Freely customizable to user's liking -** Processing line: ~ grid.width ||= 30~ +** Processing line: ~ grid.width ||= 10~ - Inside source: true *** True Line Result - grid.width ||= 30 -** Processing line: ~ grid.height ||= 15~ + grid.width ||= 10 +** Processing line: ~ grid.height ||= 10~ - Inside source: true *** True Line Result - grid.height ||= 15 -** Processing line: ~ grid.cell_size ||= 40~ + grid.height ||= 10 +** Processing line: ~ grid.cell_size ||= 60~ - Inside source: true *** True Line Result - grid.cell_size ||= 40 + grid.cell_size ||= 60 ** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result @@ -65372,538 +73243,234 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Walls are stored in a hash for quick look up when doing the search -** Processing line: ~ grid.star ||= [2, 8]~ -- Inside source: true -*** True Line Result - grid.star ||= [2, 8] -** Processing line: ~ grid.target ||= [10, 5]~ -- Inside source: true -*** True Line Result - grid.target ||= [10, 5] -** Processing line: ~ grid.walls ||= {~ -- Inside source: true -*** True Line Result - grid.walls ||= { -** Processing line: ~ [3, 3] => true,~ +** Processing line: ~ state.star ||= [1, 5]~ - Inside source: true *** True Line Result - [3, 3] => true, -** Processing line: ~ [3, 4] => true,~ + state.star ||= [1, 5] +** Processing line: ~ state.target ||= [8, 4]~ - Inside source: true *** True Line Result - [3, 4] => true, -** Processing line: ~ [3, 5] => true,~ + state.target ||= [8, 4] +** Processing line: ~ state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true}~ - Inside source: true *** True Line Result - [3, 5] => true, -** Processing line: ~ [3, 6] => true,~ + state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true} +** Processing line: ~ state.hills ||= {~ - Inside source: true *** True Line Result - [3, 6] => true, -** Processing line: ~ [3, 7] => true,~ + state.hills ||= { +** Processing line: ~ [4, 1] => true,~ - Inside source: true *** True Line Result - [3, 7] => true, -** Processing line: ~ [3, 8] => true,~ + [4, 1] => true, +** Processing line: ~ [5, 1] => true,~ - Inside source: true *** True Line Result - [3, 8] => true, -** Processing line: ~ [3, 9] => true,~ + [5, 1] => true, +** Processing line: ~ [4, 2] => true,~ - Inside source: true *** True Line Result - [3, 9] => true, -** Processing line: ~ [3, 10] => true,~ + [4, 2] => true, +** Processing line: ~ [5, 2] => true,~ - Inside source: true *** True Line Result - [3, 10] => true, -** Processing line: ~ [3, 11] => true,~ + [5, 2] => true, +** Processing line: ~ [6, 2] => true,~ - Inside source: true *** True Line Result - [3, 11] => true, + [6, 2] => true, ** Processing line: ~ [4, 3] => true,~ - Inside source: true *** True Line Result [4, 3] => true, -** Processing line: ~ [4, 4] => true,~ -- Inside source: true -*** True Line Result - [4, 4] => true, -** Processing line: ~ [4, 5] => true,~ -- Inside source: true -*** True Line Result - [4, 5] => true, -** Processing line: ~ [4, 6] => true,~ -- Inside source: true -*** True Line Result - [4, 6] => true, -** Processing line: ~ [4, 7] => true,~ -- Inside source: true -*** True Line Result - [4, 7] => true, -** Processing line: ~ [4, 8] => true,~ -- Inside source: true -*** True Line Result - [4, 8] => true, -** Processing line: ~ [4, 9] => true,~ -- Inside source: true -*** True Line Result - [4, 9] => true, -** Processing line: ~ [4, 10] => true,~ -- Inside source: true -*** True Line Result - [4, 10] => true, -** Processing line: ~ [4, 11] => true,~ -- Inside source: true -*** True Line Result - [4, 11] => true, -** Processing line: ~ [13, 0] => true,~ -- Inside source: true -*** True Line Result - [13, 0] => true, -** Processing line: ~ [13, 1] => true,~ -- Inside source: true -*** True Line Result - [13, 1] => true, -** Processing line: ~ [13, 2] => true,~ -- Inside source: true -*** True Line Result - [13, 2] => true, -** Processing line: ~ [13, 3] => true,~ -- Inside source: true -*** True Line Result - [13, 3] => true, -** Processing line: ~ [13, 4] => true,~ -- Inside source: true -*** True Line Result - [13, 4] => true, -** Processing line: ~ [13, 5] => true,~ -- Inside source: true -*** True Line Result - [13, 5] => true, -** Processing line: ~ [13, 6] => true,~ -- Inside source: true -*** True Line Result - [13, 6] => true, -** Processing line: ~ [13, 7] => true,~ -- Inside source: true -*** True Line Result - [13, 7] => true, -** Processing line: ~ [13, 8] => true,~ -- Inside source: true -*** True Line Result - [13, 8] => true, -** Processing line: ~ [13, 9] => true,~ -- Inside source: true -*** True Line Result - [13, 9] => true, -** Processing line: ~ [13, 10] => true,~ -- Inside source: true -*** True Line Result - [13, 10] => true, -** Processing line: ~ [14, 0] => true,~ -- Inside source: true -*** True Line Result - [14, 0] => true, -** Processing line: ~ [14, 1] => true,~ -- Inside source: true -*** True Line Result - [14, 1] => true, -** Processing line: ~ [14, 2] => true,~ -- Inside source: true -*** True Line Result - [14, 2] => true, -** Processing line: ~ [14, 3] => true,~ -- Inside source: true -*** True Line Result - [14, 3] => true, -** Processing line: ~ [14, 4] => true,~ -- Inside source: true -*** True Line Result - [14, 4] => true, -** Processing line: ~ [14, 5] => true,~ -- Inside source: true -*** True Line Result - [14, 5] => true, -** Processing line: ~ [14, 6] => true,~ -- Inside source: true -*** True Line Result - [14, 6] => true, -** Processing line: ~ [14, 7] => true,~ -- Inside source: true -*** True Line Result - [14, 7] => true, -** Processing line: ~ [14, 8] => true,~ -- Inside source: true -*** True Line Result - [14, 8] => true, -** Processing line: ~ [14, 9] => true,~ -- Inside source: true -*** True Line Result - [14, 9] => true, -** Processing line: ~ [14, 10] => true,~ -- Inside source: true -*** True Line Result - [14, 10] => true, -** Processing line: ~ [21, 8] => true,~ -- Inside source: true -*** True Line Result - [21, 8] => true, -** Processing line: ~ [21, 9] => true,~ -- Inside source: true -*** True Line Result - [21, 9] => true, -** Processing line: ~ [21, 10] => true,~ -- Inside source: true -*** True Line Result - [21, 10] => true, -** Processing line: ~ [21, 11] => true,~ -- Inside source: true -*** True Line Result - [21, 11] => true, -** Processing line: ~ [21, 12] => true,~ -- Inside source: true -*** True Line Result - [21, 12] => true, -** Processing line: ~ [21, 13] => true,~ -- Inside source: true -*** True Line Result - [21, 13] => true, -** Processing line: ~ [21, 14] => true,~ -- Inside source: true -*** True Line Result - [21, 14] => true, -** Processing line: ~ [22, 8] => true,~ -- Inside source: true -*** True Line Result - [22, 8] => true, -** Processing line: ~ [22, 9] => true,~ -- Inside source: true -*** True Line Result - [22, 9] => true, -** Processing line: ~ [22, 10] => true,~ -- Inside source: true -*** True Line Result - [22, 10] => true, -** Processing line: ~ [22, 11] => true,~ -- Inside source: true -*** True Line Result - [22, 11] => true, -** Processing line: ~ [22, 12] => true,~ -- Inside source: true -*** True Line Result - [22, 12] => true, -** Processing line: ~ [22, 13] => true,~ -- Inside source: true -*** True Line Result - [22, 13] => true, -** Processing line: ~ [22, 14] => true,~ -- Inside source: true -*** True Line Result - [22, 14] => true, -** Processing line: ~ [23, 8] => true,~ -- Inside source: true -*** True Line Result - [23, 8] => true, -** Processing line: ~ [23, 9] => true,~ -- Inside source: true -*** True Line Result - [23, 9] => true, -** Processing line: ~ [24, 8] => true,~ -- Inside source: true -*** True Line Result - [24, 8] => true, -** Processing line: ~ [24, 9] => true,~ -- Inside source: true -*** True Line Result - [24, 9] => true, -** Processing line: ~ [25, 8] => true,~ -- Inside source: true -*** True Line Result - [25, 8] => true, -** Processing line: ~ [25, 9] => true,~ -- Inside source: true -*** True Line Result - [25, 9] => true, -** Processing line: ~ }~ -- Inside source: true -*** True Line Result - } -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Variables that are used by the breadth first search~ -- Inside source: true -*** True Line Result - # Variables that are used by the breadth first search -** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ -- Inside source: true -*** True Line Result - # Storing cells that the search has visited, prevents unnecessary steps -** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ -- Inside source: true -*** True Line Result - # Expanding the frontier of the search in order makes the search expand -** Processing line: ~ # from the center outward~ -- Inside source: true -*** True Line Result - # from the center outward -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The cells from which the search is to expand~ -- Inside source: true -*** True Line Result - # The cells from which the search is to expand -** Processing line: ~ search.frontier ||= []~ -- Inside source: true -*** True Line Result - search.frontier ||= [] -** Processing line: ~ # A hash of where each cell was expanded from~ -- Inside source: true -*** True Line Result - # A hash of where each cell was expanded from -** Processing line: ~ # The key is a cell, and the value is the cell it came from~ -- Inside source: true -*** True Line Result - # The key is a cell, and the value is the cell it came from -** Processing line: ~ search.came_from ||= {}~ -- Inside source: true -*** True Line Result - search.came_from ||= {} -** Processing line: ~ # Cells that are part of the path from the target to the star~ -- Inside source: true -*** True Line Result - # Cells that are part of the path from the target to the star -** Processing line: ~ search.path ||= {}~ -- Inside source: true -*** True Line Result - search.path ||= {} -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # What the user is currently editing on the grid~ -- Inside source: true -*** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # We store this value, because we want to remember the value even when~ -- Inside source: true -*** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ -- Inside source: true -*** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ -- Inside source: true -*** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ state.current_input ||= :none~ -- Inside source: true -*** True Line Result - state.current_input ||= :none -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def calc~ -- Inside source: true -*** True Line Result - def calc -** Processing line: ~ # Setup the search to start from the star~ +** Processing line: ~ [5, 3] => true,~ - Inside source: true *** True Line Result - # Setup the search to start from the star -** Processing line: ~ search.frontier << grid.star~ + [5, 3] => true, +** Processing line: ~ [6, 3] => true,~ - Inside source: true *** True Line Result - search.frontier << grid.star -** Processing line: ~ search.came_from[grid.star] = nil~ + [6, 3] => true, +** Processing line: ~ [3, 4] => true,~ - Inside source: true *** True Line Result - search.came_from[grid.star] = nil -** Processing line: ~~ + [3, 4] => true, +** Processing line: ~ [4, 4] => true,~ - Inside source: true *** True Line Result - -** Processing line: ~ # Until there are no more cells to expand from~ + [4, 4] => true, +** Processing line: ~ [5, 4] => true,~ - Inside source: true *** True Line Result - # Until there are no more cells to expand from -** Processing line: ~ until search.frontier.empty?~ + [5, 4] => true, +** Processing line: ~ [6, 4] => true,~ - Inside source: true *** True Line Result - until search.frontier.empty? -** Processing line: ~ # Takes the next frontier cell~ + [6, 4] => true, +** Processing line: ~ [7, 4] => true,~ - Inside source: true *** True Line Result - # Takes the next frontier cell -** Processing line: ~ new_frontier = search.frontier.shift~ + [7, 4] => true, +** Processing line: ~ [3, 5] => true,~ - Inside source: true *** True Line Result - new_frontier = search.frontier.shift -** Processing line: ~ # For each of its neighbors~ + [3, 5] => true, +** Processing line: ~ [4, 5] => true,~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ + [4, 5] => true, +** Processing line: ~ [5, 5] => true,~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do |neighbor| -** Processing line: ~ # That have not been visited and are not walls~ + [5, 5] => true, +** Processing line: ~ [6, 5] => true,~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ + [6, 5] => true, +** Processing line: ~ [7, 5] => true,~ - Inside source: true *** True Line Result - unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ + [7, 5] => true, +** Processing line: ~ [4, 6] => true,~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited in the first grid -** Processing line: ~ # Unless the target has been visited~ + [4, 6] => true, +** Processing line: ~ [5, 6] => true,~ - Inside source: true *** True Line Result - # Unless the target has been visited -** Processing line: ~ # Add the neighbor to the frontier and remember which cell it came from~ + [5, 6] => true, +** Processing line: ~ [6, 6] => true,~ - Inside source: true *** True Line Result - # Add the neighbor to the frontier and remember which cell it came from -** Processing line: ~ search.frontier << neighbor~ + [6, 6] => true, +** Processing line: ~ [7, 6] => true,~ - Inside source: true *** True Line Result - search.frontier << neighbor -** Processing line: ~ search.came_from[neighbor] = new_frontier~ + [7, 6] => true, +** Processing line: ~ [4, 7] => true,~ - Inside source: true *** True Line Result - search.came_from[neighbor] = new_frontier -** Processing line: ~ end~ + [4, 7] => true, +** Processing line: ~ [5, 7] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + [5, 7] => true, +** Processing line: ~ [6, 7] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + [6, 7] => true, +** Processing line: ~ [4, 8] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + [4, 8] => true, +** Processing line: ~ [5, 8] => true,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [5, 8] => true, +** Processing line: ~ }~ - Inside source: true *** True Line Result - + } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Draws everything onto the screen~ +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - # Draws everything onto the screen -** Processing line: ~ def render~ + # What the user is currently editing on the grid +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - def render -** Processing line: ~ render_background~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - render_background -** Processing line: ~ # render_heat_map~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - # render_heat_map -** Processing line: ~ render_walls~ + # they are still clicking down on the mouse. +** Processing line: ~ state.user_input ||= :none~ - Inside source: true *** True Line Result - render_walls -** Processing line: ~ # render_path~ + state.user_input ||= :none +** Processing line: ~~ - Inside source: true *** True Line Result - # render_path -** Processing line: ~ # render_labels~ + +** Processing line: ~ # Values that are used for the breadth first search~ - Inside source: true *** True Line Result - # render_labels -** Processing line: ~ render_arrows~ + # Values that are used for the breadth first search +** Processing line: ~ # Keeping track of what cells were visited prevents counting cells multiple times~ - Inside source: true *** True Line Result - render_arrows -** Processing line: ~ render_star~ + # Keeping track of what cells were visited prevents counting cells multiple times +** Processing line: ~ breadth_first_search.visited ||= {}~ - Inside source: true *** True Line Result - render_star -** Processing line: ~ render_target~ + breadth_first_search.visited ||= {} +** Processing line: ~ # The cells from which the breadth first search will expand~ - Inside source: true *** True Line Result - render_target -** Processing line: ~ unless grid.walls.has_key?(grid.target)~ + # The cells from which the breadth first search will expand +** Processing line: ~ breadth_first_search.frontier ||= []~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(grid.target) -** Processing line: ~ render_trail~ + breadth_first_search.frontier ||= [] +** Processing line: ~ # Keeps track of which cell all cells were searched from~ - Inside source: true *** True Line Result - render_trail -** Processing line: ~ end~ + # Keeps track of which cell all cells were searched from +** Processing line: ~ # Used to recreate the path from the target to the star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Used to recreate the path from the target to the star +** Processing line: ~ breadth_first_search.came_from ||= {}~ - Inside source: true *** True Line Result - end + breadth_first_search.came_from ||= {} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_trail(current_cell=grid.target)~ +** Processing line: ~ # Keeps track of the movement cost so far to be at a cell~ - Inside source: true *** True Line Result - def render_trail(current_cell=grid.target) -** Processing line: ~ return if current_cell == grid.star~ + # Keeps track of the movement cost so far to be at a cell +** Processing line: ~ # Allows the costs of new cells to be quickly calculated~ - Inside source: true *** True Line Result - return if current_cell == grid.star -** Processing line: ~ parent_cell = search.came_from[current_cell]~ + # Allows the costs of new cells to be quickly calculated +** Processing line: ~ # Also doubles as a way to check if cells have already been visited~ - Inside source: true *** True Line Result - parent_cell = search.came_from[current_cell] -** Processing line: ~ if current_cell && parent_cell~ + # Also doubles as a way to check if cells have already been visited +** Processing line: ~ dijkstra_search.cost_so_far ||= {}~ - Inside source: true *** True Line Result - if current_cell && parent_cell -** Processing line: ~ outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size,~ + dijkstra_search.cost_so_far ||= {} +** Processing line: ~ # The cells from which the Dijkstra search will expand~ - Inside source: true *** True Line Result - outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size, -** Processing line: ~ (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple]~ + # The cells from which the Dijkstra search will expand +** Processing line: ~ dijkstra_search.frontier ||= []~ - Inside source: true *** True Line Result - (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple] -** Processing line: ~~ + dijkstra_search.frontier ||= [] +** Processing line: ~ # Keeps track of which cell all cells were searched from~ - Inside source: true *** True Line Result - -** Processing line: ~ end~ + # Keeps track of which cell all cells were searched from +** Processing line: ~ # Used to recreate the path from the target to the star~ - Inside source: true *** True Line Result - end -** Processing line: ~ render_trail(parent_cell)~ + # Used to recreate the path from the target to the star +** Processing line: ~ dijkstra_search.came_from ||= {}~ - Inside source: true *** True Line Result - render_trail(parent_cell) + dijkstra_search.came_from ||= {} ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -65912,74 +73479,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_arrows~ -- Inside source: true -*** True Line Result - def render_arrows -** Processing line: ~ search.came_from.each do |child, parent|~ -- Inside source: true -*** True Line Result - search.came_from.each do |child, parent| -** Processing line: ~ if parent && child~ -- Inside source: true -*** True Line Result - if parent && child -** Processing line: ~ arrow_cell = [(child.x + parent.x) / 2, (child.y + parent.y) / 2]~ +** Processing line: ~ # Draws everything onto the screen~ - Inside source: true *** True Line Result - arrow_cell = [(child.x + parent.x) / 2, (child.y + parent.y) / 2] -** Processing line: ~ if parent.x > child.x # If the parent cell is to the right of the child cell~ + # Draws everything onto the screen +** Processing line: ~ def render~ - Inside source: true *** True Line Result - if parent.x > child.x # If the parent cell is to the right of the child cell -** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 0] # Point the arrow to the right~ + def render +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 0] # Point the arrow to the right -** Processing line: ~ elsif parent.x < child.x # If the parent cell is to the right of the child cell~ + render_background +** Processing line: ~~ - Inside source: true *** True Line Result - elsif parent.x < child.x # If the parent cell is to the right of the child cell -** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 180] # Point the arrow to the right~ + +** Processing line: ~ render_heat_maps~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 180] # Point the arrow to the right -** Processing line: ~ elsif parent.y > child.y # If the parent cell is to the right of the child cell~ + render_heat_maps +** Processing line: ~~ - Inside source: true *** True Line Result - elsif parent.y > child.y # If the parent cell is to the right of the child cell -** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 90] # Point the arrow to the right~ + +** Processing line: ~ render_star~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 90] # Point the arrow to the right -** Processing line: ~ elsif parent.y < child.y # If the parent cell is to the right of the child cell~ + render_star +** Processing line: ~ render_target~ - Inside source: true *** True Line Result - elsif parent.y < child.y # If the parent cell is to the right of the child cell -** Processing line: ~ outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 270] # Point the arrow to the right~ + render_target +** Processing line: ~ render_hills~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(arrow_cell), 'arrow.png', 270] # Point the arrow to the right -** Processing line: ~ end~ + render_hills +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + render_walls +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ render_paths~ - Inside source: true *** True Line Result - end + render_paths ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ - Inside source: true *** True Line Result @@ -66004,6 +73555,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result render_grid_lines +** Processing line: ~ render_labels~ +- Inside source: true +*** True Line Result + render_labels ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66012,10 +73567,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws both grids~ +** Processing line: ~ # Draws two rectangles the size of the grid in the default cell color~ - Inside source: true *** True Line Result - # Draws both grids + # Draws two rectangles the size of the grid in the default cell color +** Processing line: ~ # Used as part of the background~ +- Inside source: true +*** True Line Result + # Used as part of the background ** Processing line: ~ def render_unvisited~ - Inside source: true *** True Line Result @@ -66024,6 +73583,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result outputs.solids << [scale_up(grid.rect), unvisited_color] +** Processing line: ~ outputs.solids << [move_and_scale_up(grid.rect), unvisited_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [move_and_scale_up(grid.rect), unvisited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66048,6 +73611,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result outputs.lines << vertical_line(x) +** Processing line: ~ outputs.lines << shifted_vertical_line(x)~ +- Inside source: true +*** True Line Result + outputs.lines << shifted_vertical_line(x) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66064,6 +73631,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result outputs.lines << horizontal_line(y) +** Processing line: ~ outputs.lines << shifted_horizontal_line(y)~ +- Inside source: true +*** True Line Result + outputs.lines << shifted_horizontal_line(y) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66076,10 +73647,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw vertical lines given an index~ +** Processing line: ~ # Easy way to draw vertical lines given an index for the first grid~ - Inside source: true *** True Line Result - # Easy way to draw vertical lines given an index + # Easy way to draw vertical lines given an index for the first grid ** Processing line: ~ def vertical_line column~ - Inside source: true *** True Line Result @@ -66096,10 +73667,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw horizontal lines given an index~ +** Processing line: ~ # Easy way to draw horizontal lines given an index for the second grid~ - Inside source: true *** True Line Result - # Easy way to draw horizontal lines given an index + # Easy way to draw horizontal lines given an index for the second grid ** Processing line: ~ def horizontal_line row~ - Inside source: true *** True Line Result @@ -66116,46 +73687,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the walls on both grids~ -- Inside source: true -*** True Line Result - # Draws the walls on both grids -** Processing line: ~ def render_walls~ -- Inside source: true -*** True Line Result - def render_walls -** Processing line: ~ grid.walls.each_key do |wall|~ -- Inside source: true -*** True Line Result - grid.walls.each_key do |wall| -** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ -- Inside source: true -*** True Line Result - outputs.solids << [scale_up(wall), wall_color] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Renders the star on both grids~ +** Processing line: ~ # Easy way to draw vertical lines given an index for the first grid~ - Inside source: true *** True Line Result - # Renders the star on both grids -** Processing line: ~ def render_star~ + # Easy way to draw vertical lines given an index for the first grid +** Processing line: ~ def shifted_vertical_line column~ - Inside source: true *** True Line Result - def render_star -** Processing line: ~ outputs.sprites << [scale_up(grid.star), 'star.png']~ + def shifted_vertical_line column +** Processing line: ~ scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(grid.star), 'star.png'] + scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66164,18 +73707,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the target on both grids~ +** Processing line: ~ # Easy way to draw horizontal lines given an index for the second grid~ - Inside source: true *** True Line Result - # Renders the target on both grids -** Processing line: ~ def render_target~ + # Easy way to draw horizontal lines given an index for the second grid +** Processing line: ~ def shifted_horizontal_line row~ - Inside source: true *** True Line Result - def render_target -** Processing line: ~ outputs.sprites << [scale_up(grid.target), 'target.png']~ + def shifted_horizontal_line row +** Processing line: ~ scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(grid.target), 'target.png'] + scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66192,10 +73735,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def render_labels -** Processing line: ~ outputs.labels << [200, 625, "Without early exit"]~ +** Processing line: ~ outputs.labels << [175, 650, "Number of steps", 3]~ - Inside source: true *** True Line Result - outputs.labels << [200, 625, "Without early exit"] + outputs.labels << [175, 650, "Number of steps", 3] +** Processing line: ~ outputs.labels << [925, 650, "Distance", 3]~ +- Inside source: true +*** True Line Result + outputs.labels << [925, 650, "Distance", 3] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66204,46 +73751,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the path based off of the search.path hash~ -- Inside source: true -*** True Line Result - # Renders the path based off of the search.path hash -** Processing line: ~ def render_path~ -- Inside source: true -*** True Line Result - def render_path -** Processing line: ~ # If the star and target are disconnected there will only be one path~ -- Inside source: true -*** True Line Result - # If the star and target are disconnected there will only be one path -** Processing line: ~ # The path should not render in that case~ -- Inside source: true -*** True Line Result - # The path should not render in that case -** Processing line: ~ unless search.path.size == 1~ -- Inside source: true -*** True Line Result - unless search.path.size == 1 -** Processing line: ~ search.path.each_key do | cell |~ -- Inside source: true -*** True Line Result - search.path.each_key do | cell | -** Processing line: ~ # Renders path on both grids~ -- Inside source: true -*** True Line Result - # Renders path on both grids -** Processing line: ~ outputs.solids << [scale_up(cell), path_color]~ +** Processing line: ~ def render_paths~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(cell), path_color] -** Processing line: ~ end~ + def render_paths +** Processing line: ~ render_breadth_first_search_path~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + render_breadth_first_search_path +** Processing line: ~ render_dijkstra_path~ - Inside source: true *** True Line Result - end + render_dijkstra_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66252,42 +73771,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path from the target to the star after the search is over~ -- Inside source: true -*** True Line Result - # Calculates the path from the target to the star after the search is over -** Processing line: ~ # Relies on the came_from hash~ -- Inside source: true -*** True Line Result - # Relies on the came_from hash -** Processing line: ~ # Fills the search.path hash, which is later rendered on screen~ -- Inside source: true -*** True Line Result - # Fills the search.path hash, which is later rendered on screen -** Processing line: ~ def calc_path~ -- Inside source: true -*** True Line Result - def calc_path -** Processing line: ~ endpoint = grid.target~ -- Inside source: true -*** True Line Result - endpoint = grid.target -** Processing line: ~ while endpoint~ -- Inside source: true -*** True Line Result - while endpoint -** Processing line: ~ search.path[endpoint] = true~ +** Processing line: ~ def render_heat_maps~ - Inside source: true *** True Line Result - search.path[endpoint] = true -** Processing line: ~ endpoint = search.came_from[endpoint]~ + def render_heat_maps +** Processing line: ~ render_breadth_first_search_heat_map~ - Inside source: true *** True Line Result - endpoint = search.came_from[endpoint] -** Processing line: ~ end~ + render_breadth_first_search_heat_map +** Processing line: ~ render_dijkstra_heat_map~ - Inside source: true *** True Line Result - end + render_dijkstra_heat_map ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66296,194 +73791,186 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ +** Processing line: ~ # Renders the breadth first search on the first grid~ - Inside source: true *** True Line Result - # In code, the cells are represented as 1x1 rectangles -** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ + # Renders the breadth first search on the first grid +** Processing line: ~ def render_breadth_first_search~ - Inside source: true *** True Line Result - # When drawn, the cells are larger than 1x1 rectangles -** Processing line: ~ # This method is used to scale up cells, and lines~ + def render_breadth_first_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - # This method is used to scale up cells, and lines -** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Objects are scaled up according to the grid.cell_size variable -** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ + +** Processing line: ~ # This heat map shows the cells explored by the breadth first search and how far they are from the star.~ - Inside source: true *** True Line Result - # This allows for easy customization of the visual scale of the grid -** Processing line: ~ def scale_up(cell)~ + # This heat map shows the cells explored by the breadth first search and how far they are from the star. +** Processing line: ~ def render_breadth_first_search_heat_map~ - Inside source: true *** True Line Result - def scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + def render_breadth_first_search_heat_map +** Processing line: ~ # For each cell explored~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + # For each cell explored +** Processing line: ~ breadth_first_search.visited.each_key do | visited_cell |~ - Inside source: true *** True Line Result - cell = cell.clone -** Processing line: ~~ + breadth_first_search.visited.each_key do | visited_cell | +** Processing line: ~ # Find its distance from the star~ - Inside source: true *** True Line Result - -** Processing line: ~ # If cell is just an x and y coordinate~ + # Find its distance from the star +** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ - Inside source: true *** True Line Result - # If cell is just an x and y coordinate -** Processing line: ~ if cell.size == 2~ + distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs +** Processing line: ~ max_distance = grid.width + grid.height~ - Inside source: true *** True Line Result - if cell.size == 2 -** Processing line: ~ # Add a width and height of 1~ + max_distance = grid.width + grid.height +** Processing line: ~ # Get it as a percent of the maximum distance and scale to 255 for use as an alpha value~ - Inside source: true *** True Line Result - # Add a width and height of 1 -** Processing line: ~ cell << 1~ + # Get it as a percent of the maximum distance and scale to 255 for use as an alpha value +** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ cell << 1~ + alpha = 255.to_i * distance.to_i / max_distance.to_i +** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ - Inside source: true *** True Line Result - cell << 1 + outputs.solids << [scale_up(visited_cell), red, alpha] ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Scale all the values up~ -- Inside source: true -*** True Line Result - # Scale all the values up -** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - cell.map! { |value| value * grid.cell_size } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns the scaled up cell~ -- Inside source: true -*** True Line Result - # Returns the scaled up cell -** Processing line: ~ cell~ +** Processing line: ~ def render_breadth_first_search_path~ - Inside source: true *** True Line Result - cell -** Processing line: ~ end~ + def render_breadth_first_search_path +** Processing line: ~ # If the search found the target~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # If the search found the target +** Processing line: ~ if breadth_first_search.visited.has_key?(state.target)~ - Inside source: true *** True Line Result - -** Processing line: ~ # This method processes user input every tick~ + if breadth_first_search.visited.has_key?(state.target) +** Processing line: ~ # Start from the target~ - Inside source: true *** True Line Result - # This method processes user input every tick -** Processing line: ~ # Any method with "1" is related to the first grid~ + # Start from the target +** Processing line: ~ endpoint = state.target~ - Inside source: true *** True Line Result - # Any method with "1" is related to the first grid -** Processing line: ~ # Any method with "2" is related to the second grid~ + endpoint = state.target +** Processing line: ~ # And the cell it came from~ - Inside source: true *** True Line Result - # Any method with "2" is related to the second grid -** Processing line: ~ def input~ + # And the cell it came from +** Processing line: ~ next_endpoint = breadth_first_search.came_from[endpoint]~ - Inside source: true *** True Line Result - def input -** Processing line: ~ # The program has to remember that the user is dragging an object~ + next_endpoint = breadth_first_search.came_from[endpoint] +** Processing line: ~ while endpoint and next_endpoint~ - Inside source: true *** True Line Result - # The program has to remember that the user is dragging an object -** Processing line: ~ # even when the mouse is no longer over that object~ + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between these two cells~ - Inside source: true *** True Line Result - # even when the mouse is no longer over that object -** Processing line: ~ # So detecting input and processing input is separate~ + # Draw a path between these two cells +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ - Inside source: true *** True Line Result - # So detecting input and processing input is separate -** Processing line: ~ # detect_input~ + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ outputs.solids << [scale_up(path), path_color]~ - Inside source: true *** True Line Result - # detect_input -** Processing line: ~ # process_input~ + outputs.solids << [scale_up(path), path_color] +** Processing line: ~ # And get the next pair of cells~ - Inside source: true *** True Line Result - # process_input -** Processing line: ~ if inputs.mouse.up~ + # And get the next pair of cells +** Processing line: ~ endpoint = next_endpoint~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ state.current_input = :none~ + endpoint = next_endpoint +** Processing line: ~ next_endpoint = breadth_first_search.came_from[endpoint]~ - Inside source: true *** True Line Result - state.current_input = :none -** Processing line: ~ elsif star_clicked?~ + next_endpoint = breadth_first_search.came_from[endpoint] +** Processing line: ~ # Continue till there are no more cells~ - Inside source: true *** True Line Result - elsif star_clicked? -** Processing line: ~ state.current_input = :star~ + # Continue till there are no more cells +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.current_input = :star + 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: ~ if mouse_inside_grid?~ +** Processing line: ~ # Renders the Dijkstra search on the second grid~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ unless grid.target == cell_closest_to_mouse~ + # Renders the Dijkstra search on the second grid +** Processing line: ~ def render_dijkstra~ - Inside source: true *** True Line Result - unless grid.target == cell_closest_to_mouse -** Processing line: ~ grid.target = cell_closest_to_mouse~ + def render_dijkstra +** Processing line: ~ end~ - Inside source: true *** True Line Result - grid.target = cell_closest_to_mouse -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ if state.current_input == :star~ + +** Processing line: ~ def render_dijkstra_heat_map~ - Inside source: true *** True Line Result - if state.current_input == :star -** Processing line: ~ unless grid.star == cell_closest_to_mouse~ + def render_dijkstra_heat_map +** Processing line: ~ dijkstra_search.cost_so_far.each do |visited_cell, cost|~ - Inside source: true *** True Line Result - unless grid.star == cell_closest_to_mouse -** Processing line: ~ grid.star = cell_closest_to_mouse~ + dijkstra_search.cost_so_far.each do |visited_cell, cost| +** Processing line: ~ max_cost = (grid.width + grid.height) #* 5~ - Inside source: true *** True Line Result - grid.star = cell_closest_to_mouse -** Processing line: ~ end~ + max_cost = (grid.width + grid.height) #* 5 +** Processing line: ~ alpha = 255.to_i * cost.to_i / max_cost.to_i~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + alpha = 255.to_i * cost.to_i / max_cost.to_i +** Processing line: ~ outputs.solids << [move_and_scale_up(visited_cell), red, alpha]~ - Inside source: true *** True Line Result - end + outputs.solids << [move_and_scale_up(visited_cell), red, alpha] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66496,82 +73983,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Determines what the user is editing and stores the value~ -- Inside source: true -*** True Line Result - # Determines what the user is editing and stores the value -** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ -- Inside source: true -*** True Line Result - # Storing the value allows the user to continue the same edit as long as the -** Processing line: ~ # mouse left click is held~ +** Processing line: ~ def render_dijkstra_path~ - Inside source: true *** True Line Result - # mouse left click is held -** Processing line: ~ def detect_input~ + def render_dijkstra_path +** Processing line: ~ # If the search found the target~ - Inside source: true *** True Line Result - def detect_input -** Processing line: ~ # When the mouse is up, nothing is being edited~ + # If the search found the target +** Processing line: ~ if dijkstra_search.came_from.has_key?(state.target)~ - Inside source: true *** True Line Result - # When the mouse is up, nothing is being edited -** Processing line: ~ if inputs.mouse.up~ + if dijkstra_search.came_from.has_key?(state.target) +** Processing line: ~ # Get the target and the cell it came from~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ state.current_input = :none~ + # Get the target and the cell it came from +** Processing line: ~ endpoint = state.target~ - Inside source: true *** True Line Result - state.current_input = :none -** Processing line: ~ # When the star in the no second grid is clicked~ + endpoint = state.target +** Processing line: ~ next_endpoint = dijkstra_search.came_from[endpoint]~ - Inside source: true *** True Line Result - # When the star in the no second grid is clicked -** Processing line: ~ elsif star_clicked?~ + next_endpoint = dijkstra_search.came_from[endpoint] +** Processing line: ~ while endpoint and next_endpoint~ - Inside source: true *** True Line Result - elsif star_clicked? -** Processing line: ~ state.current_input = :star~ + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between them~ - Inside source: true *** True Line Result - state.current_input = :star -** Processing line: ~ # When the target in the no second grid is clicked~ + # Draw a path between them +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ - Inside source: true *** True Line Result - # When the target in the no second grid is clicked -** Processing line: ~ elsif target_clicked?~ + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ outputs.solids << [move_and_scale_up(path), path_color]~ - Inside source: true *** True Line Result - elsif target_clicked? -** Processing line: ~ state.current_input = :target~ + outputs.solids << [move_and_scale_up(path), path_color] +** Processing line: ~~ - Inside source: true *** True Line Result - state.current_input = :target -** Processing line: ~ # When a wall in the first grid is clicked~ + +** Processing line: ~ # Shift one cell down the path~ - Inside source: true *** True Line Result - # When a wall in the first grid is clicked -** Processing line: ~ elsif wall_clicked?~ + # Shift one cell down the path +** Processing line: ~ endpoint = next_endpoint~ - Inside source: true *** True Line Result - elsif wall_clicked? -** Processing line: ~ state.current_input = :remove_wall~ + endpoint = next_endpoint +** Processing line: ~ next_endpoint = dijkstra_search.came_from[endpoint]~ - Inside source: true *** True Line Result - state.current_input = :remove_wall -** Processing line: ~ # When the first grid is clicked~ + next_endpoint = dijkstra_search.came_from[endpoint] +** Processing line: ~~ - Inside source: true *** True Line Result - # When the first grid is clicked -** Processing line: ~ elsif grid_clicked?~ + +** Processing line: ~ # Repeat till the end of the path~ - Inside source: true *** True Line Result - elsif grid_clicked? -** Processing line: ~ state.current_input = :add_wall~ + # Repeat till the end of the path +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.current_input = :add_wall + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66584,50 +74063,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ -- Inside source: true -*** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_input~ +** Processing line: ~ # Renders the star on both grids~ - Inside source: true *** True Line Result - def process_input -** Processing line: ~ if state.current_input == :star~ + # Renders the star on both grids +** Processing line: ~ def render_star~ - Inside source: true *** True Line Result - if state.current_input == :star -** Processing line: ~ input_star~ + def render_star +** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - input_star -** Processing line: ~ elsif state.current_input == :target~ + outputs.sprites << [scale_up(state.star), 'star.png'] +** Processing line: ~ outputs.sprites << [move_and_scale_up(state.star), 'star.png']~ - Inside source: true *** True Line Result - elsif state.current_input == :target -** Processing line: ~ input_target~ + outputs.sprites << [move_and_scale_up(state.star), 'star.png'] +** Processing line: ~ end~ - Inside source: true *** True Line Result - input_target -** Processing line: ~ elsif state.current_input == :remove_wall~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif state.current_input == :remove_wall -** Processing line: ~ input_remove_wall~ + +** Processing line: ~ # Renders the target on both grids~ - Inside source: true *** True Line Result - input_remove_wall -** Processing line: ~ elsif state.current_input == :add_wall~ + # Renders the target on both grids +** Processing line: ~ def render_target~ - Inside source: true *** True Line Result - elsif state.current_input == :add_wall -** Processing line: ~ input_add_wall~ + def render_target +** Processing line: ~ outputs.sprites << [scale_up(state.target), 'target.png']~ - Inside source: true *** True Line Result - input_add_wall -** Processing line: ~ end~ + outputs.sprites << [scale_up(state.target), 'target.png'] +** Processing line: ~ outputs.sprites << [move_and_scale_up(state.target), 'target.png']~ - Inside source: true *** True Line Result - end + outputs.sprites << [move_and_scale_up(state.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66636,38 +74111,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ -- Inside source: true -*** True Line Result - # Moves the star to the cell closest to the mouse in the first grid -** Processing line: ~ # Only resets the search if the star changes position~ -- Inside source: true -*** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ -- Inside source: true -*** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star~ -- Inside source: true -*** True Line Result - def input_star -** Processing line: ~ old_star = grid.star.clone~ +** Processing line: ~ def render_hills~ - Inside source: true *** True Line Result - old_star = grid.star.clone -** Processing line: ~ grid.star = cell_closest_to_mouse~ + def render_hills +** Processing line: ~ state.hills.each_key do |hill|~ - Inside source: true *** True Line Result - grid.star = cell_closest_to_mouse -** Processing line: ~ unless old_star == grid.star~ + state.hills.each_key do |hill| +** Processing line: ~ outputs.solids << [scale_up(hill), hill_color]~ - Inside source: true *** True Line Result - unless old_star == grid.star -** Processing line: ~ reset_search~ + outputs.solids << [scale_up(hill), hill_color] +** Processing line: ~ outputs.solids << [move_and_scale_up(hill), hill_color]~ - Inside source: true *** True Line Result - reset_search + outputs.solids << [move_and_scale_up(hill), hill_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66680,38 +74139,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ -- Inside source: true -*** True Line Result - # Moves the target to the grid closest to the mouse in the first grid -** Processing line: ~ # Only reset_searchs the search if the target changes position~ -- Inside source: true -*** True Line Result - # Only reset_searchs the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ -- Inside source: true -*** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def input_target~ +** Processing line: ~ # Draws the walls on both grids~ - Inside source: true *** True Line Result - def input_target -** Processing line: ~ old_target = grid.target.clone~ + # Draws the walls on both grids +** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result - old_target = grid.target.clone -** Processing line: ~ grid.target = cell_closest_to_mouse~ + def render_walls +** Processing line: ~ state.walls.each_key do |wall|~ - Inside source: true *** True Line Result - grid.target = cell_closest_to_mouse -** Processing line: ~ unless old_target == grid.target~ + state.walls.each_key do |wall| +** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - unless old_target == grid.target -** Processing line: ~ reset_search~ + outputs.solids << [scale_up(wall), wall_color] +** Processing line: ~ outputs.solids << [move_and_scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - reset_search + outputs.solids << [move_and_scale_up(wall), wall_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66724,82 +74171,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the first grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the first grid that are under the cursor -** Processing line: ~ def input_remove_wall~ -- Inside source: true -*** True Line Result - def input_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ +** Processing line: ~ def get_path_between(cell_one, cell_two)~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + def get_path_between(cell_one, cell_two) +** Processing line: ~ path = nil~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + path = nil +** Processing line: ~ if cell_one.x == cell_two.x~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if mouse_inside_grid?~ + if cell_one.x == cell_two.x +** Processing line: ~ if cell_one.y < cell_two.y~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ if grid.walls.has_key?(cell_closest_to_mouse)~ + if cell_one.y < cell_two.y +** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4]~ - Inside source: true *** True Line Result - if grid.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(cell_closest_to_mouse)~ + path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4] +** Processing line: ~ else~ - Inside source: true *** True Line Result - grid.walls.delete(cell_closest_to_mouse) -** Processing line: ~ reset_search~ + else +** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4]~ - Inside source: true *** True Line Result - reset_search + path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4] ** 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: ~ # Adds a wall in the first grid in the cell the mouse is over~ -- Inside source: true -*** True Line Result - # Adds a wall in the first grid in the cell the mouse is over -** Processing line: ~ def input_add_wall~ +** Processing line: ~ else~ - Inside source: true *** True Line Result - def input_add_wall -** Processing line: ~ if mouse_inside_grid?~ + else +** Processing line: ~ if cell_one.x < cell_two.x~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ unless grid.walls.has_key?(cell_closest_to_mouse)~ + if cell_one.x < cell_two.x +** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4]~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ grid.walls[cell_closest_to_mouse] = true~ + path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4] +** Processing line: ~ else~ - Inside source: true *** True Line Result - grid.walls[cell_closest_to_mouse] = true -** Processing line: ~ reset_search~ + else +** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4]~ - Inside source: true *** True Line Result - reset_search + path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66808,134 +74231,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~ path~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + path +** Processing line: ~ end~ - Inside source: true *** True Line Result - + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Whenever the user edits the grid,~ -- Inside source: true -*** True Line Result - # Whenever the user edits the grid, -** Processing line: ~ # The search has to be reset_searchd upto the current step~ -- Inside source: true -*** True Line Result - # The search has to be reset_searchd upto the current step -** Processing line: ~ # with the current grid as the initial state of the grid~ -- Inside source: true -*** True Line Result - # with the current grid as the initial state of the grid -** Processing line: ~ def reset_search~ -- Inside source: true -*** True Line Result - def reset_search -** Processing line: ~ # Reset_Searchs the search~ +** Processing line: ~ # Representation of how far away visited cells are from the star~ - Inside source: true *** True Line Result - # Reset_Searchs the search -** Processing line: ~ search.frontier = []~ + # Representation of how far away visited cells are from the star +** Processing line: ~ # Replaces the render_visited method~ - Inside source: true *** True Line Result - search.frontier = [] -** Processing line: ~ search.came_from = {}~ + # Replaces the render_visited method +** Processing line: ~ # Visually demonstrates the effectiveness of early exit for pathfinding~ - Inside source: true *** True Line Result - search.came_from = {} -** Processing line: ~ search.path = {}~ + # Visually demonstrates the effectiveness of early exit for pathfinding +** Processing line: ~ def render_breadth_first_search_heat_map~ - Inside source: true *** True Line Result - search.path = {} -** Processing line: ~ end~ + def render_breadth_first_search_heat_map +** Processing line: ~ breadth_first_search.visited.each_key do | visited_cell |~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + breadth_first_search.visited.each_key do | visited_cell | +** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ - Inside source: true *** True Line Result - -** Processing line: ~~ + distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs +** Processing line: ~ max_distance = grid.width + grid.height~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a list of adjacent cells~ + max_distance = grid.width + grid.height +** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ - Inside source: true *** True Line Result - # Returns a list of adjacent cells -** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ + alpha = 255.to_i * distance.to_i / max_distance.to_i +** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ - Inside source: true *** True Line Result - # Used to determine what the next cells to be added to the frontier are -** Processing line: ~ def adjacent_neighbors(cell)~ + outputs.solids << [scale_up(visited_cell), red, alpha] +** Processing line: ~ end~ - Inside source: true *** True Line Result - def adjacent_neighbors(cell) -** Processing line: ~ neighbors = []~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - neighbors = [] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Gets all the valid neighbors into the array~ -- Inside source: true -*** True Line Result - # Gets all the valid neighbors into the array -** Processing line: ~ # From southern neighbor, clockwise~ -- Inside source: true -*** True Line Result - # From southern neighbor, clockwise -** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ -- Inside source: true -*** True Line Result - neighbors << [cell.x, cell.y - 1] unless cell.y == 0 -** Processing line: ~ neighbors << [cell.x - 1, cell.y] unless cell.x == 0~ -- Inside source: true -*** True Line Result - neighbors << [cell.x - 1, cell.y] unless cell.x == 0 -** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ -- Inside source: true -*** True Line Result - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 -** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ +** Processing line: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ - Inside source: true *** True Line Result - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 -** Processing line: ~~ + # Translates the given cell grid.width + 1 to the right and then scales up +** Processing line: ~ # Used to draw cells for the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ + # Used to draw cells for the second grid +** Processing line: ~ # This method does not work for lines,~ - Inside source: true *** True Line Result - # Sorts the neighbors so the rendered path is a zigzag path -** Processing line: ~ # Cells in a diagonal direction are given priority~ + # This method does not work for lines, +** Processing line: ~ # so separate methods exist for the grid lines~ - Inside source: true *** True Line Result - # Cells in a diagonal direction are given priority -** Processing line: ~ # Comment this line to see the difference~ + # so separate methods exist for the grid lines +** Processing line: ~ def move_and_scale_up(cell)~ - Inside source: true *** True Line Result - # Comment this line to see the difference -** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ + def move_and_scale_up(cell) +** Processing line: ~ cell_clone = cell.clone~ - Inside source: true *** True Line Result - neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } -** Processing line: ~~ + cell_clone = cell.clone +** Processing line: ~ cell_clone.x += grid.width + 1~ - Inside source: true *** True Line Result - -** Processing line: ~ neighbors~ + cell_clone.x += grid.width + 1 +** Processing line: ~ scale_up(cell_clone)~ - Inside source: true *** True Line Result - neighbors + scale_up(cell_clone) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -66944,122 +74331,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ -- Inside source: true -*** True Line Result - # Finds the vertical and horizontal distance of a cell from the star -** Processing line: ~ # and returns the larger value~ -- Inside source: true -*** True Line Result - # and returns the larger value -** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ -- Inside source: true -*** True Line Result - # This method is used to have a zigzag pattern in the rendered path -** Processing line: ~ # A cell that is [5, 5] from the star,~ -- Inside source: true -*** True Line Result - # A cell that is [5, 5] from the star, -** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ -- Inside source: true -*** True Line Result - # is explored before over a cell that is [0, 7] away. -** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ -- Inside source: true -*** True Line Result - # So, if possible, the search tries to go diagonal (zigzag) first -** Processing line: ~ def proximity_to_star(x, y)~ -- Inside source: true -*** True Line Result - def proximity_to_star(x, y) -** Processing line: ~ distance_x = (grid.star.x - x).abs~ -- Inside source: true -*** True Line Result - distance_x = (grid.star.x - x).abs -** Processing line: ~ distance_y = (grid.star.y - y).abs~ +** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ - Inside source: true *** True Line Result - distance_y = (grid.star.y - y).abs -** Processing line: ~~ + # In code, the cells are represented as 1x1 rectangles +** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ - Inside source: true *** True Line Result - -** Processing line: ~ if distance_x > distance_y~ + # When drawn, the cells are larger than 1x1 rectangles +** Processing line: ~ # This method is used to scale up cells, and lines~ - Inside source: true *** True Line Result - if distance_x > distance_y -** Processing line: ~ return distance_x~ + # This method is used to scale up cells, and lines +** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ - Inside source: true *** True Line Result - return distance_x -** Processing line: ~ else~ + # Objects are scaled up according to the grid.cell_size variable +** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ - Inside source: true *** True Line Result - else -** Processing line: ~ return distance_y~ + # This allows for easy customization of the visual scale of the grid +** Processing line: ~ def scale_up(cell)~ - Inside source: true *** True Line Result - return distance_y -** Processing line: ~ end~ + def scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - end + cell = cell.clone ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ +** Processing line: ~ # If cell is just an x and y coordinate~ - Inside source: true *** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ + # If cell is just an x and y coordinate +** Processing line: ~ if cell.size == 2~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse helps with this~ + if cell.size == 2 +** Processing line: ~ # Add a width and height of 1~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse helps with this -** Processing line: ~ def cell_closest_to_mouse~ + # Add a width and height of 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - def cell_closest_to_mouse -** Processing line: ~ # Closest cell to the mouse in the first grid~ + cell << 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - # Closest cell to the mouse in the first grid -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + cell << 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Bound x and y to the grid~ + +** Processing line: ~ # Scale all the values up~ - Inside source: true *** True Line Result - # Bound x and y to the grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + # Scale all the values up +** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + cell.map! { |value| value * grid.cell_size } +** Processing line: ~~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + +** Processing line: ~ # Returns the scaled up cell~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + # Returns the scaled up cell +** Processing line: ~ cell~ - Inside source: true *** True Line Result - [x, y] + cell ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67068,82 +74423,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ +** Processing line: ~ # Handles user input every tick so the grid can be edited~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the first grid -** Processing line: ~ def star_clicked?~ + # Handles user input every tick so the grid can be edited +** Processing line: ~ # Separate input detection and processing is needed~ - Inside source: true *** True Line Result - def star_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.star))~ + # Separate input detection and processing is needed +** Processing line: ~ # For example: Adding walls is started by clicking down on a hill,~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.star)) -** Processing line: ~ end~ + # For example: Adding walls is started by clicking down on a hill, +** Processing line: ~ # but the mouse doesn't need to remain over hills to add walls~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # but the mouse doesn't need to remain over hills to add walls +** Processing line: ~ def input~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ + def input +** Processing line: ~ # If the mouse was lifted this tick~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the target from the first grid -** Processing line: ~ def target_clicked?~ + # If the mouse was lifted this tick +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - def target_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.target))~ + if inputs.mouse.up +** Processing line: ~ # Set current input to none~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(grid.target)) -** Processing line: ~ end~ + # Set current input to none +** Processing line: ~ state.user_input = :none~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.user_input = :none +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls from the first grid -** Processing line: ~ def grid_clicked?~ + +** Processing line: ~ # If the mouse was clicked this tick~ - Inside source: true *** True Line Result - def grid_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ + # If the mouse was clicked this tick +** Processing line: ~ if inputs.mouse.down~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_grid? -** Processing line: ~ end~ + if inputs.mouse.down +** Processing line: ~ # Determine what the user is editing and edit the state.user_input variable~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Determine what the user is editing and edit the state.user_input variable +** Processing line: ~ determine_input~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns whether the mouse is inside of the first grid~ + determine_input +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of the first grid -** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is adding a wall -** Processing line: ~ def mouse_inside_grid?~ + +** Processing line: ~ # Process user input based on user_input variable and current mouse position~ - Inside source: true *** True Line Result - def mouse_inside_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ + # Process user input based on user_input variable and current mouse position +** Processing line: ~ process_input~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(scale_up(grid.rect)) + process_input ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67152,186 +74507,190 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods provide handy aliases to colors~ +** Processing line: ~ # Determines what the user is editing and stores the value~ - Inside source: true *** True Line Result - # These methods provide handy aliases to colors -** Processing line: ~~ + # Determines what the user is editing and stores the value +** Processing line: ~ # This method is called the tick the mouse is clicked~ - Inside source: true *** True Line Result - -** Processing line: ~ # Light brown~ + # This method is called the tick the mouse is clicked +** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ - Inside source: true *** True Line Result - # Light brown -** Processing line: ~ def unvisited_color~ + # Storing the value allows the user to continue the same edit as long as the +** Processing line: ~ # mouse left click is held~ - Inside source: true *** True Line Result - def unvisited_color -** Processing line: ~ [221, 212, 213]~ + # mouse left click is held +** Processing line: ~ def determine_input~ - Inside source: true *** True Line Result - [221, 212, 213] -** Processing line: ~ # [255, 255, 255]~ + def determine_input +** Processing line: ~ # If the mouse is over the star in the first grid~ - Inside source: true *** True Line Result - # [255, 255, 255] -** Processing line: ~ end~ + # If the mouse is over the star in the first grid +** Processing line: ~ if mouse_over_star?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if mouse_over_star? +** Processing line: ~ # The user is editing the star from the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Camo Green~ + # The user is editing the star from the first grid +** Processing line: ~ state.user_input = :star~ - Inside source: true *** True Line Result - # Camo Green -** Processing line: ~ def wall_color~ + state.user_input = :star +** Processing line: ~ # If the mouse is over the star in the second grid~ - Inside source: true *** True Line Result - def wall_color -** Processing line: ~ [134, 134, 120]~ + # If the mouse is over the star in the second grid +** Processing line: ~ elsif mouse_over_star2?~ - Inside source: true *** True Line Result - [134, 134, 120] -** Processing line: ~ end~ + elsif mouse_over_star2? +** Processing line: ~ # The user is editing the star from the second grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The user is editing the star from the second grid +** Processing line: ~ state.user_input = :star2~ - Inside source: true *** True Line Result - -** Processing line: ~ # Pastel White~ + state.user_input = :star2 +** Processing line: ~ # If the mouse is over the target in the first grid~ - Inside source: true *** True Line Result - # Pastel White -** Processing line: ~ def path_color~ + # If the mouse is over the target in the first grid +** Processing line: ~ elsif mouse_over_target?~ - Inside source: true *** True Line Result - def path_color -** Processing line: ~ [231, 230, 228]~ + elsif mouse_over_target? +** Processing line: ~ # The user is editing the target from the first grid~ - Inside source: true *** True Line Result - [231, 230, 228] -** Processing line: ~ end~ + # The user is editing the target from the first grid +** Processing line: ~ state.user_input = :target~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.user_input = :target +** Processing line: ~ # If the mouse is over the target in the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def red~ + # If the mouse is over the target in the second grid +** Processing line: ~ elsif mouse_over_target2?~ - Inside source: true *** True Line Result - def red -** Processing line: ~ [255, 0, 0]~ + elsif mouse_over_target2? +** Processing line: ~ # The user is editing the target from the second grid~ - Inside source: true *** True Line Result - [255, 0, 0] -** Processing line: ~ end~ + # The user is editing the target from the second grid +** Processing line: ~ state.user_input = :target2~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.user_input = :target2 +** Processing line: ~ # If the mouse is over a wall in the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def purple~ + # If the mouse is over a wall in the first grid +** Processing line: ~ elsif mouse_over_wall?~ - Inside source: true *** True Line Result - def purple -** Processing line: ~ [149, 64, 191]~ + elsif mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the first grid~ - Inside source: true *** True Line Result - [149, 64, 191] -** Processing line: ~ end~ + # The user is removing a wall from the first grid +** Processing line: ~ state.user_input = :remove_wall~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.user_input = :remove_wall +** Processing line: ~ # If the mouse is over a wall in the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Makes code more concise~ + # If the mouse is over a wall in the second grid +** Processing line: ~ elsif mouse_over_wall2?~ - Inside source: true *** True Line Result - # Makes code more concise -** Processing line: ~ def grid~ + elsif mouse_over_wall2? +** Processing line: ~ # The user is removing a wall from the second grid~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + # The user is removing a wall from the second grid +** Processing line: ~ state.user_input = :remove_wall2~ - Inside source: true *** True Line Result - state.grid -** Processing line: ~ end~ + state.user_input = :remove_wall2 +** Processing line: ~ # If the mouse is over a hill in the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # If the mouse is over a hill in the first grid +** Processing line: ~ elsif mouse_over_hill?~ - Inside source: true *** True Line Result - -** Processing line: ~ def search~ + elsif mouse_over_hill? +** Processing line: ~ # The user is adding a wall from the first grid~ - Inside source: true *** True Line Result - def search -** Processing line: ~ state.search~ + # The user is adding a wall from the first grid +** Processing line: ~ state.user_input = :add_wall~ - Inside source: true *** True Line Result - state.search -** Processing line: ~ end~ + state.user_input = :add_wall +** Processing line: ~ # If the mouse is over a hill in the second grid~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # If the mouse is over a hill in the second grid +** Processing line: ~ elsif mouse_over_hill2?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif mouse_over_hill2? +** Processing line: ~ # The user is adding a wall from the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Method that is called by DragonRuby periodically~ + # The user is adding a wall from the second grid +** Processing line: ~ state.user_input = :add_wall2~ - Inside source: true *** True Line Result - # Method that is called by DragonRuby periodically -** Processing line: ~ # Used for updating animations and calculations~ + state.user_input = :add_wall2 +** Processing line: ~ # If the mouse is over the first grid~ - Inside source: true *** True Line Result - # Used for updating animations and calculations -** Processing line: ~ def tick args~ + # If the mouse is over the first grid +** Processing line: ~ elsif mouse_over_grid?~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~~ + elsif mouse_over_grid? +** Processing line: ~ # The user is adding a hill from the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Pressing r will reset the application~ + # The user is adding a hill from the first grid +** Processing line: ~ state.user_input = :add_hill~ - Inside source: true *** True Line Result - # Pressing r will reset the application -** Processing line: ~ if args.inputs.keyboard.key_down.r~ + state.user_input = :add_hill +** Processing line: ~ # If the mouse is over the second grid~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_down.r -** Processing line: ~ args.gtk.reset~ + # If the mouse is over the second grid +** Processing line: ~ elsif mouse_over_grid2?~ - Inside source: true *** True Line Result - args.gtk.reset -** Processing line: ~ reset~ + elsif mouse_over_grid2? +** Processing line: ~ # The user is adding a hill from the second grid~ - Inside source: true *** True Line Result - reset -** Processing line: ~ return~ + # The user is adding a hill from the second grid +** Processing line: ~ state.user_input = :add_hill2~ - Inside source: true *** True Line Result - return + state.user_input = :add_hill2 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67340,250 +74699,242 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ - Inside source: true *** True Line Result - # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $breadcrumbs ||= Breadcrumbs.new(args)~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_input~ - Inside source: true *** True Line Result - $breadcrumbs ||= Breadcrumbs.new(args) -** Processing line: ~ $breadcrumbs.args = args~ + def process_input +** Processing line: ~ if state.user_input == :star~ - Inside source: true *** True Line Result - $breadcrumbs.args = args -** Processing line: ~ $breadcrumbs.tick~ + if state.user_input == :star +** Processing line: ~ input_star~ - Inside source: true *** True Line Result - $breadcrumbs.tick -** Processing line: ~ end~ + input_star +** Processing line: ~ elsif state.user_input == :star2~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif state.user_input == :star2 +** Processing line: ~ input_star2~ - Inside source: true *** True Line Result - -** Processing line: ~~ + input_star2 +** Processing line: ~ elsif state.user_input == :target~ - Inside source: true *** True Line Result - -** Processing line: ~ def reset~ + elsif state.user_input == :target +** Processing line: ~ input_target~ - Inside source: true *** True Line Result - def reset -** Processing line: ~ $breadcrumbs = nil~ + input_target +** Processing line: ~ elsif state.user_input == :target2~ - Inside source: true *** True Line Result - $breadcrumbs = nil -** Processing line: ~ end~ + elsif state.user_input == :target2 +** Processing line: ~ input_target2~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + input_target2 +** Processing line: ~ elsif state.user_input == :remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # # Representation of how far away visited cells are from the star~ + elsif state.user_input == :remove_wall +** Processing line: ~ input_remove_wall~ - Inside source: true *** True Line Result - # # Representation of how far away visited cells are from the star -** Processing line: ~ # # Replaces the render_visited method~ + input_remove_wall +** Processing line: ~ elsif state.user_input == :remove_wall2~ - Inside source: true *** True Line Result - # # Replaces the render_visited method -** Processing line: ~ # # Visually demonstrates the effectiveness of early exit for pathfinding~ + elsif state.user_input == :remove_wall2 +** Processing line: ~ input_remove_wall2~ - Inside source: true *** True Line Result - # # Visually demonstrates the effectiveness of early exit for pathfinding -** Processing line: ~ # def render_heat_map~ + input_remove_wall2 +** Processing line: ~ elsif state.user_input == :add_hill~ - Inside source: true *** True Line Result - # def render_heat_map -** Processing line: ~ # # THIS CODE NEEDS SOME FIXING DUE TO REFACTORING~ + elsif state.user_input == :add_hill +** Processing line: ~ input_add_hill~ - Inside source: true *** True Line Result - # # THIS CODE NEEDS SOME FIXING DUE TO REFACTORING -** Processing line: ~ # search.came_from.each_key do | cell |~ + input_add_hill +** Processing line: ~ elsif state.user_input == :add_hill2~ - Inside source: true *** True Line Result - # search.came_from.each_key do | cell | -** Processing line: ~ # distance = (grid.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ + elsif state.user_input == :add_hill2 +** Processing line: ~ input_add_hill2~ - Inside source: true *** True Line Result - # distance = (grid.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs -** Processing line: ~ # max_distance = grid.width + grid.height~ + input_add_hill2 +** Processing line: ~ elsif state.user_input == :add_wall~ - Inside source: true *** True Line Result - # max_distance = grid.width + grid.height -** Processing line: ~ # alpha = 255.to_i * distance.to_i / max_distance.to_i~ + elsif state.user_input == :add_wall +** Processing line: ~ input_add_wall~ - Inside source: true *** True Line Result - # alpha = 255.to_i * distance.to_i / max_distance.to_i -** Processing line: ~ # outputs.solids << [scale_up(visited_cell), red, alpha]~ + input_add_wall +** Processing line: ~ elsif state.user_input == :add_wall2~ - Inside source: true *** True Line Result - # outputs.solids << [scale_up(visited_cell), red, alpha] -** Processing line: ~ # # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ + elsif state.user_input == :add_wall2 +** Processing line: ~ input_add_wall2~ - Inside source: true *** True Line Result - # # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] -** Processing line: ~ # end~ + input_add_wall2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # end -** Processing line: ~ # end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Path Finding Algorithms - Early Exit - main.rb~ -- Header detected. -*** True Line Result - +** Processing line: ~ # Calculates the two searches~ +- Inside source: true *** True Line Result -*** Path Finding Algorithms - Early Exit - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # Calculates the two searches +** Processing line: ~ def calc~ +- Inside source: true *** True Line Result - + def calc +** Processing line: ~ # If the searches have not started~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/13_path_finding_algorithms/04_early_exit/app/main.rb~ + # If the searches have not started +** Processing line: ~ if breadth_first_search.visited.empty?~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/04_early_exit/app/main.rb -** Processing line: ~ # Comparison of a breadth first search with and without early exit~ + if breadth_first_search.visited.empty? +** Processing line: ~ # Calculate the two searches~ - Inside source: true *** True Line Result - # Comparison of a breadth first search with and without early exit -** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ + # Calculate the two searches +** Processing line: ~ calc_breadth_first~ - Inside source: true *** True Line Result - # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ + calc_breadth_first +** Processing line: ~ calc_dijkstra~ - Inside source: true *** True Line Result - -** Processing line: ~ # Demonstrates the exploration difference caused by early exit~ + calc_dijkstra +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Demonstrates the exploration difference caused by early exit -** Processing line: ~ # Also demonstrates how breadth first search is used for path generation~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Also demonstrates how breadth first search is used for path generation + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The left grid is a breadth first search without early exit~ +** Processing line: ~~ - Inside source: true *** True Line Result - # The left grid is a breadth first search without early exit -** Processing line: ~ # The right grid is a breadth first search with early exit~ + +** Processing line: ~ def calc_breadth_first~ - Inside source: true *** True Line Result - # The right grid is a breadth first search with early exit -** Processing line: ~ # The red squares represent how far the search expanded~ + def calc_breadth_first +** Processing line: ~ # Sets up the Breadth First Search~ - Inside source: true *** True Line Result - # The red squares represent how far the search expanded -** Processing line: ~ # The darker the red, the farther the search proceeded~ + # Sets up the Breadth First Search +** Processing line: ~ breadth_first_search.visited[state.star] = true~ - Inside source: true *** True Line Result - # The darker the red, the farther the search proceeded -** Processing line: ~ # Comparison of the heat map reveals how much searching can be saved by early exit~ + breadth_first_search.visited[state.star] = true +** Processing line: ~ breadth_first_search.frontier << state.star~ - Inside source: true *** True Line Result - # Comparison of the heat map reveals how much searching can be saved by early exit -** Processing line: ~ # The white path shows path generation via breadth first search~ + breadth_first_search.frontier << state.star +** Processing line: ~ breadth_first_search.came_from[state.star] = nil~ - Inside source: true *** True Line Result - # The white path shows path generation via breadth first search -** Processing line: ~ class EarlyExitBreadthFirstSearch~ + breadth_first_search.came_from[state.star] = nil +** Processing line: ~~ - Inside source: true *** True Line Result - class EarlyExitBreadthFirstSearch -** Processing line: ~ attr_gtk~ + +** Processing line: ~ until breadth_first_search.frontier.empty?~ - Inside source: true *** True Line Result - attr_gtk -** Processing line: ~~ + until breadth_first_search.frontier.empty? +** Processing line: ~ return if breadth_first_search.visited.has_key?(state.target)~ - Inside source: true *** True Line Result - -** Processing line: ~ # This method is called every frame/tick~ + return if breadth_first_search.visited.has_key?(state.target) +** Processing line: ~ # A step in the search~ - Inside source: true *** True Line Result - # This method is called every frame/tick -** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ + # A step in the search +** Processing line: ~ # Takes the next frontier cell~ - Inside source: true *** True Line Result - # Every tick, the current state of the search is rendered on the screen, -** Processing line: ~ # User input is processed, and~ + # Takes the next frontier cell +** Processing line: ~ new_frontier = breadth_first_search.frontier.shift~ - Inside source: true *** True Line Result - # User input is processed, and -** Processing line: ~ # The next step in the search is calculated~ + new_frontier = breadth_first_search.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - # The next step in the search is calculated -** Processing line: ~ def tick~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + adjacent_neighbors(new_frontier).each do | neighbor | +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ # If the grid has not been searched~ + # That have not been visited and are not walls +** Processing line: ~ unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - # If the grid has not been searched -** Processing line: ~ if state.visited.empty?~ + unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ - Inside source: true *** True Line Result - if state.visited.empty? -** Processing line: ~ # Complete the search~ + # Add them to the frontier and mark them as visited in the first grid +** Processing line: ~ breadth_first_search.visited[neighbor] = true~ - Inside source: true *** True Line Result - # Complete the search -** Processing line: ~ state.max_steps.times { step }~ + breadth_first_search.visited[neighbor] = true +** Processing line: ~ breadth_first_search.frontier << neighbor~ - Inside source: true *** True Line Result - state.max_steps.times { step } -** Processing line: ~ # And calculate the path~ + breadth_first_search.frontier << neighbor +** Processing line: ~ # Remember which cell the neighbor came from~ - Inside source: true *** True Line Result - # And calculate the path -** Processing line: ~ calc_path~ + # Remember which cell the neighbor came from +** Processing line: ~ breadth_first_search.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - calc_path -** Processing line: ~ end~ + breadth_first_search.came_from[neighbor] = new_frontier +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ render~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - render -** Processing line: ~ input~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - input + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67592,182 +74943,178 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def defaults~ +** Processing line: ~ # Calculates the Dijkstra Search from the beginning to the end~ - Inside source: true *** True Line Result - def defaults -** Processing line: ~ # Variables to edit the size and appearance of the grid~ + # Calculates the Dijkstra Search from the beginning to the end +** Processing line: ~~ - Inside source: true *** True Line Result - # Variables to edit the size and appearance of the grid -** Processing line: ~ # Freely customizable to user's liking~ + +** Processing line: ~ def calc_dijkstra~ - Inside source: true *** True Line Result - # Freely customizable to user's liking -** Processing line: ~ grid.width ||= 15~ + def calc_dijkstra +** Processing line: ~ # The initial values for the Dijkstra search~ - Inside source: true *** True Line Result - grid.width ||= 15 -** Processing line: ~ grid.height ||= 15~ + # The initial values for the Dijkstra search +** Processing line: ~ dijkstra_search.frontier << [state.star, 0]~ - Inside source: true *** True Line Result - grid.height ||= 15 -** Processing line: ~ grid.cell_size ||= 40~ + dijkstra_search.frontier << [state.star, 0] +** Processing line: ~ dijkstra_search.came_from[state.star] = nil~ - Inside source: true *** True Line Result - grid.cell_size ||= 40 -** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ + dijkstra_search.came_from[state.star] = nil +** Processing line: ~ dijkstra_search.cost_so_far[state.star] = 0~ - Inside source: true *** True Line Result - grid.rect ||= [0, 0, grid.width, grid.height] + dijkstra_search.cost_so_far[state.star] = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # At some step the animation will end,~ -- Inside source: true -*** True Line Result - # At some step the animation will end, -** Processing line: ~ # and further steps won't change anything (the whole grid.widthill be explored)~ +** Processing line: ~ # Until their are no more cells to be explored~ - Inside source: true *** True Line Result - # and further steps won't change anything (the whole grid.widthill be explored) -** Processing line: ~ # This step is roughly the grid's width * height~ + # Until their are no more cells to be explored +** Processing line: ~ until dijkstra_search.frontier.empty?~ - Inside source: true *** True Line Result - # This step is roughly the grid's width * height -** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ + until dijkstra_search.frontier.empty? +** Processing line: ~ # Get the next cell to be explored from~ - Inside source: true *** True Line Result - # When anim_steps equals max_steps no more calculations will occur -** Processing line: ~ # and the slider will be at the end~ + # Get the next cell to be explored from +** Processing line: ~ # We get the first element of the array which is the cell. The second element is the priority.~ - Inside source: true *** True Line Result - # and the slider will be at the end -** Processing line: ~ state.max_steps ||= args.state.grid.width * args.state.grid.height~ + # We get the first element of the array which is the cell. The second element is the priority. +** Processing line: ~ current = dijkstra_search.frontier.shift[0]~ - Inside source: true *** True Line Result - state.max_steps ||= args.state.grid.width * args.state.grid.height + current = dijkstra_search.frontier.shift[0] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The location of the star and walls of the grid~ -- Inside source: true -*** True Line Result - # The location of the star and walls of the grid -** Processing line: ~ # They can be modified to have a different initial grid~ +** Processing line: ~ # Stop the search if we found the target~ - Inside source: true *** True Line Result - # They can be modified to have a different initial grid -** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ + # Stop the search if we found the target +** Processing line: ~ return if current == state.target~ - Inside source: true *** True Line Result - # Walls are stored in a hash for quick look up when doing the search -** Processing line: ~ state.star ||= [2, 8]~ + return if current == state.target +** Processing line: ~~ - Inside source: true *** True Line Result - state.star ||= [2, 8] -** Processing line: ~ state.target ||= [10, 5]~ + +** Processing line: ~ # For each of the neighbors~ - Inside source: true *** True Line Result - state.target ||= [10, 5] -** Processing line: ~ state.walls ||= {}~ + # For each of the neighbors +** Processing line: ~ adjacent_neighbors(current).each do | neighbor |~ - Inside source: true *** True Line Result - state.walls ||= {} -** Processing line: ~~ + adjacent_neighbors(current).each do | neighbor | +** Processing line: ~ # Unless this cell is a wall or has already been explored.~ - Inside source: true *** True Line Result - -** Processing line: ~ # Variables that are used by the breadth first search~ + # Unless this cell is a wall or has already been explored. +** Processing line: ~ unless dijkstra_search.came_from.has_key?(neighbor) or state.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - # Variables that are used by the breadth first search -** Processing line: ~ # Storing cells that the search has visited, prevents unnecessary steps~ + unless dijkstra_search.came_from.has_key?(neighbor) or state.walls.has_key?(neighbor) +** Processing line: ~ # Calculate the movement cost of getting to this cell and memo~ - Inside source: true *** True Line Result - # Storing cells that the search has visited, prevents unnecessary steps -** Processing line: ~ # Expanding the frontier of the search in order makes the search expand~ + # Calculate the movement cost of getting to this cell and memo +** Processing line: ~ new_cost = dijkstra_search.cost_so_far[current] + cost(neighbor)~ - Inside source: true *** True Line Result - # Expanding the frontier of the search in order makes the search expand -** Processing line: ~ # from the center outward~ + new_cost = dijkstra_search.cost_so_far[current] + cost(neighbor) +** Processing line: ~ dijkstra_search.cost_so_far[neighbor] = new_cost~ - Inside source: true *** True Line Result - # from the center outward + dijkstra_search.cost_so_far[neighbor] = new_cost ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Visited cells in the first grid~ +** Processing line: ~ # Add this neighbor to the cells too be explored~ - Inside source: true *** True Line Result - # Visited cells in the first grid -** Processing line: ~ state.visited ||= {}~ + # Add this neighbor to the cells too be explored +** Processing line: ~ dijkstra_search.frontier << [neighbor, new_cost]~ - Inside source: true *** True Line Result - state.visited ||= {} -** Processing line: ~ # Visited cells in the second grid~ + dijkstra_search.frontier << [neighbor, new_cost] +** Processing line: ~ dijkstra_search.came_from[neighbor] = current~ - Inside source: true *** True Line Result - # Visited cells in the second grid -** Processing line: ~ state.early_exit_visited ||= {}~ + dijkstra_search.came_from[neighbor] = current +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.early_exit_visited ||= {} -** Processing line: ~ # The cells from which the search is to expand~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The cells from which the search is to expand -** Processing line: ~ state.frontier ||= []~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.frontier ||= [] -** Processing line: ~ # A hash of where each cell was expanded from~ + +** Processing line: ~ # Sort the frontier so exploration occurs that have a low cost so far.~ - Inside source: true *** True Line Result - # A hash of where each cell was expanded from -** Processing line: ~ # The key is a cell, and the value is the cell it came from~ + # Sort the frontier so exploration occurs that have a low cost so far. +** Processing line: ~ # My implementation of a priority queue~ - Inside source: true *** True Line Result - # The key is a cell, and the value is the cell it came from -** Processing line: ~ state.came_from ||= {}~ + # My implementation of a priority queue +** Processing line: ~ dijkstra_search.frontier = dijkstra_search.frontier.sort_by {|cell, priority| priority}~ - Inside source: true *** True Line Result - state.came_from ||= {} -** Processing line: ~ # Cells that are part of the path from the target to the star~ + dijkstra_search.frontier = dijkstra_search.frontier.sort_by {|cell, priority| priority} +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Cells that are part of the path from the target to the star -** Processing line: ~ state.path ||= {}~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.path ||= {} + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # What the user is currently editing on the grid~ +** Processing line: ~ def cost(cell)~ - Inside source: true *** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # We store this value, because we want to remember the value even when~ + def cost(cell) +** Processing line: ~ if state.hills.has_key?(cell)~ - Inside source: true *** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ + if state.hills.has_key?(cell) +** Processing line: ~ return 5~ - Inside source: true *** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ + return 5 +** Processing line: ~ else~ - Inside source: true *** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ state.current_input ||= :none~ + else +** Processing line: ~ return 1~ - Inside source: true *** True Line Result - state.current_input ||= :none + return 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67776,98 +75123,114 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws everything onto the screen~ +** Processing line: ~~ - Inside source: true *** True Line Result - # Draws everything onto the screen -** Processing line: ~ def render~ + +** Processing line: ~~ - Inside source: true *** True Line Result - def render -** Processing line: ~ render_background~ + +** Processing line: ~~ - Inside source: true *** True Line Result - render_background -** Processing line: ~ render_heat_map~ + +** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ - Inside source: true *** True Line Result - render_heat_map -** Processing line: ~ render_walls~ + # Moves the star to the cell closest to the mouse in the first grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - render_walls -** Processing line: ~ render_path~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - render_path -** Processing line: ~ render_star~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star~ - Inside source: true *** True Line Result - render_star -** Processing line: ~ render_target~ + def input_star +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - render_target -** Processing line: ~ render_labels~ + old_star = state.star.clone +** Processing line: ~ unless cell_closest_to_mouse == state.target~ - Inside source: true *** True Line Result - render_labels -** Processing line: ~ end~ + unless cell_closest_to_mouse == state.target +** Processing line: ~ state.star = cell_closest_to_mouse~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.star = cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ + end +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - # The methods below subdivide the task of drawing everything to the screen + unless old_star == state.star +** Processing line: ~ reset_search~ +- Inside source: true +*** True Line Result + reset_search +** 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: ~ # Draws what the grid looks like with nothing on it~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - # Draws what the grid looks like with nothing on it -** Processing line: ~ def render_background~ + # Moves the star to the cell closest to the mouse in the second grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - def render_background -** Processing line: ~ render_unvisited~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - render_unvisited -** Processing line: ~ render_grid_lines~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def input_star2~ - Inside source: true *** True Line Result - render_grid_lines -** Processing line: ~ end~ + def input_star2 +** Processing line: ~ old_star = state.star.clone~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + old_star = state.star.clone +** Processing line: ~ unless cell_closest_to_mouse2 == state.target~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws both grids~ + unless cell_closest_to_mouse2 == state.target +** Processing line: ~ state.star = cell_closest_to_mouse2~ - Inside source: true *** True Line Result - # Draws both grids -** Processing line: ~ def render_unvisited~ + state.star = cell_closest_to_mouse2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - def render_unvisited -** Processing line: ~ outputs.solids << [scale_up(grid.rect), unvisited_color]~ + end +** Processing line: ~ unless old_star == state.star~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(grid.rect), unvisited_color] -** Processing line: ~ outputs.solids << [early_exit_scale_up(grid.rect), unvisited_color]~ + unless old_star == state.star +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - outputs.solids << [early_exit_scale_up(grid.rect), unvisited_color] + reset_search +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67876,46 +75239,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws grid lines to show the division of the grid into cells~ +** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ - Inside source: true *** True Line Result - # Draws grid lines to show the division of the grid into cells -** Processing line: ~ def render_grid_lines~ + # Moves the target to the grid closest to the mouse in the first grid +** Processing line: ~ # Only reset_searchs the search if the target changes position~ - Inside source: true *** True Line Result - def render_grid_lines -** Processing line: ~ for x in 0..grid.width~ + # Only reset_searchs the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - for x in 0..grid.width -** Processing line: ~ outputs.lines << vertical_line(x)~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def input_target~ - Inside source: true *** True Line Result - outputs.lines << vertical_line(x) -** Processing line: ~ outputs.lines << early_exit_vertical_line(x)~ + def input_target +** Processing line: ~ old_target = state.target.clone~ - Inside source: true *** True Line Result - outputs.lines << early_exit_vertical_line(x) -** Processing line: ~ end~ + old_target = state.target.clone +** Processing line: ~ unless cell_closest_to_mouse == state.star~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + unless cell_closest_to_mouse == state.star +** Processing line: ~ state.target = cell_closest_to_mouse~ - Inside source: true *** True Line Result - -** Processing line: ~ for y in 0..grid.height~ + state.target = cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - for y in 0..grid.height -** Processing line: ~ outputs.lines << horizontal_line(y)~ + end +** Processing line: ~ unless old_target == state.target~ - Inside source: true *** True Line Result - outputs.lines << horizontal_line(y) -** Processing line: ~ outputs.lines << early_exit_horizontal_line(y)~ + unless old_target == state.target +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - outputs.lines << early_exit_horizontal_line(y) + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67928,58 +75291,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw vertical lines given an index~ -- Inside source: true -*** True Line Result - # Easy way to draw vertical lines given an index -** Processing line: ~ def vertical_line column~ -- Inside source: true -*** True Line Result - def vertical_line column -** Processing line: ~ scale_up([column, 0, column, grid.height])~ +** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - scale_up([column, 0, column, grid.height]) -** Processing line: ~ end~ + # Moves the target to the cell closest to the mouse in the second grid +** Processing line: ~ # Only reset_searchs the search if the target changes position~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Only reset_searchs the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - -** Processing line: ~ # Easy way to draw horizontal lines given an index~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def input_target2~ - Inside source: true *** True Line Result - # Easy way to draw horizontal lines given an index -** Processing line: ~ def horizontal_line row~ + def input_target2 +** Processing line: ~ old_target = state.target.clone~ - Inside source: true *** True Line Result - def horizontal_line row -** Processing line: ~ scale_up([0, row, grid.width, row])~ + old_target = state.target.clone +** Processing line: ~ unless cell_closest_to_mouse2 == state.star~ - Inside source: true *** True Line Result - scale_up([0, row, grid.width, row]) -** Processing line: ~ end~ + unless cell_closest_to_mouse2 == state.star +** Processing line: ~ state.target = cell_closest_to_mouse2~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.target = cell_closest_to_mouse2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Easy way to draw vertical lines given an index~ + end +** Processing line: ~ unless old_target == state.target~ - Inside source: true *** True Line Result - # Easy way to draw vertical lines given an index -** Processing line: ~ def early_exit_vertical_line column~ + unless old_target == state.target +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - def early_exit_vertical_line column -** Processing line: ~ scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -67988,46 +75343,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw horizontal lines given an index~ +** Processing line: ~ # Removes walls in the first grid that are under the cursor~ - Inside source: true *** True Line Result - # Easy way to draw horizontal lines given an index -** Processing line: ~ def early_exit_horizontal_line row~ + # Removes walls in the first grid that are under the cursor +** Processing line: ~ def input_remove_wall~ - Inside source: true *** True Line Result - def early_exit_horizontal_line row -** Processing line: ~ scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ + def input_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) -** Processing line: ~ end~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws the walls on both grids~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_over_grid?~ - Inside source: true *** True Line Result - # Draws the walls on both grids -** Processing line: ~ def render_walls~ + if mouse_over_grid? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - def render_walls -** Processing line: ~ state.walls.each_key do |wall|~ + if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - state.walls.each_key do |wall| -** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ + state.walls.delete(cell_closest_to_mouse) +** Processing line: ~ state.hills.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(wall), wall_color] -** Processing line: ~ outputs.solids << [early_exit_scale_up(wall), wall_color]~ + state.hills.delete(cell_closest_to_mouse) +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - outputs.solids << [early_exit_scale_up(wall), wall_color] + reset_search +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68040,70 +75399,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the star on both grids~ -- Inside source: true -*** True Line Result - # Renders the star on both grids -** Processing line: ~ def render_star~ -- Inside source: true -*** True Line Result - def render_star -** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ -- Inside source: true -*** True Line Result - outputs.sprites << [scale_up(state.star), 'star.png'] -** Processing line: ~ outputs.sprites << [early_exit_scale_up(state.star), 'star.png']~ -- Inside source: true -*** True Line Result - outputs.sprites << [early_exit_scale_up(state.star), 'star.png'] -** Processing line: ~ end~ +** Processing line: ~ # Removes walls in the second grid that are under the cursor~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Removes walls in the second grid that are under the cursor +** Processing line: ~ def input_remove_wall2~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the target on both grids~ + def input_remove_wall2 +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - # Renders the target on both grids -** Processing line: ~ def render_target~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - def render_target -** Processing line: ~ outputs.sprites << [scale_up(state.target), 'target.png']~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(state.target), 'target.png'] -** Processing line: ~ outputs.sprites << [early_exit_scale_up(state.target), 'target.png']~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if mouse_over_grid2?~ - Inside source: true *** True Line Result - outputs.sprites << [early_exit_scale_up(state.target), 'target.png'] -** Processing line: ~ end~ + if mouse_over_grid2? +** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2) +** Processing line: ~ state.walls.delete(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - -** Processing line: ~ # Labels the grids~ + state.walls.delete(cell_closest_to_mouse2) +** Processing line: ~ state.hills.delete(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - # Labels the grids -** Processing line: ~ def render_labels~ + state.hills.delete(cell_closest_to_mouse2) +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - def render_labels -** Processing line: ~ outputs.labels << [200, 625, "Without early exit"]~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [200, 625, "Without early exit"] -** Processing line: ~ outputs.labels << [875, 625, "With early exit"]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [875, 625, "With early exit"] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68112,42 +75455,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the path based off of the state.path hash~ -- Inside source: true -*** True Line Result - # Renders the path based off of the state.path hash -** Processing line: ~ def render_path~ -- Inside source: true -*** True Line Result - def render_path -** Processing line: ~ # If the star and target are disconnected there will only be one path~ -- Inside source: true -*** True Line Result - # If the star and target are disconnected there will only be one path -** Processing line: ~ # The path should not render in that case~ +** Processing line: ~ # Adds a hill in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # The path should not render in that case -** Processing line: ~ unless state.path.size == 1~ + # Adds a hill in the first grid in the cell the mouse is over +** Processing line: ~ def input_add_hill~ - Inside source: true *** True Line Result - unless state.path.size == 1 -** Processing line: ~ state.path.each_key do | cell |~ + def input_add_hill +** Processing line: ~ if mouse_over_grid?~ - Inside source: true *** True Line Result - state.path.each_key do | cell | -** Processing line: ~ # Renders path on both grids~ + if mouse_over_grid? +** Processing line: ~ unless state.hills.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - # Renders path on both grids -** Processing line: ~ outputs.solids << [scale_up(cell), path_color]~ + unless state.hills.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.hills[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(cell), path_color] -** Processing line: ~ outputs.solids << [early_exit_scale_up(cell), path_color]~ + state.hills[cell_closest_to_mouse] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - outputs.solids << [early_exit_scale_up(cell), path_color] + reset_search ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68164,38 +75495,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path from the target to the star after the search is over~ +** Processing line: ~~ - Inside source: true *** True Line Result - # Calculates the path from the target to the star after the search is over -** Processing line: ~ # Relies on the came_from hash~ + +** Processing line: ~ # Adds a hill in the second grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Relies on the came_from hash -** Processing line: ~ # Fills the state.path hash, which is later rendered on screen~ + # Adds a hill in the second grid in the cell the mouse is over +** Processing line: ~ def input_add_hill2~ - Inside source: true *** True Line Result - # Fills the state.path hash, which is later rendered on screen -** Processing line: ~ def calc_path~ + def input_add_hill2 +** Processing line: ~ if mouse_over_grid2?~ - Inside source: true *** True Line Result - def calc_path -** Processing line: ~ endpoint = state.target~ + if mouse_over_grid2? +** Processing line: ~ unless state.hills.has_key?(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - endpoint = state.target -** Processing line: ~ while endpoint~ + unless state.hills.has_key?(cell_closest_to_mouse2) +** Processing line: ~ state.hills[cell_closest_to_mouse2] = true~ - Inside source: true *** True Line Result - while endpoint -** Processing line: ~ state.path[endpoint] = true~ + state.hills[cell_closest_to_mouse2] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - state.path[endpoint] = true -** Processing line: ~ endpoint = state.came_from[endpoint]~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - endpoint = state.came_from[endpoint] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68208,74 +75539,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Representation of how far away visited cells are from the star~ -- Inside source: true -*** True Line Result - # Representation of how far away visited cells are from the star -** Processing line: ~ # Replaces the render_visited method~ -- Inside source: true -*** True Line Result - # Replaces the render_visited method -** Processing line: ~ # Visually demonstrates the effectiveness of early exit for pathfinding~ +** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Visually demonstrates the effectiveness of early exit for pathfinding -** Processing line: ~ def render_heat_map~ + # Adds a wall in the first grid in the cell the mouse is over +** Processing line: ~ def input_add_wall~ - Inside source: true *** True Line Result - def render_heat_map -** Processing line: ~ state.visited.each_key do | visited_cell |~ + def input_add_wall +** Processing line: ~ if mouse_over_grid?~ - Inside source: true *** True Line Result - state.visited.each_key do | visited_cell | -** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ + if mouse_over_grid? +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs -** Processing line: ~ max_distance = grid.width + grid.height~ + unless state.walls.has_key?(cell_closest_to_mouse) +** Processing line: ~ state.hills.delete(cell_closest_to_mouse)~ - Inside source: true *** True Line Result - max_distance = grid.width + grid.height -** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ + state.hills.delete(cell_closest_to_mouse) +** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - alpha = 255.to_i * distance.to_i / max_distance.to_i -** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ + state.walls[cell_closest_to_mouse] = true +** Processing line: ~ reset_search~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(visited_cell), red, alpha] -** Processing line: ~ # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ + reset_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - # outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.early_exit_visited.each_key do | visited_cell |~ +** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ - Inside source: true *** True Line Result - state.early_exit_visited.each_key do | visited_cell | -** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ + # Adds a wall in the second grid in the cell the mouse is over +** Processing line: ~ def input_add_wall2~ - Inside source: true *** True Line Result - distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs -** Processing line: ~ max_distance = grid.width + grid.height~ + def input_add_wall2 +** Processing line: ~ if mouse_over_grid2?~ - Inside source: true *** True Line Result - max_distance = grid.width + grid.height -** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ + if mouse_over_grid2? +** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - alpha = 255.to_i * distance.to_i / max_distance.to_i -** Processing line: ~ outputs.solids << [early_exit_scale_up(visited_cell), red, alpha]~ + unless state.walls.has_key?(cell_closest_to_mouse2) +** Processing line: ~ state.hills.delete(cell_closest_to_mouse2)~ - Inside source: true *** True Line Result - outputs.solids << [early_exit_scale_up(visited_cell), red, alpha] + state.hills.delete(cell_closest_to_mouse2) +** Processing line: ~ state.walls[cell_closest_to_mouse2] = true~ +- Inside source: true +*** True Line Result + state.walls[cell_closest_to_mouse2] = true +** Processing line: ~ reset_search~ +- Inside source: true +*** True Line Result + reset_search +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68288,130 +75627,138 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ +** Processing line: ~ # Whenever the user edits the grid,~ - Inside source: true *** True Line Result - # Translates the given cell grid.width + 1 to the right and then scales up -** Processing line: ~ # Used to draw cells for the second grid~ + # Whenever the user edits the grid, +** Processing line: ~ # The search has to be reset_searchd upto the current step~ - Inside source: true *** True Line Result - # Used to draw cells for the second grid -** Processing line: ~ # This method does not work for lines,~ + # The search has to be reset_searchd upto the current step +** Processing line: ~ # with the current grid as the initial state of the grid~ - Inside source: true *** True Line Result - # This method does not work for lines, -** Processing line: ~ # so separate methods exist for the grid lines~ + # with the current grid as the initial state of the grid +** Processing line: ~ def reset_search~ - Inside source: true *** True Line Result - # so separate methods exist for the grid lines -** Processing line: ~ def early_exit_scale_up(cell)~ + def reset_search +** Processing line: ~ breadth_first_search.visited = {}~ - Inside source: true *** True Line Result - def early_exit_scale_up(cell) -** Processing line: ~ cell_clone = cell.clone~ + breadth_first_search.visited = {} +** Processing line: ~ breadth_first_search.frontier = []~ - Inside source: true *** True Line Result - cell_clone = cell.clone -** Processing line: ~ cell_clone.x += grid.width + 1~ + breadth_first_search.frontier = [] +** Processing line: ~ breadth_first_search.came_from = {}~ - Inside source: true *** True Line Result - cell_clone.x += grid.width + 1 -** Processing line: ~ scale_up(cell_clone)~ + breadth_first_search.came_from = {} +** Processing line: ~~ - Inside source: true *** True Line Result - scale_up(cell_clone) -** Processing line: ~ end~ + +** Processing line: ~ dijkstra_search.frontier = []~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + dijkstra_search.frontier = [] +** Processing line: ~ dijkstra_search.came_from = {}~ - Inside source: true *** True Line Result - -** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ + dijkstra_search.came_from = {} +** Processing line: ~ dijkstra_search.cost_so_far = {}~ - Inside source: true *** True Line Result - # In code, the cells are represented as 1x1 rectangles -** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ + dijkstra_search.cost_so_far = {} +** Processing line: ~ end~ - Inside source: true *** True Line Result - # When drawn, the cells are larger than 1x1 rectangles -** Processing line: ~ # This method is used to scale up cells, and lines~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # This method is used to scale up cells, and lines -** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ + +** Processing line: ~~ - Inside source: true *** True Line Result - # Objects are scaled up according to the grid.cell_size variable -** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ + +** Processing line: ~~ - Inside source: true *** True Line Result - # This allows for easy customization of the visual scale of the grid -** Processing line: ~ def scale_up(cell)~ + +** Processing line: ~ # Returns a list of adjacent cells~ - Inside source: true *** True Line Result - def scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + # Returns a list of adjacent cells +** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + # Used to determine what the next cells to be added to the frontier are +** Processing line: ~ def adjacent_neighbors(cell)~ - Inside source: true *** True Line Result - cell = cell.clone + def adjacent_neighbors(cell) +** Processing line: ~ neighbors = []~ +- Inside source: true +*** True Line Result + neighbors = [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If cell is just an x and y coordinate~ +** Processing line: ~ # Gets all the valid neighbors into the array~ - Inside source: true *** True Line Result - # If cell is just an x and y coordinate -** Processing line: ~ if cell.size == 2~ + # Gets all the valid neighbors into the array +** Processing line: ~ # From southern neighbor, clockwise~ - Inside source: true *** True Line Result - if cell.size == 2 -** Processing line: ~ # Add a width and height of 1~ + # From southern neighbor, clockwise +** Processing line: ~ neighbors << [cell.x , cell.y - 1] unless cell.y == 0~ - Inside source: true *** True Line Result - # Add a width and height of 1 -** Processing line: ~ cell << 1~ + neighbors << [cell.x , cell.y - 1] unless cell.y == 0 +** Processing line: ~ neighbors << [cell.x - 1, cell.y ] unless cell.x == 0~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ cell << 1~ + neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 +** Processing line: ~ neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ end~ + neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 +** Processing line: ~ neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1~ - Inside source: true *** True Line Result - end + neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Scale all the values up~ +** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ - Inside source: true *** True Line Result - # Scale all the values up -** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ + # Sorts the neighbors so the rendered path is a zigzag path +** Processing line: ~ # Cells in a diagonal direction are given priority~ - Inside source: true *** True Line Result - cell.map! { |value| value * grid.cell_size } -** Processing line: ~~ + # Cells in a diagonal direction are given priority +** Processing line: ~ # Comment this line to see the difference~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns the scaled up cell~ + # Comment this line to see the difference +** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ - Inside source: true *** True Line Result - # Returns the scaled up cell -** Processing line: ~ cell~ + neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } +** Processing line: ~~ - Inside source: true *** True Line Result - cell + +** Processing line: ~ neighbors~ +- Inside source: true +*** True Line Result + neighbors ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68420,262 +75767,254 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method processes user input every tick~ -- Inside source: true -*** True Line Result - # This method processes user input every tick -** Processing line: ~ # Any method with "1" is related to the first grid~ +** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ - Inside source: true *** True Line Result - # Any method with "1" is related to the first grid -** Processing line: ~ # Any method with "2" is related to the second grid~ + # Finds the vertical and horizontal distance of a cell from the star +** Processing line: ~ # and returns the larger value~ - Inside source: true *** True Line Result - # Any method with "2" is related to the second grid -** Processing line: ~ def input~ + # and returns the larger value +** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ - Inside source: true *** True Line Result - def input -** Processing line: ~ # The program has to remember that the user is dragging an object~ + # This method is used to have a zigzag pattern in the rendered path +** Processing line: ~ # A cell that is [5, 5] from the star,~ - Inside source: true *** True Line Result - # The program has to remember that the user is dragging an object -** Processing line: ~ # even when the mouse is no longer over that object~ + # A cell that is [5, 5] from the star, +** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ - Inside source: true *** True Line Result - # even when the mouse is no longer over that object -** Processing line: ~ # So detecting input and processing input is separate~ + # is explored before over a cell that is [0, 7] away. +** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ - Inside source: true *** True Line Result - # So detecting input and processing input is separate -** Processing line: ~ detect_input~ + # So, if possible, the search tries to go diagonal (zigzag) first +** Processing line: ~ def proximity_to_star(x, y)~ - Inside source: true *** True Line Result - detect_input -** Processing line: ~ process_input~ + def proximity_to_star(x, y) +** Processing line: ~ distance_x = (state.star.x - x).abs~ - Inside source: true *** True Line Result - process_input -** Processing line: ~ end~ + distance_x = (state.star.x - x).abs +** Processing line: ~ distance_y = (state.star.y - y).abs~ - Inside source: true *** True Line Result - end + distance_y = (state.star.y - y).abs ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Determines what the user is editing and stores the value~ -- Inside source: true -*** True Line Result - # Determines what the user is editing and stores the value -** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ +** Processing line: ~ if distance_x > distance_y~ - Inside source: true *** True Line Result - # Storing the value allows the user to continue the same edit as long as the -** Processing line: ~ # mouse left click is held~ + if distance_x > distance_y +** Processing line: ~ return distance_x~ - Inside source: true *** True Line Result - # mouse left click is held -** Processing line: ~ def detect_input~ + return distance_x +** Processing line: ~ else~ - Inside source: true *** True Line Result - def detect_input -** Processing line: ~ # When the mouse is up, nothing is being edited~ + else +** Processing line: ~ return distance_y~ - Inside source: true *** True Line Result - # When the mouse is up, nothing is being edited -** Processing line: ~ if inputs.mouse.up~ + return distance_y +** Processing line: ~ end~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ state.current_input = :none~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.current_input = :none -** Processing line: ~ # When the star in the no second grid is clicked~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # When the star in the no second grid is clicked -** Processing line: ~ elsif star_clicked?~ + +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - elsif star_clicked? -** Processing line: ~ state.current_input = :star~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - state.current_input = :star -** Processing line: ~ # When the star in the second grid is clicked~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse helps with this~ - Inside source: true *** True Line Result - # When the star in the second grid is clicked -** Processing line: ~ elsif star2_clicked?~ + # Finding the cell closest to the mouse helps with this +** Processing line: ~ def cell_closest_to_mouse~ - Inside source: true *** True Line Result - elsif star2_clicked? -** Processing line: ~ state.current_input = :star2~ + def cell_closest_to_mouse +** Processing line: ~ # Closest cell to the mouse in the first grid~ - Inside source: true *** True Line Result - state.current_input = :star2 -** Processing line: ~ # When the target in the no second grid is clicked~ + # Closest cell to the mouse in the first grid +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - # When the target in the no second grid is clicked -** Processing line: ~ elsif target_clicked?~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - elsif target_clicked? -** Processing line: ~ state.current_input = :target~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Bound x and y to the grid~ - Inside source: true *** True Line Result - state.current_input = :target -** Processing line: ~ # When the target in the second grid is clicked~ + # Bound x and y to the grid +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - # When the target in the second grid is clicked -** Processing line: ~ elsif target2_clicked?~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - elsif target2_clicked? -** Processing line: ~ state.current_input = :target2~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - state.current_input = :target2 -** Processing line: ~ # When a wall in the first grid is clicked~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - # When a wall in the first grid is clicked -** Processing line: ~ elsif wall_clicked?~ + [x, y] +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif wall_clicked? -** Processing line: ~ state.current_input = :remove_wall~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.current_input = :remove_wall -** Processing line: ~ # When a wall in the second grid is clicked~ + +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - # When a wall in the second grid is clicked -** Processing line: ~ elsif wall2_clicked?~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - elsif wall2_clicked? -** Processing line: ~ state.current_input = :remove_wall2~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ - Inside source: true *** True Line Result - state.current_input = :remove_wall2 -** Processing line: ~ # When the first grid is clicked~ + # Finding the cell closest to the mouse in the second grid helps with this +** Processing line: ~ def cell_closest_to_mouse2~ - Inside source: true *** True Line Result - # When the first grid is clicked -** Processing line: ~ elsif grid_clicked?~ + def cell_closest_to_mouse2 +** Processing line: ~ # Closest cell grid to the mouse in the second~ - Inside source: true *** True Line Result - elsif grid_clicked? -** Processing line: ~ state.current_input = :add_wall~ + # Closest cell grid to the mouse in the second +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - state.current_input = :add_wall -** Processing line: ~ # When the second grid is clicked~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - # When the second grid is clicked -** Processing line: ~ elsif grid2_clicked?~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Translate the cell to the first grid~ - Inside source: true *** True Line Result - elsif grid2_clicked? -** Processing line: ~ state.current_input = :add_wall2~ + # Translate the cell to the first grid +** Processing line: ~ x -= grid.width + 1~ - Inside source: true *** True Line Result - state.current_input = :add_wall2 -** Processing line: ~ end~ + x -= grid.width + 1 +** Processing line: ~ # Bound x and y to the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Bound x and y to the first grid +** Processing line: ~ x = 0 if x < 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + x = 0 if x < 0 +** Processing line: ~ y = 0 if y < 0~ - Inside source: true *** True Line Result - -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ + y = 0 if y < 0 +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_input~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - def process_input -** Processing line: ~ if state.current_input == :star~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - if state.current_input == :star -** Processing line: ~ input_star~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - input_star -** Processing line: ~ elsif state.current_input == :star2~ + [x, y] +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif state.current_input == :star2 -** Processing line: ~ input_star2~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - input_star2 -** Processing line: ~ elsif state.current_input == :target~ + +** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ - Inside source: true *** True Line Result - elsif state.current_input == :target -** Processing line: ~ input_target~ + # Signal that the user is going to be moving the star from the first grid +** Processing line: ~ def mouse_over_star?~ - Inside source: true *** True Line Result - input_target -** Processing line: ~ elsif state.current_input == :target2~ + def mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(state.star))~ - Inside source: true *** True Line Result - elsif state.current_input == :target2 -** Processing line: ~ input_target2~ + inputs.mouse.point.inside_rect?(scale_up(state.star)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - input_target2 -** Processing line: ~ elsif state.current_input == :remove_wall~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif state.current_input == :remove_wall -** Processing line: ~ input_remove_wall~ + +** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ - Inside source: true *** True Line Result - input_remove_wall -** Processing line: ~ elsif state.current_input == :remove_wall2~ + # Signal that the user is going to be moving the star from the second grid +** Processing line: ~ def mouse_over_star2?~ - Inside source: true *** True Line Result - elsif state.current_input == :remove_wall2 -** Processing line: ~ input_remove_wall2~ + def mouse_over_star2? +** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(state.star))~ - Inside source: true *** True Line Result - input_remove_wall2 -** Processing line: ~ elsif state.current_input == :add_wall~ + inputs.mouse.point.inside_rect?(move_and_scale_up(state.star)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif state.current_input == :add_wall -** Processing line: ~ input_add_wall~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - input_add_wall -** Processing line: ~ elsif state.current_input == :add_wall2~ + +** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ - Inside source: true *** True Line Result - elsif state.current_input == :add_wall2 -** Processing line: ~ input_add_wall2~ + # Signal that the user is going to be moving the target from the first grid +** Processing line: ~ def mouse_over_target?~ - Inside source: true *** True Line Result - input_add_wall2 -** Processing line: ~ end~ + def mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(state.target))~ - Inside source: true *** True Line Result - end + inputs.mouse.point.inside_rect?(scale_up(state.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68684,130 +76023,126 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ +** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the first grid -** Processing line: ~ # Only resets the search if the star changes position~ + # Signal that the user is going to be moving the target from the second grid +** Processing line: ~ def mouse_over_target2?~ - Inside source: true *** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + def mouse_over_target2? +** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(state.target))~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star~ + inputs.mouse.point.inside_rect?(move_and_scale_up(state.target)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - def input_star -** Processing line: ~ old_star = state.star.clone~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ state.star = cell_closest_to_mouse~ + +** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse -** Processing line: ~ unless old_star == state.star~ + # Signal that the user is going to be removing walls from the first grid +** Processing line: ~ def mouse_over_wall?~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ reset_search~ + def mouse_over_wall? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + return true if inputs.mouse.point.inside_rect?(scale_up(wall)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ -- Inside source: true -*** True Line Result - # Moves the star to the cell closest to the mouse in the second grid -** Processing line: ~ # Only resets the search if the star changes position~ +** Processing line: ~ false~ - Inside source: true *** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star2~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def input_star2 -** Processing line: ~ old_star = state.star.clone~ + +** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ state.star = cell_closest_to_mouse2~ + # Signal that the user is going to be removing walls from the second grid +** Processing line: ~ def mouse_over_wall2?~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse2 -** Processing line: ~ unless old_star == state.star~ + def mouse_over_wall2? +** Processing line: ~ state.walls.each_key do | wall |~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ reset_search~ + state.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(move_and_scale_up(wall))~ - Inside source: true *** True Line Result - reset_search + return true if inputs.mouse.point.inside_rect?(move_and_scale_up(wall)) ** 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: ~ # Moves the target to the grid closest to the mouse in the first grid~ -- Inside source: true -*** True Line Result - # Moves the target to the grid closest to the mouse in the first grid -** Processing line: ~ # Only reset_searchs the search if the target changes position~ +** Processing line: ~ false~ - Inside source: true *** True Line Result - # Only reset_searchs the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def input_target~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def input_target -** Processing line: ~ old_target = state.target.clone~ + +** Processing line: ~ # Signal that the user is going to be removing hills from the first grid~ - Inside source: true *** True Line Result - old_target = state.target.clone -** Processing line: ~ state.target = cell_closest_to_mouse~ + # Signal that the user is going to be removing hills from the first grid +** Processing line: ~ def mouse_over_hill?~ - Inside source: true *** True Line Result - state.target = cell_closest_to_mouse -** Processing line: ~ unless old_target == state.target~ + def mouse_over_hill? +** Processing line: ~ state.hills.each_key do | hill |~ - Inside source: true *** True Line Result - unless old_target == state.target -** Processing line: ~ reset_search~ + state.hills.each_key do | hill | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(hill))~ - Inside source: true *** True Line Result - reset_search + return true if inputs.mouse.point.inside_rect?(scale_up(hill)) ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ false~ +- Inside source: true +*** True Line Result + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68816,42 +76151,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ +** Processing line: ~ # Signal that the user is going to be removing hills from the second grid~ - Inside source: true *** True Line Result - # Moves the target to the cell closest to the mouse in the second grid -** Processing line: ~ # Only reset_searchs the search if the target changes position~ + # Signal that the user is going to be removing hills from the second grid +** Processing line: ~ def mouse_over_hill2?~ - Inside source: true *** True Line Result - # Only reset_searchs the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + def mouse_over_hill2? +** Processing line: ~ state.hills.each_key do | hill |~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def input_target2~ + state.hills.each_key do | hill | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(move_and_scale_up(hill))~ - Inside source: true *** True Line Result - def input_target2 -** Processing line: ~ old_target = state.target.clone~ + return true if inputs.mouse.point.inside_rect?(move_and_scale_up(hill)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - old_target = state.target.clone -** Processing line: ~ state.target = cell_closest_to_mouse2~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.target = cell_closest_to_mouse2 -** Processing line: ~ unless old_target == state.target~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - unless old_target == state.target -** Processing line: ~ reset_search~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ +- Inside source: true +*** True Line Result + # Signal that the user is going to be adding walls from the first grid +** Processing line: ~ def mouse_over_grid?~ +- Inside source: true +*** True Line Result + def mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ +- Inside source: true +*** True Line Result + inputs.mouse.point.inside_rect?(scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68860,50 +76207,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the first grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the first grid that are under the cursor -** Processing line: ~ def input_remove_wall~ +** Processing line: ~ # Signal that the user is going to be adding walls from the second grid~ - Inside source: true *** True Line Result - def input_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ + # Signal that the user is going to be adding walls from the second grid +** Processing line: ~ def mouse_over_grid2?~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + def mouse_over_grid2? +** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(grid.rect))~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + inputs.mouse.point.inside_rect?(move_and_scale_up(grid.rect)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if mouse_inside_grid?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse)~ + +** Processing line: ~ # These methods provide handy aliases to colors~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ + # These methods provide handy aliases to colors +** Processing line: ~~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse) -** Processing line: ~ reset_search~ + +** Processing line: ~ # Light brown~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Light brown +** Processing line: ~ def unvisited_color~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def unvisited_color +** Processing line: ~ [221, 212, 213]~ - Inside source: true *** True Line Result - end + [221, 212, 213] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68912,50 +76255,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the second grid that are under the cursor~ +** Processing line: ~ # Camo Green~ - Inside source: true *** True Line Result - # Removes walls in the second grid that are under the cursor -** Processing line: ~ def input_remove_wall2~ + # Camo Green +** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result - def input_remove_wall2 -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ + def wall_color +** Processing line: ~ [134, 134, 120]~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + [134, 134, 120] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if mouse_inside_grid2?~ + +** Processing line: ~ # Pastel White~ - Inside source: true *** True Line Result - if mouse_inside_grid2? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse2)~ + # Pastel White +** Processing line: ~ def path_color~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse2) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse2)~ + def path_color +** Processing line: ~ [231, 230, 228]~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse2) -** Processing line: ~ reset_search~ + [231, 230, 228] +** Processing line: ~ end~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ def red~ - Inside source: true *** True Line Result - end + def red +** Processing line: ~ [255, 0, 0]~ +- Inside source: true +*** True Line Result + [255, 0, 0] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -68964,38 +76311,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ +** Processing line: ~ # A Green~ - Inside source: true *** True Line Result - # Adds a wall in the first grid in the cell the mouse is over -** Processing line: ~ def input_add_wall~ + # A Green +** Processing line: ~ def hill_color~ - Inside source: true *** True Line Result - def input_add_wall -** Processing line: ~ if mouse_inside_grid?~ + def hill_color +** Processing line: ~ [139, 173, 132]~ - Inside source: true *** True Line Result - if mouse_inside_grid? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ + [139, 173, 132] +** Processing line: ~ end~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse] = true -** Processing line: ~ reset_search~ + +** Processing line: ~ # Makes code more concise~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Makes code more concise +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def grid +** Processing line: ~ state.grid~ - Inside source: true *** True Line Result - end + state.grid ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69004,90 +76351,78 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ -- Inside source: true -*** True Line Result - # Adds a wall in the second grid in the cell the mouse is over -** Processing line: ~ def input_add_wall2~ -- Inside source: true -*** True Line Result - def input_add_wall2 -** Processing line: ~ if mouse_inside_grid2?~ +** Processing line: ~ def breadth_first_search~ - Inside source: true *** True Line Result - if mouse_inside_grid2? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse2)~ + def breadth_first_search +** Processing line: ~ state.breadth_first_search~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse2) -** Processing line: ~ state.walls[cell_closest_to_mouse2] = true~ + state.breadth_first_search +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse2] = true -** Processing line: ~ reset_search~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + +** Processing line: ~ def dijkstra_search~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def dijkstra_search +** Processing line: ~ state.dijkstra_search~ - Inside source: true *** True Line Result - end + state.dijkstra_search ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Whenever the user edits the grid,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Whenever the user edits the grid, -** Processing line: ~ # The search has to be reset_searchd upto the current step~ + +** Processing line: ~ # Method that is called by DragonRuby periodically~ - Inside source: true *** True Line Result - # The search has to be reset_searchd upto the current step -** Processing line: ~ # with the current grid as the initial state of the grid~ + # Method that is called by DragonRuby periodically +** Processing line: ~ # Used for updating animations and calculations~ - Inside source: true *** True Line Result - # with the current grid as the initial state of the grid -** Processing line: ~ def reset_search~ + # Used for updating animations and calculations +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def reset_search -** Processing line: ~ # Reset_Searchs the search~ + def tick args +** Processing line: ~~ - Inside source: true *** True Line Result - # Reset_Searchs the search -** Processing line: ~ state.frontier = []~ + +** Processing line: ~ # Pressing r will reset the application~ - Inside source: true *** True Line Result - state.frontier = [] -** Processing line: ~ state.visited = {}~ + # Pressing r will reset the application +** Processing line: ~ if args.inputs.keyboard.key_down.r~ - Inside source: true *** True Line Result - state.visited = {} -** Processing line: ~ state.early_exit_visited = {}~ + if args.inputs.keyboard.key_down.r +** Processing line: ~ args.gtk.reset~ - Inside source: true *** True Line Result - state.early_exit_visited = {} -** Processing line: ~ state.came_from = {}~ + args.gtk.reset +** Processing line: ~ reset~ - Inside source: true *** True Line Result - state.came_from = {} -** Processing line: ~ state.path = {}~ + reset +** Processing line: ~ return~ - Inside source: true *** True Line Result - state.path = {} + return ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69096,134 +76431,154 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the search forward one step~ +** Processing line: ~ # Every tick, new args are passed, and the Dijkstra tick method is called~ - Inside source: true *** True Line Result - # Moves the search forward one step -** Processing line: ~ def step~ + # Every tick, new args are passed, and the Dijkstra tick method is called +** Processing line: ~ $movement_costs ||= Movement_Costs.new(args)~ - Inside source: true *** True Line Result - def step -** Processing line: ~ # The setup to the search~ + $movement_costs ||= Movement_Costs.new(args) +** Processing line: ~ $movement_costs.args = args~ - Inside source: true *** True Line Result - # The setup to the search -** Processing line: ~ # Runs once when there are no visited cells~ + $movement_costs.args = args +** Processing line: ~ $movement_costs.tick~ - Inside source: true *** True Line Result - # Runs once when there are no visited cells -** Processing line: ~ if state.visited.empty?~ + $movement_costs.tick +** Processing line: ~ end~ - Inside source: true *** True Line Result - if state.visited.empty? -** Processing line: ~ state.visited[state.star] = true~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.visited[state.star] = true -** Processing line: ~ state.early_exit_visited[state.star] = true~ + +** Processing line: ~~ - Inside source: true *** True Line Result - state.early_exit_visited[state.star] = true -** Processing line: ~ state.frontier << state.star~ + +** Processing line: ~ def reset~ - Inside source: true *** True Line Result - state.frontier << state.star -** Processing line: ~ state.came_from[state.star] = nil~ + def reset +** Processing line: ~ $movement_costs = nil~ - Inside source: true *** True Line Result - state.came_from[state.star] = nil -** Processing line: ~ end~ + $movement_costs = nil +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # A step in the search~ +** 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: ~*** Path Finding Algorithms - Heuristic - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** Path Finding Algorithms - Heuristic - 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/13_path_finding_algorithms/06_heuristic/app/main.rb~ - Inside source: true *** True Line Result - # A step in the search -** Processing line: ~ unless state.frontier.empty?~ + # ./samples/13_path_finding_algorithms/06_heuristic/app/main.rb +** Processing line: ~ # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result - unless state.frontier.empty? -** Processing line: ~ # Takes the next frontier cell~ + # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html +** Processing line: ~~ - Inside source: true *** True Line Result - # Takes the next frontier cell -** Processing line: ~ new_frontier = state.frontier.shift~ + +** Processing line: ~ # This time the heuristic search still explored less of the grid, hence finishing faster.~ - Inside source: true *** True Line Result - new_frontier = state.frontier.shift -** Processing line: ~ # For each of its neighbors~ + # This time the heuristic search still explored less of the grid, hence finishing faster. +** Processing line: ~ # However, it did not find the shortest path between the star and the target.~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ + # However, it did not find the shortest path between the star and the target. +** Processing line: ~~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do |neighbor| -** Processing line: ~ # That have not been visited and are not walls~ + +** Processing line: ~ # The only difference between this app and Heuristic is the change of the starting position.~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ + # The only difference between this app and Heuristic is the change of the starting position. +** Processing line: ~~ - Inside source: true *** True Line Result - unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ + +** Processing line: ~ class Heuristic_With_Walls~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited in the first grid -** Processing line: ~ state.visited[neighbor] = true~ + class Heuristic_With_Walls +** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result - state.visited[neighbor] = true -** Processing line: ~ # Unless the target has been visited~ + attr_gtk +** Processing line: ~~ - Inside source: true *** True Line Result - # Unless the target has been visited -** Processing line: ~ unless state.visited.has_key?(state.target)~ + +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - unless state.visited.has_key?(state.target) -** Processing line: ~ # Mark the neighbor as visited in the second grid as well~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - # Mark the neighbor as visited in the second grid as well -** Processing line: ~ state.early_exit_visited[neighbor] = true~ + defaults +** Processing line: ~ render~ - Inside source: true *** True Line Result - state.early_exit_visited[neighbor] = true -** Processing line: ~ end~ + render +** Processing line: ~ input~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + input +** Processing line: ~ # If animation is playing, and max steps have not been reached~ - Inside source: true *** True Line Result - -** Processing line: ~ # Add the neighbor to the frontier and remember which cell it came from~ + # If animation is playing, and max steps have not been reached +** Processing line: ~ # Move the search a step forward~ - Inside source: true *** True Line Result - # Add the neighbor to the frontier and remember which cell it came from -** Processing line: ~ state.frontier << neighbor~ + # Move the search a step forward +** Processing line: ~ if state.play && state.current_step < state.max_steps~ - Inside source: true *** True Line Result - state.frontier << neighbor -** Processing line: ~ state.came_from[neighbor] = new_frontier~ + if state.play && state.current_step < state.max_steps +** Processing line: ~ # Variable that tells the program what step to recalculate up to~ - Inside source: true *** True Line Result - state.came_from[neighbor] = new_frontier -** Processing line: ~ end~ + # Variable that tells the program what step to recalculate up to +** Processing line: ~ state.current_step += 1~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.current_step += 1 +** Processing line: ~ move_searches_one_step_forward~ - Inside source: true *** True Line Result - end + move_searches_one_step_forward ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69236,350 +76591,358 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a list of adjacent cells~ + def defaults +** Processing line: ~ # Variables to edit the size and appearance of the grid~ - Inside source: true *** True Line Result - # Returns a list of adjacent cells -** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ + # Variables to edit the size and appearance of the grid +** Processing line: ~ # Freely customizable to user's liking~ - Inside source: true *** True Line Result - # Used to determine what the next cells to be added to the frontier are -** Processing line: ~ def adjacent_neighbors(cell)~ + # Freely customizable to user's liking +** Processing line: ~ grid.width ||= 15~ - Inside source: true *** True Line Result - def adjacent_neighbors(cell) -** Processing line: ~ neighbors = []~ + grid.width ||= 15 +** Processing line: ~ grid.height ||= 15~ - Inside source: true *** True Line Result - neighbors = [] -** Processing line: ~~ + grid.height ||= 15 +** Processing line: ~ grid.cell_size ||= 40~ - Inside source: true *** True Line Result - -** Processing line: ~ # Gets all the valid neighbors into the array~ + grid.cell_size ||= 40 +** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result - # Gets all the valid neighbors into the array -** Processing line: ~ # From southern neighbor, clockwise~ + grid.rect ||= [0, 0, grid.width, grid.height] +** Processing line: ~~ - Inside source: true *** True Line Result - # From southern neighbor, clockwise -** Processing line: ~ neighbors << [cell.x, cell.y - 1] unless cell.y == 0~ + +** Processing line: ~ grid.star ||= [0, 2]~ - Inside source: true *** True Line Result - neighbors << [cell.x, cell.y - 1] unless cell.y == 0 -** Processing line: ~ neighbors << [cell.x - 1, cell.y] unless cell.x == 0~ + grid.star ||= [0, 2] +** Processing line: ~ grid.target ||= [14, 12]~ - Inside source: true *** True Line Result - neighbors << [cell.x - 1, cell.y] unless cell.x == 0 -** Processing line: ~ neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1~ + grid.target ||= [14, 12] +** Processing line: ~ grid.walls ||= {}~ - Inside source: true *** True Line Result - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 -** Processing line: ~ neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1~ + grid.walls ||= {} +** Processing line: ~ # There are no hills in the Heuristic Search Demo~ - Inside source: true *** True Line Result - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 + # There are no hills in the Heuristic Search Demo ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ +** Processing line: ~ # What the user is currently editing on the grid~ - Inside source: true *** True Line Result - # Sorts the neighbors so the rendered path is a zigzag path -** Processing line: ~ # Cells in a diagonal direction are given priority~ + # What the user is currently editing on the grid +** Processing line: ~ # We store this value, because we want to remember the value even when~ - Inside source: true *** True Line Result - # Cells in a diagonal direction are given priority -** Processing line: ~ # Comment this line to see the difference~ + # We store this value, because we want to remember the value even when +** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ - Inside source: true *** True Line Result - # Comment this line to see the difference -** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ + # the user's cursor is no longer over what they're interacting with, but +** Processing line: ~ # they are still clicking down on the mouse.~ - Inside source: true *** True Line Result - neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } -** Processing line: ~~ + # they are still clicking down on the mouse. +** Processing line: ~ state.user_input ||= :none~ - Inside source: true *** True Line Result - -** Processing line: ~ neighbors~ + state.user_input ||= :none +** Processing line: ~~ - Inside source: true *** True Line Result - neighbors -** Processing line: ~ end~ + +** Processing line: ~ # These variables allow the breadth first search to take place~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # These variables allow the breadth first search to take place +** Processing line: ~ # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key.~ - Inside source: true *** True Line Result - -** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ + # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key. +** Processing line: ~ # Used to prevent searching cells that have already been found~ - Inside source: true *** True Line Result - # Finds the vertical and horizontal distance of a cell from the star -** Processing line: ~ # and returns the larger value~ + # Used to prevent searching cells that have already been found +** Processing line: ~ # and to trace a path from the target back to the starting point.~ - Inside source: true *** True Line Result - # and returns the larger value -** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ + # and to trace a path from the target back to the starting point. +** Processing line: ~ # Frontier is an array of cells to expand the search from.~ - Inside source: true *** True Line Result - # This method is used to have a zigzag pattern in the rendered path -** Processing line: ~ # A cell that is [5, 5] from the star,~ + # Frontier is an array of cells to expand the search from. +** Processing line: ~ # The search is over when there are no more cells to search from.~ - Inside source: true *** True Line Result - # A cell that is [5, 5] from the star, -** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ + # The search is over when there are no more cells to search from. +** Processing line: ~ # Path stores the path from the target to the star, once the target has been found~ - Inside source: true *** True Line Result - # is explored before over a cell that is [0, 7] away. -** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ + # Path stores the path from the target to the star, once the target has been found +** Processing line: ~ # It prevents calculating the path every tick.~ - Inside source: true *** True Line Result - # So, if possible, the search tries to go diagonal (zigzag) first -** Processing line: ~ def proximity_to_star(x, y)~ + # It prevents calculating the path every tick. +** Processing line: ~ bfs.came_from ||= {}~ - Inside source: true *** True Line Result - def proximity_to_star(x, y) -** Processing line: ~ distance_x = (state.star.x - x).abs~ + bfs.came_from ||= {} +** Processing line: ~ bfs.frontier ||= []~ - Inside source: true *** True Line Result - distance_x = (state.star.x - x).abs -** Processing line: ~ distance_y = (state.star.y - y).abs~ + bfs.frontier ||= [] +** Processing line: ~ bfs.path ||= []~ - Inside source: true *** True Line Result - distance_y = (state.star.y - y).abs + bfs.path ||= [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if distance_x > distance_y~ +** Processing line: ~ heuristic.came_from ||= {}~ - Inside source: true *** True Line Result - if distance_x > distance_y -** Processing line: ~ return distance_x~ + heuristic.came_from ||= {} +** Processing line: ~ heuristic.frontier ||= []~ - Inside source: true *** True Line Result - return distance_x -** Processing line: ~ else~ + heuristic.frontier ||= [] +** Processing line: ~ heuristic.path ||= []~ - Inside source: true *** True Line Result - else -** Processing line: ~ return distance_y~ + heuristic.path ||= [] +** Processing line: ~~ - Inside source: true *** True Line Result - return distance_y -** Processing line: ~ end~ + +** Processing line: ~ # Stores which step of the animation is being rendered~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Stores which step of the animation is being rendered +** Processing line: ~ # When the user moves the star or messes with the walls,~ - Inside source: true *** True Line Result - end + # When the user moves the star or messes with the walls, +** Processing line: ~ # the searches are recalculated up to this step~ +- Inside source: true +*** True Line Result + # the searches are recalculated up to this step ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ +** Processing line: ~ # Unless the current step has a value~ - Inside source: true *** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ + # Unless the current step has a value +** Processing line: ~ unless state.current_step~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse helps with this~ + unless state.current_step +** Processing line: ~ # Set the current step to 10~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse helps with this -** Processing line: ~ def cell_closest_to_mouse~ + # Set the current step to 10 +** Processing line: ~ state.current_step = 10~ - Inside source: true *** True Line Result - def cell_closest_to_mouse -** Processing line: ~ # Closest cell to the mouse in the first grid~ + state.current_step = 10 +** Processing line: ~ # And calculate the searches up to step 10~ - Inside source: true *** True Line Result - # Closest cell to the mouse in the first grid -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + # And calculate the searches up to step 10 +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Bound x and y to the grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Bound x and y to the grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + +** Processing line: ~ # At some step the animation will end,~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + # At some step the animation will end, +** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + # and further steps won't change anything (the whole grid will be explored) +** Processing line: ~ # This step is roughly the grid's width * height~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + # This step is roughly the grid's width * height +** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ - Inside source: true *** True Line Result - [x, y] -** Processing line: ~ end~ + # When anim_steps equals max_steps no more calculations will occur +** Processing line: ~ # and the slider will be at the end~ - Inside source: true *** True Line Result - end + # and the slider will be at the end +** Processing line: ~ state.max_steps = grid.width * grid.height~ +- Inside source: true +*** True Line Result + state.max_steps = grid.width * grid.height ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ +** Processing line: ~ # Whether the animation should play or not~ - Inside source: true *** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ + # Whether the animation should play or not +** Processing line: ~ # If true, every tick moves anim_steps forward one~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ + # If true, every tick moves anim_steps forward one +** Processing line: ~ # Pressing the stepwise animation buttons will pause the animation~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse in the second grid helps with this -** Processing line: ~ def cell_closest_to_mouse2~ + # Pressing the stepwise animation buttons will pause the animation +** Processing line: ~ # An if statement instead of the ||= operator is used for assigning a boolean value.~ - Inside source: true *** True Line Result - def cell_closest_to_mouse2 -** Processing line: ~ # Closest cell grid to the mouse in the second~ + # An if statement instead of the ||= operator is used for assigning a boolean value. +** Processing line: ~ # The || operator does not differentiate between nil and false.~ - Inside source: true *** True Line Result - # Closest cell grid to the mouse in the second -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + # The || operator does not differentiate between nil and false. +** Processing line: ~ if state.play == nil~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + if state.play == nil +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Translate the cell to the first grid~ + state.play = false +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Translate the cell to the first grid -** Processing line: ~ x -= grid.width + 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x -= grid.width + 1 -** Processing line: ~ # Bound x and y to the first grid~ + +** Processing line: ~ # Store the rects of the buttons that control the animation~ - Inside source: true *** True Line Result - # Bound x and y to the first grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + # Store the rects of the buttons that control the animation +** Processing line: ~ # They are here for user customization~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + # They are here for user customization +** Processing line: ~ # Editing these might require recentering the text inside them~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + # Editing these might require recentering the text inside them +** Processing line: ~ # Those values can be found in the render_button methods~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + # Those values can be found in the render_button methods +** Processing line: ~ buttons.left = [470, 600, 50, 50]~ - Inside source: true *** True Line Result - [x, y] -** Processing line: ~ end~ + buttons.left = [470, 600, 50, 50] +** Processing line: ~ buttons.center = [520, 600, 200, 50]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + buttons.center = [520, 600, 200, 50] +** Processing line: ~ buttons.right = [720, 600, 50, 50]~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ + buttons.right = [720, 600, 50, 50] +** Processing line: ~~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the first grid -** Processing line: ~ def star_clicked?~ + +** Processing line: ~ # The variables below are related to the slider~ - Inside source: true *** True Line Result - def star_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star))~ + # The variables below are related to the slider +** Processing line: ~ # They allow the user to customize them~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.star)) -** Processing line: ~ end~ + # They allow the user to customize them +** Processing line: ~ # They also give a central location for the render and input methods to get~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # They also give a central location for the render and input methods to get +** Processing line: ~ # information from~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ + # information from +** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the second grid -** Processing line: ~ def star2_clicked?~ + # x & y are the coordinates of the leftmost part of the slider line +** Processing line: ~ slider.x = 440~ - Inside source: true *** True Line Result - def star2_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.star))~ + slider.x = 440 +** Processing line: ~ slider.y = 675~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.star)) -** Processing line: ~ end~ + slider.y = 675 +** Processing line: ~ # This is the width of the line~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # This is the width of the line +** Processing line: ~ slider.w = 360~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ + slider.w = 360 +** Processing line: ~ # This is the offset for the circle~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the target from the first grid -** Processing line: ~ def target_clicked?~ + # This is the offset for the circle +** Processing line: ~ # Allows the center of the circle to be on the line,~ - Inside source: true *** True Line Result - def target_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.target))~ + # Allows the center of the circle to be on the line, +** Processing line: ~ # as opposed to the upper right corner~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(scale_up(state.target)) -** Processing line: ~ end~ + # as opposed to the upper right corner +** Processing line: ~ slider.offset = 20~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + slider.offset = 20 +** Processing line: ~ # This is the spacing between each of the notches on the slider~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ + # This is the spacing between each of the notches on the slider +** Processing line: ~ # Notches are places where the circle can rest on the slider line~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the target from the second grid -** Processing line: ~ def target2_clicked?~ + # Notches are places where the circle can rest on the slider line +** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ - Inside source: true *** True Line Result - def target2_clicked? -** Processing line: ~ inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.target))~ + # There needs to be a notch for each step before the maximum number of steps +** Processing line: ~ slider.spacing = slider.w.to_f / state.max_steps.to_f~ - Inside source: true *** True Line Result - inputs.mouse.down && inputs.mouse.point.inside_rect?(early_exit_scale_up(state.target)) + slider.spacing = slider.w.to_f / state.max_steps.to_f ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69588,38 +76951,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing walls from the first grid -** Processing line: ~ def wall_clicked?~ +** Processing line: ~ # All methods with render draw stuff on the screen~ - Inside source: true *** True Line Result - def wall_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_wall?~ + # All methods with render draw stuff on the screen +** Processing line: ~ # UI has buttons, the slider, and labels~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_wall? -** Processing line: ~ end~ + # UI has buttons, the slider, and labels +** Processing line: ~ # The search specific rendering occurs in the respective methods~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The search specific rendering occurs in the respective methods +** Processing line: ~ def render~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ + def render +** Processing line: ~ render_ui~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls from the second grid -** Processing line: ~ def wall2_clicked?~ + render_ui +** Processing line: ~ render_bfs~ - Inside source: true *** True Line Result - def wall2_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_wall2?~ + render_bfs +** Processing line: ~ render_heuristic~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_wall2? + render_heuristic ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69628,18 +76987,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ +** Processing line: ~ def render_ui~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls from the first grid -** Processing line: ~ def grid_clicked?~ + def render_ui +** Processing line: ~ render_buttons~ - Inside source: true *** True Line Result - def grid_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_grid?~ + render_buttons +** Processing line: ~ render_slider~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_grid? + render_slider +** Processing line: ~ render_labels~ +- Inside source: true +*** True Line Result + render_labels ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69648,18 +77011,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls from the second grid~ +** Processing line: ~ def render_buttons~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls from the second grid -** Processing line: ~ def grid2_clicked?~ + def render_buttons +** Processing line: ~ render_left_button~ - Inside source: true *** True Line Result - def grid2_clicked? -** Processing line: ~ inputs.mouse.down && mouse_inside_grid2?~ + render_left_button +** Processing line: ~ render_center_button~ - Inside source: true *** True Line Result - inputs.mouse.down && mouse_inside_grid2? + render_center_button +** Processing line: ~ render_right_button~ +- Inside source: true +*** True Line Result + render_right_button ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69668,38 +77035,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a wall in the first grid~ +** Processing line: ~ def render_bfs~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of a wall in the first grid -** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ + def render_bfs +** Processing line: ~ render_bfs_grid~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is removing a wall -** Processing line: ~ def mouse_inside_wall?~ + render_bfs_grid +** Processing line: ~ render_bfs_star~ - Inside source: true *** True Line Result - def mouse_inside_wall? -** Processing line: ~ state.walls.each_key do | wall |~ + render_bfs_star +** Processing line: ~ render_bfs_target~ - Inside source: true *** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ + render_bfs_target +** Processing line: ~ render_bfs_visited~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(scale_up(wall)) -** Processing line: ~ end~ + render_bfs_visited +** Processing line: ~ render_bfs_walls~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render_bfs_walls +** Processing line: ~ render_bfs_frontier~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + render_bfs_frontier +** Processing line: ~ render_bfs_path~ - Inside source: true *** True Line Result - false + render_bfs_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69708,38 +77075,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of a wall in the second grid~ +** Processing line: ~ def render_heuristic~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of a wall in the second grid -** Processing line: ~ # Part of the condition that checks whether the user is removing a wall~ + def render_heuristic +** Processing line: ~ render_heuristic_grid~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is removing a wall -** Processing line: ~ def mouse_inside_wall2?~ + render_heuristic_grid +** Processing line: ~ render_heuristic_star~ - Inside source: true *** True Line Result - def mouse_inside_wall2? -** Processing line: ~ state.walls.each_key do | wall |~ + render_heuristic_star +** Processing line: ~ render_heuristic_target~ - Inside source: true *** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(early_exit_scale_up(wall))~ + render_heuristic_target +** Processing line: ~ render_heuristic_visited~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(early_exit_scale_up(wall)) -** Processing line: ~ end~ + render_heuristic_visited +** Processing line: ~ render_heuristic_walls~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render_heuristic_walls +** Processing line: ~ render_heuristic_frontier~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + render_heuristic_frontier +** Processing line: ~ render_heuristic_path~ - Inside source: true *** True Line Result - false + render_heuristic_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69748,94 +77115,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of the first grid~ -- Inside source: true -*** True Line Result - # Returns whether the mouse is inside of the first grid -** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ +** Processing line: ~ # This method handles user input every tick~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is adding a wall -** Processing line: ~ def mouse_inside_grid?~ + # This method handles user input every tick +** Processing line: ~ def input~ - Inside source: true *** True Line Result - def mouse_inside_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ + def input +** Processing line: ~ # Check and handle button input~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(scale_up(grid.rect)) -** Processing line: ~ end~ + # Check and handle button input +** Processing line: ~ input_buttons~ - Inside source: true *** True Line Result - end + input_buttons ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns whether the mouse is inside of the second grid~ +** Processing line: ~ # If the mouse was lifted this tick~ - Inside source: true *** True Line Result - # Returns whether the mouse is inside of the second grid -** Processing line: ~ # Part of the condition that checks whether the user is adding a wall~ + # If the mouse was lifted this tick +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - # Part of the condition that checks whether the user is adding a wall -** Processing line: ~ def mouse_inside_grid2?~ + if inputs.mouse.up +** Processing line: ~ # Set current input to none~ - Inside source: true *** True Line Result - def mouse_inside_grid2? -** Processing line: ~ inputs.mouse.point.inside_rect?(early_exit_scale_up(grid.rect))~ + # Set current input to none +** Processing line: ~ state.user_input = :none~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(early_exit_scale_up(grid.rect)) -** Processing line: ~ end~ + state.user_input = :none +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # These methods provide handy aliases to colors~ -- Inside source: true -*** True Line Result - # These methods provide handy aliases to colors -** Processing line: ~~ +** Processing line: ~ # If the mouse was clicked this tick~ - Inside source: true *** True Line Result - -** Processing line: ~ # Light brown~ + # If the mouse was clicked this tick +** Processing line: ~ if inputs.mouse.down~ - Inside source: true *** True Line Result - # Light brown -** Processing line: ~ def unvisited_color~ + if inputs.mouse.down +** Processing line: ~ # Determine what the user is editing and appropriately edit the state.user_input variable~ - Inside source: true *** True Line Result - def unvisited_color -** Processing line: ~ [221, 212, 213]~ + # Determine what the user is editing and appropriately edit the state.user_input variable +** Processing line: ~ determine_input~ - Inside source: true *** True Line Result - [221, 212, 213] -** Processing line: ~ end~ + determine_input +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Camo Green~ -- Inside source: true -*** True Line Result - # Camo Green -** Processing line: ~ def wall_color~ +** Processing line: ~ # Process user input based on user_input variable and current mouse position~ - Inside source: true *** True Line Result - def wall_color -** Processing line: ~ [134, 134, 120]~ + # Process user input based on user_input variable and current mouse position +** Processing line: ~ process_input~ - Inside source: true *** True Line Result - [134, 134, 120] + process_input ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -69844,554 +77199,558 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Pastel White~ +** Processing line: ~ # Determines what the user is editing~ - Inside source: true *** True Line Result - # Pastel White -** Processing line: ~ def path_color~ + # Determines what the user is editing +** Processing line: ~ # This method is called when the mouse is clicked down~ - Inside source: true *** True Line Result - def path_color -** Processing line: ~ [231, 230, 228]~ + # This method is called when the mouse is clicked down +** Processing line: ~ def determine_input~ - Inside source: true *** True Line Result - [231, 230, 228] -** Processing line: ~ end~ + def determine_input +** Processing line: ~ if mouse_over_slider?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if mouse_over_slider? +** Processing line: ~ state.user_input = :slider~ - Inside source: true *** True Line Result - -** Processing line: ~ def red~ + state.user_input = :slider +** Processing line: ~ # If the mouse is over the star in the first grid~ - Inside source: true *** True Line Result - def red -** Processing line: ~ [255, 0, 0]~ + # If the mouse is over the star in the first grid +** Processing line: ~ elsif bfs_mouse_over_star?~ - Inside source: true *** True Line Result - [255, 0, 0] -** Processing line: ~ end~ + elsif bfs_mouse_over_star? +** Processing line: ~ # The user is editing the star from the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The user is editing the star from the first grid +** Processing line: ~ state.user_input = :bfs_star~ - Inside source: true *** True Line Result - -** Processing line: ~ # Makes code more concise~ + state.user_input = :bfs_star +** Processing line: ~ # If the mouse is over the star in the second grid~ - Inside source: true *** True Line Result - # Makes code more concise -** Processing line: ~ def grid~ + # If the mouse is over the star in the second grid +** Processing line: ~ elsif heuristic_mouse_over_star?~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + elsif heuristic_mouse_over_star? +** Processing line: ~ # The user is editing the star from the second grid~ - Inside source: true *** True Line Result - state.grid -** Processing line: ~ end~ + # The user is editing the star from the second grid +** Processing line: ~ state.user_input = :heuristic_star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.user_input = :heuristic_star +** Processing line: ~ # If the mouse is over the target in the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # If the mouse is over the target in the first grid +** Processing line: ~ elsif bfs_mouse_over_target?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Method that is called by DragonRuby periodically~ + elsif bfs_mouse_over_target? +** Processing line: ~ # The user is editing the target from the first grid~ - Inside source: true *** True Line Result - # Method that is called by DragonRuby periodically -** Processing line: ~ # Used for updating animations and calculations~ + # The user is editing the target from the first grid +** Processing line: ~ state.user_input = :bfs_target~ - Inside source: true *** True Line Result - # Used for updating animations and calculations -** Processing line: ~ def tick args~ + state.user_input = :bfs_target +** Processing line: ~ # If the mouse is over the target in the second grid~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~~ + # If the mouse is over the target in the second grid +** Processing line: ~ elsif heuristic_mouse_over_target?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Pressing r will reset the application~ + elsif heuristic_mouse_over_target? +** Processing line: ~ # The user is editing the target from the second grid~ - Inside source: true *** True Line Result - # Pressing r will reset the application -** Processing line: ~ if args.inputs.keyboard.key_down.r~ + # The user is editing the target from the second grid +** Processing line: ~ state.user_input = :heuristic_target~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_down.r -** Processing line: ~ args.gtk.reset~ + state.user_input = :heuristic_target +** Processing line: ~ # If the mouse is over a wall in the first grid~ - Inside source: true *** True Line Result - args.gtk.reset -** Processing line: ~ reset~ + # If the mouse is over a wall in the first grid +** Processing line: ~ elsif bfs_mouse_over_wall?~ - Inside source: true *** True Line Result - reset -** Processing line: ~ return~ + elsif bfs_mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the first grid~ - Inside source: true *** True Line Result - return -** Processing line: ~ end~ + # The user is removing a wall from the first grid +** Processing line: ~ state.user_input = :bfs_remove_wall~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.user_input = :bfs_remove_wall +** Processing line: ~ # If the mouse is over a wall in the second grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ + # If the mouse is over a wall in the second grid +** Processing line: ~ elsif heuristic_mouse_over_wall?~ - Inside source: true *** True Line Result - # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)~ + elsif heuristic_mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the second grid~ - Inside source: true *** True Line Result - $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args) -** Processing line: ~ $early_exit_breadth_first_search.args = args~ + # The user is removing a wall from the second grid +** Processing line: ~ state.user_input = :heuristic_remove_wall~ - Inside source: true *** True Line Result - $early_exit_breadth_first_search.args = args -** Processing line: ~ $early_exit_breadth_first_search.tick~ + state.user_input = :heuristic_remove_wall +** Processing line: ~ # If the mouse is over the first grid~ - Inside source: true *** True Line Result - $early_exit_breadth_first_search.tick -** Processing line: ~ end~ + # If the mouse is over the first grid +** Processing line: ~ elsif bfs_mouse_over_grid?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif bfs_mouse_over_grid? +** Processing line: ~ # The user is adding a wall from the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~~ + # The user is adding a wall from the first grid +** Processing line: ~ state.user_input = :bfs_add_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ def reset~ + state.user_input = :bfs_add_wall +** Processing line: ~ # If the mouse is over the second grid~ - Inside source: true *** True Line Result - def reset -** Processing line: ~ $early_exit_breadth_first_search = nil~ + # If the mouse is over the second grid +** Processing line: ~ elsif heuristic_mouse_over_grid?~ - Inside source: true *** True Line Result - $early_exit_breadth_first_search = nil -** Processing line: ~ end~ + elsif heuristic_mouse_over_grid? +** Processing line: ~ # The user is adding a wall from the second grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The user is adding a wall from the second grid +** Processing line: ~ state.user_input = :heuristic_add_wall~ - 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: ~*** Path Finding Algorithms - Dijkstra - main.rb~ -- Header detected. + state.user_input = :heuristic_add_wall +** Processing line: ~ end~ +- Inside source: true *** True Line Result - + end +** Processing line: ~ end~ +- Inside source: true *** True Line Result -*** Path Finding Algorithms - Dijkstra - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/13_path_finding_algorithms/05_dijkstra/app/main.rb~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_input~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/05_dijkstra/app/main.rb -** Processing line: ~ # Demonstrates how Dijkstra's Algorithm allows movement costs to be considered~ + def process_input +** Processing line: ~ if state.user_input == :slider~ - Inside source: true *** True Line Result - # Demonstrates how Dijkstra's Algorithm allows movement costs to be considered -** Processing line: ~~ + if state.user_input == :slider +** Processing line: ~ process_input_slider~ - Inside source: true *** True Line Result - -** Processing line: ~ # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ + process_input_slider +** Processing line: ~ elsif state.user_input == :bfs_star~ - Inside source: true *** True Line Result - # Inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ + elsif state.user_input == :bfs_star +** Processing line: ~ process_input_bfs_star~ - Inside source: true *** True Line Result - -** Processing line: ~ # The first grid is a breadth first search with an early exit.~ + process_input_bfs_star +** Processing line: ~ elsif state.user_input == :heuristic_star~ - Inside source: true *** True Line Result - # The first grid is a breadth first search with an early exit. -** Processing line: ~ # It shows a heat map of all the cells that were visited by the search and their relative distance.~ + elsif state.user_input == :heuristic_star +** Processing line: ~ process_input_heuristic_star~ - Inside source: true *** True Line Result - # It shows a heat map of all the cells that were visited by the search and their relative distance. -** Processing line: ~~ + process_input_heuristic_star +** Processing line: ~ elsif state.user_input == :bfs_target~ - Inside source: true *** True Line Result - -** Processing line: ~ # The second grid is an implementation of Dijkstra's algorithm.~ + elsif state.user_input == :bfs_target +** Processing line: ~ process_input_bfs_target~ - Inside source: true *** True Line Result - # The second grid is an implementation of Dijkstra's algorithm. -** Processing line: ~ # Light green cells have 5 times the movement cost of regular cells.~ + process_input_bfs_target +** Processing line: ~ elsif state.user_input == :heuristic_target~ - Inside source: true *** True Line Result - # Light green cells have 5 times the movement cost of regular cells. -** Processing line: ~ # The heat map will darken based on movement cost.~ + elsif state.user_input == :heuristic_target +** Processing line: ~ process_input_heuristic_target~ - Inside source: true *** True Line Result - # The heat map will darken based on movement cost. -** Processing line: ~~ + process_input_heuristic_target +** Processing line: ~ elsif state.user_input == :bfs_remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # Dark green cells are walls, and the search cannot go through them.~ + elsif state.user_input == :bfs_remove_wall +** Processing line: ~ process_input_bfs_remove_wall~ - Inside source: true *** True Line Result - # Dark green cells are walls, and the search cannot go through them. -** Processing line: ~ class Movement_Costs~ + process_input_bfs_remove_wall +** Processing line: ~ elsif state.user_input == :heuristic_remove_wall~ - Inside source: true *** True Line Result - class Movement_Costs -** Processing line: ~ attr_gtk~ + elsif state.user_input == :heuristic_remove_wall +** Processing line: ~ process_input_heuristic_remove_wall~ - Inside source: true *** True Line Result - attr_gtk -** Processing line: ~~ + process_input_heuristic_remove_wall +** Processing line: ~ elsif state.user_input == :bfs_add_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # This method is called every frame/tick~ + elsif state.user_input == :bfs_add_wall +** Processing line: ~ process_input_bfs_add_wall~ - Inside source: true *** True Line Result - # This method is called every frame/tick -** Processing line: ~ # Every tick, the current state of the search is rendered on the screen,~ + process_input_bfs_add_wall +** Processing line: ~ elsif state.user_input == :heuristic_add_wall~ - Inside source: true *** True Line Result - # Every tick, the current state of the search is rendered on the screen, -** Processing line: ~ # User input is processed, and~ + elsif state.user_input == :heuristic_add_wall +** Processing line: ~ process_input_heuristic_add_wall~ - Inside source: true *** True Line Result - # User input is processed, and -** Processing line: ~ # The next step in the search is calculated~ + process_input_heuristic_add_wall +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The next step in the search is calculated -** Processing line: ~ def tick~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render~ + +** Processing line: ~ def render_slider~ - Inside source: true *** True Line Result - render -** Processing line: ~ input~ + def render_slider +** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ - Inside source: true *** True Line Result - input -** Processing line: ~ calc~ + # Using primitives hides the line under the white circle of the slider +** Processing line: ~ # Draws the line~ - Inside source: true *** True Line Result - calc -** Processing line: ~ end~ + # Draws the line +** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line +** Processing line: ~ # The circle needs to be offset so that the center of the circle~ - Inside source: true *** True Line Result - -** Processing line: ~ def defaults~ + # The circle needs to be offset so that the center of the circle +** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ - Inside source: true *** True Line Result - def defaults -** Processing line: ~ # Variables to edit the size and appearance of the grid~ + # overlaps the line instead of the upper right corner of the circle +** Processing line: ~ # The circle's x value is also moved based on the current seach step~ - Inside source: true *** True Line Result - # Variables to edit the size and appearance of the grid -** Processing line: ~ # Freely customizable to user's liking~ + # The circle's x value is also moved based on the current seach step +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing)~ - Inside source: true *** True Line Result - # Freely customizable to user's liking -** Processing line: ~ grid.width ||= 10~ + circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ - Inside source: true *** True Line Result - grid.width ||= 10 -** Processing line: ~ grid.height ||= 10~ + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ - Inside source: true *** True Line Result - grid.height ||= 10 -** Processing line: ~ grid.cell_size ||= 60~ + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ - Inside source: true *** True Line Result - grid.cell_size ||= 60 -** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ + outputs.primitives << [circle_rect, 'circle-white.png'].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - grid.rect ||= [0, 0, grid.width, grid.height] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The location of the star and walls of the grid~ +** Processing line: ~ def render_labels~ - Inside source: true *** True Line Result - # The location of the star and walls of the grid -** Processing line: ~ # They can be modified to have a different initial grid~ + def render_labels +** Processing line: ~ outputs.labels << [205, 625, "Breadth First Search"]~ - Inside source: true *** True Line Result - # They can be modified to have a different initial grid -** Processing line: ~ # Walls are stored in a hash for quick look up when doing the search~ + outputs.labels << [205, 625, "Breadth First Search"] +** Processing line: ~ outputs.labels << [820, 625, "Heuristic Best-First Search"]~ - Inside source: true *** True Line Result - # Walls are stored in a hash for quick look up when doing the search -** Processing line: ~ state.star ||= [1, 5]~ + outputs.labels << [820, 625, "Heuristic Best-First Search"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.star ||= [1, 5] -** Processing line: ~ state.target ||= [8, 4]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.target ||= [8, 4] -** Processing line: ~ state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true}~ + +** Processing line: ~ def render_left_button~ - Inside source: true *** True Line Result - state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true} -** Processing line: ~ state.hills ||= {~ + def render_left_button +** Processing line: ~ # Draws the button_color button, and a black border~ - Inside source: true *** True Line Result - state.hills ||= { -** Processing line: ~ [4, 1] => true,~ + # Draws the button_color button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - [4, 1] => true, -** Processing line: ~ [5, 1] => true,~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.left, button_color]~ - Inside source: true *** True Line Result - [5, 1] => true, -** Processing line: ~ [4, 2] => true,~ + outputs.solids << [buttons.left, button_color] +** Processing line: ~ outputs.borders << [buttons.left]~ - Inside source: true *** True Line Result - [4, 2] => true, -** Processing line: ~ [5, 2] => true,~ + outputs.borders << [buttons.left] +** Processing line: ~~ - Inside source: true *** True Line Result - [5, 2] => true, -** Processing line: ~ [6, 2] => true,~ + +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - [6, 2] => true, -** Processing line: ~ [4, 3] => true,~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - [4, 3] => true, -** Processing line: ~ [5, 3] => true,~ + # Explains to the user what the button does +** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ - Inside source: true *** True Line Result - [5, 3] => true, -** Processing line: ~ [6, 3] => true,~ + # If the button size is changed, the label might need to be edited as well +** Processing line: ~ # to keep the label in the center of the button~ - Inside source: true *** True Line Result - [6, 3] => true, -** Processing line: ~ [3, 4] => true,~ + # to keep the label in the center of the button +** Processing line: ~ label_x = buttons.left.x + 20~ - Inside source: true *** True Line Result - [3, 4] => true, -** Processing line: ~ [4, 4] => true,~ + label_x = buttons.left.x + 20 +** Processing line: ~ label_y = buttons.left.y + 35~ - Inside source: true *** True Line Result - [4, 4] => true, -** Processing line: ~ [5, 4] => true,~ + label_y = buttons.left.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, "<"]~ - Inside source: true *** True Line Result - [5, 4] => true, -** Processing line: ~ [6, 4] => true,~ + outputs.labels << [label_x, label_y, "<"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - [6, 4] => true, -** Processing line: ~ [7, 4] => true,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - [7, 4] => true, -** Processing line: ~ [3, 5] => true,~ + +** Processing line: ~ def render_center_button~ - Inside source: true *** True Line Result - [3, 5] => true, -** Processing line: ~ [4, 5] => true,~ + def render_center_button +** Processing line: ~ # Draws the button_color button, and a black border~ - Inside source: true *** True Line Result - [4, 5] => true, -** Processing line: ~ [5, 5] => true,~ + # Draws the button_color button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - [5, 5] => true, -** Processing line: ~ [6, 5] => true,~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.center, button_color]~ - Inside source: true *** True Line Result - [6, 5] => true, -** Processing line: ~ [7, 5] => true,~ + outputs.solids << [buttons.center, button_color] +** Processing line: ~ outputs.borders << [buttons.center]~ - Inside source: true *** True Line Result - [7, 5] => true, -** Processing line: ~ [4, 6] => true,~ + outputs.borders << [buttons.center] +** Processing line: ~~ - Inside source: true *** True Line Result - [4, 6] => true, -** Processing line: ~ [5, 6] => true,~ + +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - [5, 6] => true, -** Processing line: ~ [6, 6] => true,~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - [6, 6] => true, -** Processing line: ~ [7, 6] => true,~ + # Explains to the user what the button does +** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ - Inside source: true *** True Line Result - [7, 6] => true, -** Processing line: ~ [4, 7] => true,~ + # If the button size is changed, the label might need to be edited as well +** Processing line: ~ # to keep the label in the center of the button~ - Inside source: true *** True Line Result - [4, 7] => true, -** Processing line: ~ [5, 7] => true,~ + # to keep the label in the center of the button +** Processing line: ~ label_x = buttons.center.x + 37~ - Inside source: true *** True Line Result - [5, 7] => true, -** Processing line: ~ [6, 7] => true,~ + label_x = buttons.center.x + 37 +** Processing line: ~ label_y = buttons.center.y + 35~ - Inside source: true *** True Line Result - [6, 7] => true, -** Processing line: ~ [4, 8] => true,~ + label_y = buttons.center.y + 35 +** Processing line: ~ label_text = state.play ? "Pause Animation" : "Play Animation"~ - Inside source: true *** True Line Result - [4, 8] => true, -** Processing line: ~ [5, 8] => true,~ + label_text = state.play ? "Pause Animation" : "Play Animation" +** Processing line: ~ outputs.labels << [label_x, label_y, label_text]~ - Inside source: true *** True Line Result - [5, 8] => true, -** Processing line: ~ }~ + outputs.labels << [label_x, label_y, label_text] +** Processing line: ~ end~ - Inside source: true *** True Line Result - } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # What the user is currently editing on the grid~ +** Processing line: ~ def render_right_button~ - Inside source: true *** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # We store this value, because we want to remember the value even when~ + def render_right_button +** Processing line: ~ # Draws the button_color button, and a black border~ - Inside source: true *** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ + # Draws the button_color button, and a black border +** Processing line: ~ # The border separates the buttons visually~ - Inside source: true *** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ + # The border separates the buttons visually +** Processing line: ~ outputs.solids << [buttons.right, button_color]~ - Inside source: true *** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ state.user_input ||= :none~ + outputs.solids << [buttons.right, button_color] +** Processing line: ~ outputs.borders << [buttons.right]~ - Inside source: true *** True Line Result - state.user_input ||= :none + outputs.borders << [buttons.right] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Values that are used for the breadth first search~ +** Processing line: ~ # Renders an explanatory label in the center of the button~ - Inside source: true *** True Line Result - # Values that are used for the breadth first search -** Processing line: ~ # Keeping track of what cells were visited prevents counting cells multiple times~ + # Renders an explanatory label in the center of the button +** Processing line: ~ # Explains to the user what the button does~ - Inside source: true *** True Line Result - # Keeping track of what cells were visited prevents counting cells multiple times -** Processing line: ~ breadth_first_search.visited ||= {}~ + # Explains to the user what the button does +** Processing line: ~ label_x = buttons.right.x + 20~ - Inside source: true *** True Line Result - breadth_first_search.visited ||= {} -** Processing line: ~ # The cells from which the breadth first search will expand~ + label_x = buttons.right.x + 20 +** Processing line: ~ label_y = buttons.right.y + 35~ - Inside source: true *** True Line Result - # The cells from which the breadth first search will expand -** Processing line: ~ breadth_first_search.frontier ||= []~ + label_y = buttons.right.y + 35 +** Processing line: ~ outputs.labels << [label_x, label_y, ">"]~ - Inside source: true *** True Line Result - breadth_first_search.frontier ||= [] -** Processing line: ~ # Keeps track of which cell all cells were searched from~ + outputs.labels << [label_x, label_y, ">"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Keeps track of which cell all cells were searched from -** Processing line: ~ # Used to recreate the path from the target to the star~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Used to recreate the path from the target to the star -** Processing line: ~ breadth_first_search.came_from ||= {}~ + +** Processing line: ~ def render_bfs_grid~ +- Inside source: true +*** True Line Result + def render_bfs_grid +** Processing line: ~ # A large rect the size of the grid~ +- Inside source: true +*** True Line Result + # A large rect the size of the grid +** Processing line: ~ outputs.solids << [bfs_scale_up(grid.rect), default_color]~ - Inside source: true *** True Line Result - breadth_first_search.came_from ||= {} + outputs.solids << [bfs_scale_up(grid.rect), default_color] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Keeps track of the movement cost so far to be at a cell~ +** Processing line: ~ # The vertical grid lines~ - Inside source: true *** True Line Result - # Keeps track of the movement cost so far to be at a cell -** Processing line: ~ # Allows the costs of new cells to be quickly calculated~ + # The vertical grid lines +** Processing line: ~ for x in 0..grid.width~ - Inside source: true *** True Line Result - # Allows the costs of new cells to be quickly calculated -** Processing line: ~ # Also doubles as a way to check if cells have already been visited~ + for x in 0..grid.width +** Processing line: ~ outputs.lines << bfs_vertical_line(x)~ - Inside source: true *** True Line Result - # Also doubles as a way to check if cells have already been visited -** Processing line: ~ dijkstra_search.cost_so_far ||= {}~ + outputs.lines << bfs_vertical_line(x) +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra_search.cost_so_far ||= {} -** Processing line: ~ # The cells from which the Dijkstra search will expand~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # The cells from which the Dijkstra search will expand -** Processing line: ~ dijkstra_search.frontier ||= []~ + +** Processing line: ~ # The horizontal grid lines~ - Inside source: true *** True Line Result - dijkstra_search.frontier ||= [] -** Processing line: ~ # Keeps track of which cell all cells were searched from~ + # The horizontal grid lines +** Processing line: ~ for y in 0..grid.height~ - Inside source: true *** True Line Result - # Keeps track of which cell all cells were searched from -** Processing line: ~ # Used to recreate the path from the target to the star~ + for y in 0..grid.height +** Processing line: ~ outputs.lines << bfs_horizontal_line(y)~ - Inside source: true *** True Line Result - # Used to recreate the path from the target to the star -** Processing line: ~ dijkstra_search.came_from ||= {}~ + outputs.lines << bfs_horizontal_line(y) +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra_search.came_from ||= {} + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70400,86 +77759,78 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws everything onto the screen~ -- Inside source: true -*** True Line Result - # Draws everything onto the screen -** Processing line: ~ def render~ -- Inside source: true -*** True Line Result - def render -** Processing line: ~ render_background~ +** Processing line: ~ def render_heuristic_grid~ - Inside source: true *** True Line Result - render_background -** Processing line: ~~ + def render_heuristic_grid +** Processing line: ~ # A large rect the size of the grid~ - Inside source: true *** True Line Result - -** Processing line: ~ render_heat_maps~ + # A large rect the size of the grid +** Processing line: ~ outputs.solids << [heuristic_scale_up(grid.rect), default_color]~ - Inside source: true *** True Line Result - render_heat_maps + outputs.solids << [heuristic_scale_up(grid.rect), default_color] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ render_star~ +** Processing line: ~ # The vertical grid lines~ - Inside source: true *** True Line Result - render_star -** Processing line: ~ render_target~ + # The vertical grid lines +** Processing line: ~ for x in 0..grid.width~ - Inside source: true *** True Line Result - render_target -** Processing line: ~ render_hills~ + for x in 0..grid.width +** Processing line: ~ outputs.lines << heuristic_vertical_line(x)~ - Inside source: true *** True Line Result - render_hills -** Processing line: ~ render_walls~ + outputs.lines << heuristic_vertical_line(x) +** Processing line: ~ end~ - Inside source: true *** True Line Result - render_walls + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ render_paths~ +** Processing line: ~ # The horizontal grid lines~ - Inside source: true *** True Line Result - render_paths -** Processing line: ~ end~ + # The horizontal grid lines +** Processing line: ~ for y in 0..grid.height~ - Inside source: true *** True Line Result - end -** Processing line: ~ # The methods below subdivide the task of drawing everything to the screen~ + for y in 0..grid.height +** Processing line: ~ outputs.lines << heuristic_horizontal_line(y)~ - Inside source: true *** True Line Result - # The methods below subdivide the task of drawing everything to the screen -** Processing line: ~~ + outputs.lines << heuristic_horizontal_line(y) +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Draws what the grid looks like with nothing on it~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Draws what the grid looks like with nothing on it -** Processing line: ~ def render_background~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def render_background -** Processing line: ~ render_unvisited~ + +** Processing line: ~ # Returns a vertical line for a column of the first grid~ - Inside source: true *** True Line Result - render_unvisited -** Processing line: ~ render_grid_lines~ + # Returns a vertical line for a column of the first grid +** Processing line: ~ def bfs_vertical_line column~ - Inside source: true *** True Line Result - render_grid_lines -** Processing line: ~ render_labels~ + def bfs_vertical_line column +** Processing line: ~ bfs_scale_up([column, 0, column, grid.height])~ - Inside source: true *** True Line Result - render_labels + bfs_scale_up([column, 0, column, grid.height]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70488,26 +77839,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws two rectangles the size of the grid in the default cell color~ -- Inside source: true -*** True Line Result - # Draws two rectangles the size of the grid in the default cell color -** Processing line: ~ # Used as part of the background~ -- Inside source: true -*** True Line Result - # Used as part of the background -** Processing line: ~ def render_unvisited~ +** Processing line: ~ # Returns a horizontal line for a column of the first grid~ - Inside source: true *** True Line Result - def render_unvisited -** Processing line: ~ outputs.solids << [scale_up(grid.rect), unvisited_color]~ + # Returns a horizontal line for a column of the first grid +** Processing line: ~ def bfs_horizontal_line row~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(grid.rect), unvisited_color] -** Processing line: ~ outputs.solids << [move_and_scale_up(grid.rect), unvisited_color]~ + def bfs_horizontal_line row +** Processing line: ~ bfs_scale_up([0, row, grid.width, row])~ - Inside source: true *** True Line Result - outputs.solids << [move_and_scale_up(grid.rect), unvisited_color] + bfs_scale_up([0, row, grid.width, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70516,50 +77859,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws grid lines to show the division of the grid into cells~ +** Processing line: ~ # Returns a vertical line for a column of the second grid~ - Inside source: true *** True Line Result - # Draws grid lines to show the division of the grid into cells -** Processing line: ~ def render_grid_lines~ + # Returns a vertical line for a column of the second grid +** Processing line: ~ def heuristic_vertical_line column~ - Inside source: true *** True Line Result - def render_grid_lines -** Processing line: ~ for x in 0..grid.width~ + def heuristic_vertical_line column +** Processing line: ~ bfs_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ - Inside source: true *** True Line Result - for x in 0..grid.width -** Processing line: ~ outputs.lines << vertical_line(x)~ + bfs_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.lines << vertical_line(x) -** Processing line: ~ outputs.lines << shifted_vertical_line(x)~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.lines << shifted_vertical_line(x) -** Processing line: ~ end~ + +** Processing line: ~ # Returns a horizontal line for a column of the second grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Returns a horizontal line for a column of the second grid +** Processing line: ~ def heuristic_horizontal_line row~ - Inside source: true *** True Line Result - -** Processing line: ~ for y in 0..grid.height~ + def heuristic_horizontal_line row +** Processing line: ~ bfs_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ - Inside source: true *** True Line Result - for y in 0..grid.height -** Processing line: ~ outputs.lines << horizontal_line(y)~ + bfs_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.lines << horizontal_line(y) -** Processing line: ~ outputs.lines << shifted_horizontal_line(y)~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.lines << shifted_horizontal_line(y) -** Processing line: ~ end~ + +** Processing line: ~ # Renders the star on the first grid~ - Inside source: true *** True Line Result - end + # Renders the star on the first grid +** Processing line: ~ def render_bfs_star~ +- Inside source: true +*** True Line Result + def render_bfs_star +** Processing line: ~ outputs.sprites << [bfs_scale_up(grid.star), 'star.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [bfs_scale_up(grid.star), 'star.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70568,18 +77919,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw vertical lines given an index for the first grid~ +** Processing line: ~ # Renders the star on the second grid~ - Inside source: true *** True Line Result - # Easy way to draw vertical lines given an index for the first grid -** Processing line: ~ def vertical_line column~ + # Renders the star on the second grid +** Processing line: ~ def render_heuristic_star~ - Inside source: true *** True Line Result - def vertical_line column -** Processing line: ~ scale_up([column, 0, column, grid.height])~ + def render_heuristic_star +** Processing line: ~ outputs.sprites << [heuristic_scale_up(grid.star), 'star.png']~ - Inside source: true *** True Line Result - scale_up([column, 0, column, grid.height]) + outputs.sprites << [heuristic_scale_up(grid.star), 'star.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70588,18 +77939,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw horizontal lines given an index for the second grid~ +** Processing line: ~ # Renders the target on the first grid~ - Inside source: true *** True Line Result - # Easy way to draw horizontal lines given an index for the second grid -** Processing line: ~ def horizontal_line row~ + # Renders the target on the first grid +** Processing line: ~ def render_bfs_target~ - Inside source: true *** True Line Result - def horizontal_line row -** Processing line: ~ scale_up([0, row, grid.width, row])~ + def render_bfs_target +** Processing line: ~ outputs.sprites << [bfs_scale_up(grid.target), 'target.png']~ - Inside source: true *** True Line Result - scale_up([0, row, grid.width, row]) + outputs.sprites << [bfs_scale_up(grid.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70608,18 +77959,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw vertical lines given an index for the first grid~ +** Processing line: ~ # Renders the target on the second grid~ - Inside source: true *** True Line Result - # Easy way to draw vertical lines given an index for the first grid -** Processing line: ~ def shifted_vertical_line column~ + # Renders the target on the second grid +** Processing line: ~ def render_heuristic_target~ - Inside source: true *** True Line Result - def shifted_vertical_line column -** Processing line: ~ scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ + def render_heuristic_target +** Processing line: ~ outputs.sprites << [heuristic_scale_up(grid.target), 'target.png']~ - Inside source: true *** True Line Result - scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) + outputs.sprites << [heuristic_scale_up(grid.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70628,18 +77979,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Easy way to draw horizontal lines given an index for the second grid~ +** Processing line: ~ # Renders the walls on the first grid~ - Inside source: true *** True Line Result - # Easy way to draw horizontal lines given an index for the second grid -** Processing line: ~ def shifted_horizontal_line row~ + # Renders the walls on the first grid +** Processing line: ~ def render_bfs_walls~ - Inside source: true *** True Line Result - def shifted_horizontal_line row -** Processing line: ~ scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ + def render_bfs_walls +** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result - scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) + grid.walls.each_key do | wall | +** Processing line: ~ outputs.solids << [bfs_scale_up(wall), wall_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [bfs_scale_up(wall), wall_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70648,22 +78007,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Labels the grids~ +** Processing line: ~ # Renders the walls on the second grid~ - Inside source: true *** True Line Result - # Labels the grids -** Processing line: ~ def render_labels~ + # Renders the walls on the second grid +** Processing line: ~ def render_heuristic_walls~ - Inside source: true *** True Line Result - def render_labels -** Processing line: ~ outputs.labels << [175, 650, "Number of steps", 3]~ + def render_heuristic_walls +** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result - outputs.labels << [175, 650, "Number of steps", 3] -** Processing line: ~ outputs.labels << [925, 650, "Distance", 3]~ + grid.walls.each_key do | wall | +** Processing line: ~ outputs.solids << [heuristic_scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - outputs.labels << [925, 650, "Distance", 3] + outputs.solids << [heuristic_scale_up(wall), wall_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70672,18 +78035,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_paths~ +** Processing line: ~ # Renders the visited cells on the first grid~ - Inside source: true *** True Line Result - def render_paths -** Processing line: ~ render_breadth_first_search_path~ + # Renders the visited cells on the first grid +** Processing line: ~ def render_bfs_visited~ - Inside source: true *** True Line Result - render_breadth_first_search_path -** Processing line: ~ render_dijkstra_path~ + def render_bfs_visited +** Processing line: ~ bfs.came_from.each_key do | visited_cell |~ - Inside source: true *** True Line Result - render_dijkstra_path + bfs.came_from.each_key do | visited_cell | +** Processing line: ~ outputs.solids << [bfs_scale_up(visited_cell), visited_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [bfs_scale_up(visited_cell), visited_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70692,18 +78063,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_heat_maps~ +** Processing line: ~ # Renders the visited cells on the second grid~ - Inside source: true *** True Line Result - def render_heat_maps -** Processing line: ~ render_breadth_first_search_heat_map~ + # Renders the visited cells on the second grid +** Processing line: ~ def render_heuristic_visited~ - Inside source: true *** True Line Result - render_breadth_first_search_heat_map -** Processing line: ~ render_dijkstra_heat_map~ + def render_heuristic_visited +** Processing line: ~ heuristic.came_from.each_key do | visited_cell |~ - Inside source: true *** True Line Result - render_dijkstra_heat_map + heuristic.came_from.each_key do | visited_cell | +** Processing line: ~ outputs.solids << [heuristic_scale_up(visited_cell), visited_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [heuristic_scale_up(visited_cell), visited_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70712,14 +78091,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the breadth first search on the first grid~ +** Processing line: ~ # Renders the frontier cells on the first grid~ - Inside source: true *** True Line Result - # Renders the breadth first search on the first grid -** Processing line: ~ def render_breadth_first_search~ + # Renders the frontier cells on the first grid +** Processing line: ~ def render_bfs_frontier~ - Inside source: true *** True Line Result - def render_breadth_first_search + def render_bfs_frontier +** Processing line: ~ bfs.frontier.each do | frontier_cell |~ +- Inside source: true +*** True Line Result + bfs.frontier.each do | frontier_cell | +** Processing line: ~ outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200]~ +- Inside source: true +*** True Line Result + outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70728,46 +78119,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This heat map shows the cells explored by the breadth first search and how far they are from the star.~ +** Processing line: ~ # Renders the frontier cells on the second grid~ - Inside source: true *** True Line Result - # This heat map shows the cells explored by the breadth first search and how far they are from the star. -** Processing line: ~ def render_breadth_first_search_heat_map~ + # Renders the frontier cells on the second grid +** Processing line: ~ def render_heuristic_frontier~ - Inside source: true *** True Line Result - def render_breadth_first_search_heat_map -** Processing line: ~ # For each cell explored~ + def render_heuristic_frontier +** Processing line: ~ heuristic.frontier.each do | frontier_cell |~ - Inside source: true *** True Line Result - # For each cell explored -** Processing line: ~ breadth_first_search.visited.each_key do | visited_cell |~ + heuristic.frontier.each do | frontier_cell | +** Processing line: ~ outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200]~ - Inside source: true *** True Line Result - breadth_first_search.visited.each_key do | visited_cell | -** Processing line: ~ # Find its distance from the star~ + outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Find its distance from the star -** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs -** Processing line: ~ max_distance = grid.width + grid.height~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - max_distance = grid.width + grid.height -** Processing line: ~ # Get it as a percent of the maximum distance and scale to 255 for use as an alpha value~ + +** Processing line: ~ # Renders the path found by the breadth first search on the first grid~ - Inside source: true *** True Line Result - # Get it as a percent of the maximum distance and scale to 255 for use as an alpha value -** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ + # Renders the path found by the breadth first search on the first grid +** Processing line: ~ def render_bfs_path~ - Inside source: true *** True Line Result - alpha = 255.to_i * distance.to_i / max_distance.to_i -** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ + def render_bfs_path +** Processing line: ~ bfs.path.each do | path |~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(visited_cell), red, alpha] + bfs.path.each do | path | +** Processing line: ~ outputs.solids << [bfs_scale_up(path), path_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [bfs_scale_up(path), path_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70780,122 +78175,126 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_breadth_first_search_path~ -- Inside source: true -*** True Line Result - def render_breadth_first_search_path -** Processing line: ~ # If the search found the target~ +** Processing line: ~ # Renders the path found by the heuristic search on the second grid~ - Inside source: true *** True Line Result - # If the search found the target -** Processing line: ~ if breadth_first_search.visited.has_key?(state.target)~ + # Renders the path found by the heuristic search on the second grid +** Processing line: ~ def render_heuristic_path~ - Inside source: true *** True Line Result - if breadth_first_search.visited.has_key?(state.target) -** Processing line: ~ # Start from the target~ + def render_heuristic_path +** Processing line: ~ heuristic.path.each do | path |~ - Inside source: true *** True Line Result - # Start from the target -** Processing line: ~ endpoint = state.target~ + heuristic.path.each do | path | +** Processing line: ~ outputs.solids << [heuristic_scale_up(path), path_color]~ - Inside source: true *** True Line Result - endpoint = state.target -** Processing line: ~ # And the cell it came from~ + outputs.solids << [heuristic_scale_up(path), path_color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # And the cell it came from -** Processing line: ~ next_endpoint = breadth_first_search.came_from[endpoint]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - next_endpoint = breadth_first_search.came_from[endpoint] -** Processing line: ~ while endpoint and next_endpoint~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between these two cells~ + +** Processing line: ~ # Returns the rect for the path between two cells based on their relative positions~ - Inside source: true *** True Line Result - # Draw a path between these two cells -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + # Returns the rect for the path between two cells based on their relative positions +** Processing line: ~ def get_path_between(cell_one, cell_two)~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ outputs.solids << [scale_up(path), path_color]~ + def get_path_between(cell_one, cell_two) +** Processing line: ~ path = nil~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(path), path_color] -** Processing line: ~ # And get the next pair of cells~ + path = nil +** Processing line: ~~ - Inside source: true *** True Line Result - # And get the next pair of cells -** Processing line: ~ endpoint = next_endpoint~ + +** Processing line: ~ # If cell one is above cell two~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = breadth_first_search.came_from[endpoint]~ + # If cell one is above cell two +** Processing line: ~ if cell_one.x == cell_two.x and cell_one.y > cell_two.y~ - Inside source: true *** True Line Result - next_endpoint = breadth_first_search.came_from[endpoint] -** Processing line: ~ # Continue till there are no more cells~ + if cell_one.x == cell_two.x and cell_one.y > cell_two.y +** Processing line: ~ # Path starts from the center of cell two and moves upward to the center of cell one~ - Inside source: true *** True Line Result - # Continue till there are no more cells -** Processing line: ~ end~ + # Path starts from the center of cell two and moves upward to the center of cell one +** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4] +** Processing line: ~ # If cell one is below cell two~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # If cell one is below cell two +** Processing line: ~ elsif cell_one.x == cell_two.x and cell_one.y < cell_two.y~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif cell_one.x == cell_two.x and cell_one.y < cell_two.y +** Processing line: ~ # Path starts from the center of cell one and moves upward to the center of cell two~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the Dijkstra search on the second grid~ + # Path starts from the center of cell one and moves upward to the center of cell two +** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4]~ - Inside source: true *** True Line Result - # Renders the Dijkstra search on the second grid -** Processing line: ~ def render_dijkstra~ + path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4] +** Processing line: ~ # If cell one is to the left of cell two~ - Inside source: true *** True Line Result - def render_dijkstra -** Processing line: ~ end~ + # If cell one is to the left of cell two +** Processing line: ~ elsif cell_one.x > cell_two.x and cell_one.y == cell_two.y~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif cell_one.x > cell_two.x and cell_one.y == cell_two.y +** Processing line: ~ # Path starts from the center of cell two and moves rightward to the center of cell one~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_dijkstra_heat_map~ + # Path starts from the center of cell two and moves rightward to the center of cell one +** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4]~ - Inside source: true *** True Line Result - def render_dijkstra_heat_map -** Processing line: ~ dijkstra_search.cost_so_far.each do |visited_cell, cost|~ + path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4] +** Processing line: ~ # If cell one is to the right of cell two~ - Inside source: true *** True Line Result - dijkstra_search.cost_so_far.each do |visited_cell, cost| -** Processing line: ~ max_cost = (grid.width + grid.height) #* 5~ + # If cell one is to the right of cell two +** Processing line: ~ elsif cell_one.x < cell_two.x and cell_one.y == cell_two.y~ - Inside source: true *** True Line Result - max_cost = (grid.width + grid.height) #* 5 -** Processing line: ~ alpha = 255.to_i * cost.to_i / max_cost.to_i~ + elsif cell_one.x < cell_two.x and cell_one.y == cell_two.y +** Processing line: ~ # Path starts from the center of cell one and moves rightward to the center of cell two~ - Inside source: true *** True Line Result - alpha = 255.to_i * cost.to_i / max_cost.to_i -** Processing line: ~ outputs.solids << [move_and_scale_up(visited_cell), red, alpha]~ + # Path starts from the center of cell one and moves rightward to the center of cell two +** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4]~ - Inside source: true *** True Line Result - outputs.solids << [move_and_scale_up(visited_cell), red, alpha] + path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4] ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ path~ +- Inside source: true +*** True Line Result + path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -70904,102 +78303,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_dijkstra_path~ -- Inside source: true -*** True Line Result - def render_dijkstra_path -** Processing line: ~ # If the search found the target~ +** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ - Inside source: true *** True Line Result - # If the search found the target -** Processing line: ~ if dijkstra_search.came_from.has_key?(state.target)~ + # In code, the cells are represented as 1x1 rectangles +** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ - Inside source: true *** True Line Result - if dijkstra_search.came_from.has_key?(state.target) -** Processing line: ~ # Get the target and the cell it came from~ + # When drawn, the cells are larger than 1x1 rectangles +** Processing line: ~ # This method is used to scale up cells, and lines~ - Inside source: true *** True Line Result - # Get the target and the cell it came from -** Processing line: ~ endpoint = state.target~ + # This method is used to scale up cells, and lines +** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ - Inside source: true *** True Line Result - endpoint = state.target -** Processing line: ~ next_endpoint = dijkstra_search.came_from[endpoint]~ + # Objects are scaled up according to the grid.cell_size variable +** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ - Inside source: true *** True Line Result - next_endpoint = dijkstra_search.came_from[endpoint] -** Processing line: ~ while endpoint and next_endpoint~ + # This allows for easy customization of the visual scale of the grid +** Processing line: ~ # This method scales up cells for the first grid~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between them~ + # This method scales up cells for the first grid +** Processing line: ~ def bfs_scale_up(cell)~ - Inside source: true *** True Line Result - # Draw a path between them -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + def bfs_scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ outputs.solids << [move_and_scale_up(path), path_color]~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - outputs.solids << [move_and_scale_up(path), path_color] + cell = cell.clone ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Shift one cell down the path~ -- Inside source: true -*** True Line Result - # Shift one cell down the path -** Processing line: ~ endpoint = next_endpoint~ +** Processing line: ~ # If cell is just an x and y coordinate~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = dijkstra_search.came_from[endpoint]~ + # If cell is just an x and y coordinate +** Processing line: ~ if cell.size == 2~ - Inside source: true *** True Line Result - next_endpoint = dijkstra_search.came_from[endpoint] -** Processing line: ~~ + if cell.size == 2 +** Processing line: ~ # Add a width and height of 1~ - Inside source: true *** True Line Result - -** Processing line: ~ # Repeat till the end of the path~ + # Add a width and height of 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - # Repeat till the end of the path -** Processing line: ~ end~ + cell << 1 +** Processing line: ~ cell << 1~ - Inside source: true *** True Line Result - end + cell << 1 ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the star on both grids~ +** Processing line: ~ # Scale all the values up~ - Inside source: true *** True Line Result - # Renders the star on both grids -** Processing line: ~ def render_star~ + # Scale all the values up +** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ - Inside source: true *** True Line Result - def render_star -** Processing line: ~ outputs.sprites << [scale_up(state.star), 'star.png']~ + cell.map! { |value| value * grid.cell_size } +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(state.star), 'star.png'] -** Processing line: ~ outputs.sprites << [move_and_scale_up(state.star), 'star.png']~ + +** Processing line: ~ # Returns the scaled up cell~ - Inside source: true *** True Line Result - outputs.sprites << [move_and_scale_up(state.star), 'star.png'] + # Returns the scaled up cell +** Processing line: ~ cell~ +- Inside source: true +*** True Line Result + cell ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71008,50 +78399,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the target on both grids~ +** Processing line: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ - Inside source: true *** True Line Result - # Renders the target on both grids -** Processing line: ~ def render_target~ + # Translates the given cell grid.width + 1 to the right and then scales up +** Processing line: ~ # Used to draw cells for the second grid~ - Inside source: true *** True Line Result - def render_target -** Processing line: ~ outputs.sprites << [scale_up(state.target), 'target.png']~ + # Used to draw cells for the second grid +** Processing line: ~ # This method does not work for lines,~ - Inside source: true *** True Line Result - outputs.sprites << [scale_up(state.target), 'target.png'] -** Processing line: ~ outputs.sprites << [move_and_scale_up(state.target), 'target.png']~ + # This method does not work for lines, +** Processing line: ~ # so separate methods exist for the grid lines~ - Inside source: true *** True Line Result - outputs.sprites << [move_and_scale_up(state.target), 'target.png'] -** Processing line: ~ end~ + # so separate methods exist for the grid lines +** Processing line: ~ def heuristic_scale_up(cell)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def heuristic_scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_hills~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - def render_hills -** Processing line: ~ state.hills.each_key do |hill|~ + cell = cell.clone +** Processing line: ~ # Translates the cell to the second grid equivalent~ - Inside source: true *** True Line Result - state.hills.each_key do |hill| -** Processing line: ~ outputs.solids << [scale_up(hill), hill_color]~ + # Translates the cell to the second grid equivalent +** Processing line: ~ cell.x += grid.width + 1~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(hill), hill_color] -** Processing line: ~ outputs.solids << [move_and_scale_up(hill), hill_color]~ + cell.x += grid.width + 1 +** Processing line: ~ # Proceeds as if scaling up for the first grid~ - Inside source: true *** True Line Result - outputs.solids << [move_and_scale_up(hill), hill_color] -** Processing line: ~ end~ + # Proceeds as if scaling up for the first grid +** Processing line: ~ bfs_scale_up(cell)~ - Inside source: true *** True Line Result - end + bfs_scale_up(cell) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71060,30 +78451,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Draws the walls on both grids~ +** Processing line: ~ # Checks and handles input for the buttons~ - Inside source: true *** True Line Result - # Draws the walls on both grids -** Processing line: ~ def render_walls~ + # Checks and handles input for the buttons +** Processing line: ~ # Called when the mouse is lifted~ - Inside source: true *** True Line Result - def render_walls -** Processing line: ~ state.walls.each_key do |wall|~ + # Called when the mouse is lifted +** Processing line: ~ def input_buttons~ - Inside source: true *** True Line Result - state.walls.each_key do |wall| -** Processing line: ~ outputs.solids << [scale_up(wall), wall_color]~ + def input_buttons +** Processing line: ~ input_left_button~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(wall), wall_color] -** Processing line: ~ outputs.solids << [move_and_scale_up(wall), wall_color]~ + input_left_button +** Processing line: ~ input_center_button~ - Inside source: true *** True Line Result - outputs.solids << [move_and_scale_up(wall), wall_color] -** Processing line: ~ end~ + input_center_button +** Processing line: ~ input_right_button~ - Inside source: true *** True Line Result - end + input_right_button ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71092,70 +78483,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def get_path_between(cell_one, cell_two)~ +** Processing line: ~ # Checks if the previous step button is clicked~ - Inside source: true *** True Line Result - def get_path_between(cell_one, cell_two) -** Processing line: ~ path = nil~ + # Checks if the previous step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ - Inside source: true *** True Line Result - path = nil -** Processing line: ~ if cell_one.x == cell_two.x~ + # If it is, it pauses the animation and moves the search one step backward +** Processing line: ~ def input_left_button~ - Inside source: true *** True Line Result - if cell_one.x == cell_two.x -** Processing line: ~ if cell_one.y < cell_two.y~ + def input_left_button +** Processing line: ~ if left_button_clicked?~ - Inside source: true *** True Line Result - if cell_one.y < cell_two.y -** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4]~ + if left_button_clicked? +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4] -** Processing line: ~ else~ + state.play = false +** Processing line: ~ state.current_step -= 1~ - Inside source: true *** True Line Result - else -** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4]~ + state.current_step -= 1 +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4] -** Processing line: ~ end~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ else~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - else -** Processing line: ~ if cell_one.x < cell_two.x~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if cell_one.x < cell_two.x -** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4]~ + +** Processing line: ~ # Controls the play/pause button~ - Inside source: true *** True Line Result - path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4] -** Processing line: ~ else~ + # Controls the play/pause button +** Processing line: ~ # Inverses whether the animation is playing or not when clicked~ - Inside source: true *** True Line Result - else -** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4]~ + # Inverses whether the animation is playing or not when clicked +** Processing line: ~ def input_center_button~ - Inside source: true *** True Line Result - path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4] -** Processing line: ~ end~ + def input_center_button +** Processing line: ~ if center_button_clicked? || inputs.keyboard.key_down.space~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + if center_button_clicked? || inputs.keyboard.key_down.space +** Processing line: ~ state.play = !state.play~ - Inside source: true *** True Line Result - end -** Processing line: ~ path~ + state.play = !state.play +** Processing line: ~ end~ - Inside source: true *** True Line Result - path + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71164,42 +78555,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Representation of how far away visited cells are from the star~ -- Inside source: true -*** True Line Result - # Representation of how far away visited cells are from the star -** Processing line: ~ # Replaces the render_visited method~ -- Inside source: true -*** True Line Result - # Replaces the render_visited method -** Processing line: ~ # Visually demonstrates the effectiveness of early exit for pathfinding~ +** Processing line: ~ # Checks if the next step button is clicked~ - Inside source: true *** True Line Result - # Visually demonstrates the effectiveness of early exit for pathfinding -** Processing line: ~ def render_breadth_first_search_heat_map~ + # Checks if the next step button is clicked +** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ - Inside source: true *** True Line Result - def render_breadth_first_search_heat_map -** Processing line: ~ breadth_first_search.visited.each_key do | visited_cell |~ + # If it is, it pauses the animation and moves the search one step forward +** Processing line: ~ def input_right_button~ - Inside source: true *** True Line Result - breadth_first_search.visited.each_key do | visited_cell | -** Processing line: ~ distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs~ + def input_right_button +** Processing line: ~ if right_button_clicked?~ - Inside source: true *** True Line Result - distance = (state.star.x - visited_cell.x).abs + (state.star.y - visited_cell.y).abs -** Processing line: ~ max_distance = grid.width + grid.height~ + if right_button_clicked? +** Processing line: ~ state.play = false~ - Inside source: true *** True Line Result - max_distance = grid.width + grid.height -** Processing line: ~ alpha = 255.to_i * distance.to_i / max_distance.to_i~ + state.play = false +** Processing line: ~ state.current_step += 1~ - Inside source: true *** True Line Result - alpha = 255.to_i * distance.to_i / max_distance.to_i -** Processing line: ~ outputs.solids << [scale_up(visited_cell), red, alpha]~ + state.current_step += 1 +** Processing line: ~ move_searches_one_step_forward~ - Inside source: true *** True Line Result - outputs.solids << [scale_up(visited_cell), red, alpha] + move_searches_one_step_forward ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71212,38 +78595,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ -- Inside source: true -*** True Line Result - # Translates the given cell grid.width + 1 to the right and then scales up -** Processing line: ~ # Used to draw cells for the second grid~ +** Processing line: ~ # These methods detect when the buttons are clicked~ - Inside source: true *** True Line Result - # Used to draw cells for the second grid -** Processing line: ~ # This method does not work for lines,~ + # These methods detect when the buttons are clicked +** Processing line: ~ def left_button_clicked?~ - Inside source: true *** True Line Result - # This method does not work for lines, -** Processing line: ~ # so separate methods exist for the grid lines~ + def left_button_clicked? +** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.left) && inputs.mouse.up~ - Inside source: true *** True Line Result - # so separate methods exist for the grid lines -** Processing line: ~ def move_and_scale_up(cell)~ + inputs.mouse.point.inside_rect?(buttons.left) && inputs.mouse.up +** Processing line: ~ end~ - Inside source: true *** True Line Result - def move_and_scale_up(cell) -** Processing line: ~ cell_clone = cell.clone~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - cell_clone = cell.clone -** Processing line: ~ cell_clone.x += grid.width + 1~ + +** Processing line: ~ def center_button_clicked?~ - Inside source: true *** True Line Result - cell_clone.x += grid.width + 1 -** Processing line: ~ scale_up(cell_clone)~ + def center_button_clicked? +** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.center) && inputs.mouse.up~ - Inside source: true *** True Line Result - scale_up(cell_clone) + inputs.mouse.point.inside_rect?(buttons.center) && inputs.mouse.up ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71252,90 +78631,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ +** Processing line: ~ def right_button_clicked?~ - Inside source: true *** True Line Result - # In code, the cells are represented as 1x1 rectangles -** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ + def right_button_clicked? +** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.right) && inputs.mouse.up~ - Inside source: true *** True Line Result - # When drawn, the cells are larger than 1x1 rectangles -** Processing line: ~ # This method is used to scale up cells, and lines~ + inputs.mouse.point.inside_rect?(buttons.right) && inputs.mouse.up +** Processing line: ~ end~ - Inside source: true *** True Line Result - # This method is used to scale up cells, and lines -** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Objects are scaled up according to the grid.cell_size variable -** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ + +** Processing line: ~~ - Inside source: true *** True Line Result - # This allows for easy customization of the visual scale of the grid -** Processing line: ~ def scale_up(cell)~ + +** Processing line: ~ # Signal that the user is going to be moving the slider~ - Inside source: true *** True Line Result - def scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + # Signal that the user is going to be moving the slider +** Processing line: ~ # Is the mouse over the circle of the slider?~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + # Is the mouse over the circle of the slider? +** Processing line: ~ def mouse_over_slider?~ - Inside source: true *** True Line Result - cell = cell.clone -** Processing line: ~~ + def mouse_over_slider? +** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing)~ - Inside source: true *** True Line Result - -** Processing line: ~ # If cell is just an x and y coordinate~ + circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing) +** Processing line: ~ circle_y = (slider.y - slider.offset)~ - Inside source: true *** True Line Result - # If cell is just an x and y coordinate -** Processing line: ~ if cell.size == 2~ + circle_y = (slider.y - slider.offset) +** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ - Inside source: true *** True Line Result - if cell.size == 2 -** Processing line: ~ # Add a width and height of 1~ + circle_rect = [circle_x, circle_y, 37, 37] +** Processing line: ~ inputs.mouse.point.inside_rect?(circle_rect)~ - Inside source: true *** True Line Result - # Add a width and height of 1 -** Processing line: ~ cell << 1~ + inputs.mouse.point.inside_rect?(circle_rect) +** Processing line: ~ end~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ cell << 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ end~ + +** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Signal that the user is going to be moving the star from the first grid +** Processing line: ~ def bfs_mouse_over_star?~ - Inside source: true *** True Line Result - -** Processing line: ~ # Scale all the values up~ + def bfs_mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.star))~ - Inside source: true *** True Line Result - # Scale all the values up -** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ + inputs.mouse.point.inside_rect?(bfs_scale_up(grid.star)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - cell.map! { |value| value * grid.cell_size } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns the scaled up cell~ +** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ - Inside source: true *** True Line Result - # Returns the scaled up cell -** Processing line: ~ cell~ + # Signal that the user is going to be moving the star from the second grid +** Processing line: ~ def heuristic_mouse_over_star?~ - Inside source: true *** True Line Result - cell + def heuristic_mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.star))~ +- Inside source: true +*** True Line Result + inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71344,66 +78727,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Handles user input every tick so the grid can be edited~ -- Inside source: true -*** True Line Result - # Handles user input every tick so the grid can be edited -** Processing line: ~ # Separate input detection and processing is needed~ +** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ - Inside source: true *** True Line Result - # Separate input detection and processing is needed -** Processing line: ~ # For example: Adding walls is started by clicking down on a hill,~ + # Signal that the user is going to be moving the target from the first grid +** Processing line: ~ def bfs_mouse_over_target?~ - Inside source: true *** True Line Result - # For example: Adding walls is started by clicking down on a hill, -** Processing line: ~ # but the mouse doesn't need to remain over hills to add walls~ + def bfs_mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.target))~ - Inside source: true *** True Line Result - # but the mouse doesn't need to remain over hills to add walls -** Processing line: ~ def input~ + inputs.mouse.point.inside_rect?(bfs_scale_up(grid.target)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - def input -** Processing line: ~ # If the mouse was lifted this tick~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # If the mouse was lifted this tick -** Processing line: ~ if inputs.mouse.up~ + +** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ # Set current input to none~ + # Signal that the user is going to be moving the target from the second grid +** Processing line: ~ def heuristic_mouse_over_target?~ - Inside source: true *** True Line Result - # Set current input to none -** Processing line: ~ state.user_input = :none~ + def heuristic_mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.target))~ - Inside source: true *** True Line Result - state.user_input = :none -** Processing line: ~ end~ + inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.target)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the mouse was clicked this tick~ +** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ - Inside source: true *** True Line Result - # If the mouse was clicked this tick -** Processing line: ~ if inputs.mouse.down~ + # Signal that the user is going to be removing walls from the first grid +** Processing line: ~ def bfs_mouse_over_wall?~ - Inside source: true *** True Line Result - if inputs.mouse.down -** Processing line: ~ # Determine what the user is editing and edit the state.user_input variable~ + def bfs_mouse_over_wall? +** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result - # Determine what the user is editing and edit the state.user_input variable -** Processing line: ~ determine_input~ + grid.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(bfs_scale_up(wall))~ - Inside source: true *** True Line Result - determine_input + return true if inputs.mouse.point.inside_rect?(bfs_scale_up(wall)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71412,14 +78791,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Process user input based on user_input variable and current mouse position~ -- Inside source: true -*** True Line Result - # Process user input based on user_input variable and current mouse position -** Processing line: ~ process_input~ +** Processing line: ~ false~ - Inside source: true *** True Line Result - process_input + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71428,186 +78803,198 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Determines what the user is editing and stores the value~ +** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ - Inside source: true *** True Line Result - # Determines what the user is editing and stores the value -** Processing line: ~ # This method is called the tick the mouse is clicked~ + # Signal that the user is going to be removing walls from the second grid +** Processing line: ~ def heuristic_mouse_over_wall?~ - Inside source: true *** True Line Result - # This method is called the tick the mouse is clicked -** Processing line: ~ # Storing the value allows the user to continue the same edit as long as the~ + def heuristic_mouse_over_wall? +** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result - # Storing the value allows the user to continue the same edit as long as the -** Processing line: ~ # mouse left click is held~ + grid.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(heuristic_scale_up(wall))~ - Inside source: true *** True Line Result - # mouse left click is held -** Processing line: ~ def determine_input~ + return true if inputs.mouse.point.inside_rect?(heuristic_scale_up(wall)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - def determine_input -** Processing line: ~ # If the mouse is over the star in the first grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # If the mouse is over the star in the first grid -** Processing line: ~ if mouse_over_star?~ + +** Processing line: ~ false~ - Inside source: true *** True Line Result - if mouse_over_star? -** Processing line: ~ # The user is editing the star from the first grid~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The user is editing the star from the first grid -** Processing line: ~ state.user_input = :star~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.user_input = :star -** Processing line: ~ # If the mouse is over the star in the second grid~ + +** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ - Inside source: true *** True Line Result - # If the mouse is over the star in the second grid -** Processing line: ~ elsif mouse_over_star2?~ + # Signal that the user is going to be adding walls from the first grid +** Processing line: ~ def bfs_mouse_over_grid?~ - Inside source: true *** True Line Result - elsif mouse_over_star2? -** Processing line: ~ # The user is editing the star from the second grid~ + def bfs_mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.rect))~ - Inside source: true *** True Line Result - # The user is editing the star from the second grid -** Processing line: ~ state.user_input = :star2~ + inputs.mouse.point.inside_rect?(bfs_scale_up(grid.rect)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.user_input = :star2 -** Processing line: ~ # If the mouse is over the target in the first grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # If the mouse is over the target in the first grid -** Processing line: ~ elsif mouse_over_target?~ + +** Processing line: ~ # Signal that the user is going to be adding walls from the second grid~ - Inside source: true *** True Line Result - elsif mouse_over_target? -** Processing line: ~ # The user is editing the target from the first grid~ + # Signal that the user is going to be adding walls from the second grid +** Processing line: ~ def heuristic_mouse_over_grid?~ - Inside source: true *** True Line Result - # The user is editing the target from the first grid -** Processing line: ~ state.user_input = :target~ + def heuristic_mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.rect))~ - Inside source: true *** True Line Result - state.user_input = :target -** Processing line: ~ # If the mouse is over the target in the second grid~ + inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.rect)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If the mouse is over the target in the second grid -** Processing line: ~ elsif mouse_over_target2?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif mouse_over_target2? -** Processing line: ~ # The user is editing the target from the second grid~ + +** Processing line: ~ # This method is called when the user is editing the slider~ - Inside source: true *** True Line Result - # The user is editing the target from the second grid -** Processing line: ~ state.user_input = :target2~ + # This method is called when the user is editing the slider +** Processing line: ~ # It pauses the animation and moves the white circle to the closest integer point~ - Inside source: true *** True Line Result - state.user_input = :target2 -** Processing line: ~ # If the mouse is over a wall in the first grid~ + # It pauses the animation and moves the white circle to the closest integer point +** Processing line: ~ # on the slider~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the first grid -** Processing line: ~ elsif mouse_over_wall?~ + # on the slider +** Processing line: ~ # Changes the step of the search to be animated~ - Inside source: true *** True Line Result - elsif mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the first grid~ + # Changes the step of the search to be animated +** Processing line: ~ def process_input_slider~ +- Inside source: true +*** True Line Result + def process_input_slider +** Processing line: ~ state.play = false~ +- Inside source: true +*** True Line Result + state.play = false +** Processing line: ~ mouse_x = inputs.mouse.point.x~ +- Inside source: true +*** True Line Result + mouse_x = inputs.mouse.point.x +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is removing a wall from the first grid -** Processing line: ~ state.user_input = :remove_wall~ + +** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ - Inside source: true *** True Line Result - state.user_input = :remove_wall -** Processing line: ~ # If the mouse is over a wall in the second grid~ + # Bounds the mouse_x to the closest x value on the slider line +** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the second grid -** Processing line: ~ elsif mouse_over_wall2?~ + mouse_x = slider.x if mouse_x < slider.x +** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ - Inside source: true *** True Line Result - elsif mouse_over_wall2? -** Processing line: ~ # The user is removing a wall from the second grid~ + mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is removing a wall from the second grid -** Processing line: ~ state.user_input = :remove_wall2~ + +** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ - Inside source: true *** True Line Result - state.user_input = :remove_wall2 -** Processing line: ~ # If the mouse is over a hill in the first grid~ + # Sets the current search step to the one represented by the mouse x value +** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ - Inside source: true *** True Line Result - # If the mouse is over a hill in the first grid -** Processing line: ~ elsif mouse_over_hill?~ + # The slider's circle moves due to the render_slider method using anim_steps +** Processing line: ~ state.current_step = ((mouse_x - slider.x) / slider.spacing).to_i~ - Inside source: true *** True Line Result - elsif mouse_over_hill? -** Processing line: ~ # The user is adding a wall from the first grid~ + state.current_step = ((mouse_x - slider.x) / slider.spacing).to_i +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is adding a wall from the first grid -** Processing line: ~ state.user_input = :add_wall~ + +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - state.user_input = :add_wall -** Processing line: ~ # If the mouse is over a hill in the second grid~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If the mouse is over a hill in the second grid -** Processing line: ~ elsif mouse_over_hill2?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif mouse_over_hill2? -** Processing line: ~ # The user is adding a wall from the second grid~ + +** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ - Inside source: true *** True Line Result - # The user is adding a wall from the second grid -** Processing line: ~ state.user_input = :add_wall2~ + # Moves the star to the cell closest to the mouse in the first grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - state.user_input = :add_wall2 -** Processing line: ~ # If the mouse is over the first grid~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - # If the mouse is over the first grid -** Processing line: ~ elsif mouse_over_grid?~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def process_input_bfs_star~ - Inside source: true *** True Line Result - elsif mouse_over_grid? -** Processing line: ~ # The user is adding a hill from the first grid~ + def process_input_bfs_star +** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result - # The user is adding a hill from the first grid -** Processing line: ~ state.user_input = :add_hill~ + old_star = grid.star.clone +** Processing line: ~ unless bfs_cell_closest_to_mouse == grid.target~ - Inside source: true *** True Line Result - state.user_input = :add_hill -** Processing line: ~ # If the mouse is over the second grid~ + unless bfs_cell_closest_to_mouse == grid.target +** Processing line: ~ grid.star = bfs_cell_closest_to_mouse~ - Inside source: true *** True Line Result - # If the mouse is over the second grid -** Processing line: ~ elsif mouse_over_grid2?~ + grid.star = bfs_cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif mouse_over_grid2? -** Processing line: ~ # The user is adding a hill from the second grid~ + end +** Processing line: ~ unless old_star == grid.star~ - Inside source: true *** True Line Result - # The user is adding a hill from the second grid -** Processing line: ~ state.user_input = :add_hill2~ + unless old_star == grid.star +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - state.user_input = :add_hill2 + recalculate_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71620,94 +79007,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_input~ + # Moves the star to the cell closest to the mouse in the second grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - def process_input -** Processing line: ~ if state.user_input == :star~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - if state.user_input == :star -** Processing line: ~ input_star~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def process_input_heuristic_star~ - Inside source: true *** True Line Result - input_star -** Processing line: ~ elsif state.user_input == :star2~ + def process_input_heuristic_star +** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result - elsif state.user_input == :star2 -** Processing line: ~ input_star2~ + old_star = grid.star.clone +** Processing line: ~ unless heuristic_cell_closest_to_mouse == grid.target~ - Inside source: true *** True Line Result - input_star2 -** Processing line: ~ elsif state.user_input == :target~ + unless heuristic_cell_closest_to_mouse == grid.target +** Processing line: ~ grid.star = heuristic_cell_closest_to_mouse~ - Inside source: true *** True Line Result - elsif state.user_input == :target -** Processing line: ~ input_target~ + grid.star = heuristic_cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - input_target -** Processing line: ~ elsif state.user_input == :target2~ + end +** Processing line: ~ unless old_star == grid.star~ - Inside source: true *** True Line Result - elsif state.user_input == :target2 -** Processing line: ~ input_target2~ + unless old_star == grid.star +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - input_target2 -** Processing line: ~ elsif state.user_input == :remove_wall~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif state.user_input == :remove_wall -** Processing line: ~ input_remove_wall~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - input_remove_wall -** Processing line: ~ elsif state.user_input == :remove_wall2~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif state.user_input == :remove_wall2 -** Processing line: ~ input_remove_wall2~ + +** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ - Inside source: true *** True Line Result - input_remove_wall2 -** Processing line: ~ elsif state.user_input == :add_hill~ + # Moves the target to the grid closest to the mouse in the first grid +** Processing line: ~ # Only recalculate_searchess the search if the target changes position~ - Inside source: true *** True Line Result - elsif state.user_input == :add_hill -** Processing line: ~ input_add_hill~ + # Only recalculate_searchess the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - input_add_hill -** Processing line: ~ elsif state.user_input == :add_hill2~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def process_input_bfs_target~ - Inside source: true *** True Line Result - elsif state.user_input == :add_hill2 -** Processing line: ~ input_add_hill2~ + def process_input_bfs_target +** Processing line: ~ old_target = grid.target.clone~ - Inside source: true *** True Line Result - input_add_hill2 -** Processing line: ~ elsif state.user_input == :add_wall~ + old_target = grid.target.clone +** Processing line: ~ unless bfs_cell_closest_to_mouse == grid.star~ - Inside source: true *** True Line Result - elsif state.user_input == :add_wall -** Processing line: ~ input_add_wall~ + unless bfs_cell_closest_to_mouse == grid.star +** Processing line: ~ grid.target = bfs_cell_closest_to_mouse~ - Inside source: true *** True Line Result - input_add_wall -** Processing line: ~ elsif state.user_input == :add_wall2~ + grid.target = bfs_cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif state.user_input == :add_wall2 -** Processing line: ~ input_add_wall2~ + end +** Processing line: ~ unless old_target == grid.target~ - Inside source: true *** True Line Result - input_add_wall2 + unless old_target == grid.target +** Processing line: ~ recalculate_searches~ +- Inside source: true +*** True Line Result + recalculate_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71720,34 +79111,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the two searches~ +** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - # Calculates the two searches -** Processing line: ~ def calc~ + # Moves the target to the cell closest to the mouse in the second grid +** Processing line: ~ # Only recalculate_searchess the search if the target changes position~ - Inside source: true *** True Line Result - def calc -** Processing line: ~ # If the searches have not started~ + # Only recalculate_searchess the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result - # If the searches have not started -** Processing line: ~ if breadth_first_search.visited.empty?~ + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def process_input_heuristic_target~ - Inside source: true *** True Line Result - if breadth_first_search.visited.empty? -** Processing line: ~ # Calculate the two searches~ + def process_input_heuristic_target +** Processing line: ~ old_target = grid.target.clone~ - Inside source: true *** True Line Result - # Calculate the two searches -** Processing line: ~ calc_breadth_first~ + old_target = grid.target.clone +** Processing line: ~ unless heuristic_cell_closest_to_mouse == grid.star~ - Inside source: true *** True Line Result - calc_breadth_first -** Processing line: ~ calc_dijkstra~ + unless heuristic_cell_closest_to_mouse == grid.star +** Processing line: ~ grid.target = heuristic_cell_closest_to_mouse~ - Inside source: true *** True Line Result - calc_dijkstra + grid.target = heuristic_cell_closest_to_mouse +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ unless old_target == grid.target~ +- Inside source: true +*** True Line Result + unless old_target == grid.target +** Processing line: ~ recalculate_searches~ +- Inside source: true +*** True Line Result + recalculate_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71760,94 +79163,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ # Removes walls in the first grid that are under the cursor~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_breadth_first~ + # Removes walls in the first grid that are under the cursor +** Processing line: ~ def process_input_bfs_remove_wall~ - Inside source: true *** True Line Result - def calc_breadth_first -** Processing line: ~ # Sets up the Breadth First Search~ + def process_input_bfs_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - # Sets up the Breadth First Search -** Processing line: ~ breadth_first_search.visited[state.star] = true~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - breadth_first_search.visited[state.star] = true -** Processing line: ~ breadth_first_search.frontier << state.star~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - breadth_first_search.frontier << state.star -** Processing line: ~ breadth_first_search.came_from[state.star] = nil~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if bfs_mouse_over_grid?~ - Inside source: true *** True Line Result - breadth_first_search.came_from[state.star] = nil -** Processing line: ~~ + if bfs_mouse_over_grid? +** Processing line: ~ if grid.walls.has_key?(bfs_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - -** Processing line: ~ until breadth_first_search.frontier.empty?~ + if grid.walls.has_key?(bfs_cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(bfs_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - until breadth_first_search.frontier.empty? -** Processing line: ~ return if breadth_first_search.visited.has_key?(state.target)~ + grid.walls.delete(bfs_cell_closest_to_mouse) +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - return if breadth_first_search.visited.has_key?(state.target) -** Processing line: ~ # A step in the search~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - # A step in the search -** Processing line: ~ # Takes the next frontier cell~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Takes the next frontier cell -** Processing line: ~ new_frontier = breadth_first_search.frontier.shift~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - new_frontier = breadth_first_search.frontier.shift -** Processing line: ~ # For each of its neighbors~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ + +** Processing line: ~ # Removes walls in the second grid that are under the cursor~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do | neighbor | -** Processing line: ~ # That have not been visited and are not walls~ + # Removes walls in the second grid that are under the cursor +** Processing line: ~ def process_input_heuristic_remove_wall~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)~ + def process_input_heuristic_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result - unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited in the first grid~ + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited in the first grid -** Processing line: ~ breadth_first_search.visited[neighbor] = true~ + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ - Inside source: true *** True Line Result - breadth_first_search.visited[neighbor] = true -** Processing line: ~ breadth_first_search.frontier << neighbor~ + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if heuristic_mouse_over_grid?~ - Inside source: true *** True Line Result - breadth_first_search.frontier << neighbor -** Processing line: ~ # Remember which cell the neighbor came from~ + if heuristic_mouse_over_grid? +** Processing line: ~ if grid.walls.has_key?(heuristic_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - # Remember which cell the neighbor came from -** Processing line: ~ breadth_first_search.came_from[neighbor] = new_frontier~ + if grid.walls.has_key?(heuristic_cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(heuristic_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - breadth_first_search.came_from[neighbor] = new_frontier -** Processing line: ~ end~ + grid.walls.delete(heuristic_cell_closest_to_mouse) +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - end + recalculate_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -71860,246 +79263,258 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - -** Processing line: ~ # Calculates the Dijkstra Search from the beginning to the end~ + # Adds a wall in the first grid in the cell the mouse is over +** Processing line: ~ def process_input_bfs_add_wall~ - Inside source: true *** True Line Result - # Calculates the Dijkstra Search from the beginning to the end -** Processing line: ~~ + def process_input_bfs_add_wall +** Processing line: ~ if bfs_mouse_over_grid?~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_dijkstra~ + if bfs_mouse_over_grid? +** Processing line: ~ unless grid.walls.has_key?(bfs_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - def calc_dijkstra -** Processing line: ~ # The initial values for the Dijkstra search~ + unless grid.walls.has_key?(bfs_cell_closest_to_mouse) +** Processing line: ~ grid.walls[bfs_cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - # The initial values for the Dijkstra search -** Processing line: ~ dijkstra_search.frontier << [state.star, 0]~ + grid.walls[bfs_cell_closest_to_mouse] = true +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - dijkstra_search.frontier << [state.star, 0] -** Processing line: ~ dijkstra_search.came_from[state.star] = nil~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra_search.came_from[state.star] = nil -** Processing line: ~ dijkstra_search.cost_so_far[state.star] = 0~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra_search.cost_so_far[state.star] = 0 + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Until their are no more cells to be explored~ +** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Until their are no more cells to be explored -** Processing line: ~ until dijkstra_search.frontier.empty?~ + # Adds a wall in the second grid in the cell the mouse is over +** Processing line: ~ def process_input_heuristic_add_wall~ - Inside source: true *** True Line Result - until dijkstra_search.frontier.empty? -** Processing line: ~ # Get the next cell to be explored from~ + def process_input_heuristic_add_wall +** Processing line: ~ if heuristic_mouse_over_grid?~ - Inside source: true *** True Line Result - # Get the next cell to be explored from -** Processing line: ~ # We get the first element of the array which is the cell. The second element is the priority.~ + if heuristic_mouse_over_grid? +** Processing line: ~ unless grid.walls.has_key?(heuristic_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - # We get the first element of the array which is the cell. The second element is the priority. -** Processing line: ~ current = dijkstra_search.frontier.shift[0]~ + unless grid.walls.has_key?(heuristic_cell_closest_to_mouse) +** Processing line: ~ grid.walls[heuristic_cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - current = dijkstra_search.frontier.shift[0] -** Processing line: ~~ + grid.walls[heuristic_cell_closest_to_mouse] = true +** Processing line: ~ recalculate_searches~ - Inside source: true *** True Line Result - -** Processing line: ~ # Stop the search if we found the target~ + recalculate_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Stop the search if we found the target -** Processing line: ~ return if current == state.target~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - return if current == state.target + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # For each of the neighbors~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - # For each of the neighbors -** Processing line: ~ adjacent_neighbors(current).each do | neighbor |~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - adjacent_neighbors(current).each do | neighbor | -** Processing line: ~ # Unless this cell is a wall or has already been explored.~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse helps with this~ - Inside source: true *** True Line Result - # Unless this cell is a wall or has already been explored. -** Processing line: ~ unless dijkstra_search.came_from.has_key?(neighbor) or state.walls.has_key?(neighbor)~ + # Finding the cell closest to the mouse helps with this +** Processing line: ~ def bfs_cell_closest_to_mouse~ - Inside source: true *** True Line Result - unless dijkstra_search.came_from.has_key?(neighbor) or state.walls.has_key?(neighbor) -** Processing line: ~ # Calculate the movement cost of getting to this cell and memo~ + def bfs_cell_closest_to_mouse +** Processing line: ~ # Closest cell to the mouse in the first grid~ - Inside source: true *** True Line Result - # Calculate the movement cost of getting to this cell and memo -** Processing line: ~ new_cost = dijkstra_search.cost_so_far[current] + cost(neighbor)~ + # Closest cell to the mouse in the first grid +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - new_cost = dijkstra_search.cost_so_far[current] + cost(neighbor) -** Processing line: ~ dijkstra_search.cost_so_far[neighbor] = new_cost~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - dijkstra_search.cost_so_far[neighbor] = new_cost -** Processing line: ~~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Bound x and y to the grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Add this neighbor to the cells too be explored~ + # Bound x and y to the grid +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - # Add this neighbor to the cells too be explored -** Processing line: ~ dijkstra_search.frontier << [neighbor, new_cost]~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - dijkstra_search.frontier << [neighbor, new_cost] -** Processing line: ~ dijkstra_search.came_from[neighbor] = current~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - dijkstra_search.came_from[neighbor] = current -** Processing line: ~ end~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + [x, y] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sort the frontier so exploration occurs that have a low cost so far.~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - # Sort the frontier so exploration occurs that have a low cost so far. -** Processing line: ~ # My implementation of a priority queue~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - # My implementation of a priority queue -** Processing line: ~ dijkstra_search.frontier = dijkstra_search.frontier.sort_by {|cell, priority| priority}~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ - Inside source: true *** True Line Result - dijkstra_search.frontier = dijkstra_search.frontier.sort_by {|cell, priority| priority} -** Processing line: ~ end~ + # Finding the cell closest to the mouse in the second grid helps with this +** Processing line: ~ def heuristic_cell_closest_to_mouse~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def heuristic_cell_closest_to_mouse +** Processing line: ~ # Closest cell grid to the mouse in the second~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Closest cell grid to the mouse in the second +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - -** Processing line: ~ def cost(cell)~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - def cost(cell) -** Processing line: ~ if state.hills.has_key?(cell)~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Translate the cell to the first grid~ - Inside source: true *** True Line Result - if state.hills.has_key?(cell) -** Processing line: ~ return 5~ + # Translate the cell to the first grid +** Processing line: ~ x -= grid.width + 1~ - Inside source: true *** True Line Result - return 5 -** Processing line: ~ else~ + x -= grid.width + 1 +** Processing line: ~ # Bound x and y to the first grid~ - Inside source: true *** True Line Result - else -** Processing line: ~ return 1~ + # Bound x and y to the first grid +** Processing line: ~ x = 0 if x < 0~ - Inside source: true *** True Line Result - return 1 -** Processing line: ~ end~ + x = 0 if x < 0 +** Processing line: ~ y = 0 if y < 0~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + y = 0 if y < 0 +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ - Inside source: true *** True Line Result - -** Processing line: ~~ + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ - Inside source: true *** True Line Result - -** Processing line: ~~ + # Return closest cell +** Processing line: ~ [x, y]~ - Inside source: true *** True Line Result - + [x, y] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ +** Processing line: ~ def recalculate_searches~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the first grid -** Processing line: ~ # Only resets the search if the star changes position~ + def recalculate_searches +** Processing line: ~ # Reset the searches~ - Inside source: true *** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + # Reset the searches +** Processing line: ~ bfs.came_from = {}~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star~ + bfs.came_from = {} +** Processing line: ~ bfs.frontier = []~ - Inside source: true *** True Line Result - def input_star -** Processing line: ~ old_star = state.star.clone~ + bfs.frontier = [] +** Processing line: ~ bfs.path = []~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ unless cell_closest_to_mouse == state.target~ + bfs.path = [] +** Processing line: ~ heuristic.came_from = {}~ - Inside source: true *** True Line Result - unless cell_closest_to_mouse == state.target -** Processing line: ~ state.star = cell_closest_to_mouse~ + heuristic.came_from = {} +** Processing line: ~ heuristic.frontier = []~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse -** Processing line: ~ end~ + heuristic.frontier = [] +** Processing line: ~ heuristic.path = []~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_star == state.star~ + heuristic.path = [] +** Processing line: ~~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ reset_search~ + +** Processing line: ~ # Move the searches forward to the current step~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Move the searches forward to the current step +** Processing line: ~ state.current_step.times { move_searches_one_step_forward }~ - Inside source: true *** True Line Result - end + state.current_step.times { move_searches_one_step_forward } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72108,150 +79523,154 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ +** Processing line: ~ def move_searches_one_step_forward~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the second grid -** Processing line: ~ # Only resets the search if the star changes position~ + def move_searches_one_step_forward +** Processing line: ~ bfs_one_step_forward~ - Inside source: true *** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + bfs_one_step_forward +** Processing line: ~ heuristic_one_step_forward~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def input_star2~ + heuristic_one_step_forward +** Processing line: ~ end~ - Inside source: true *** True Line Result - def input_star2 -** Processing line: ~ old_star = state.star.clone~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - old_star = state.star.clone -** Processing line: ~ unless cell_closest_to_mouse2 == state.target~ + +** Processing line: ~ def bfs_one_step_forward~ - Inside source: true *** True Line Result - unless cell_closest_to_mouse2 == state.target -** Processing line: ~ state.star = cell_closest_to_mouse2~ + def bfs_one_step_forward +** Processing line: ~ return if bfs.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - state.star = cell_closest_to_mouse2 -** Processing line: ~ end~ + return if bfs.came_from.has_key?(grid.target) +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_star == state.star~ + +** Processing line: ~ # Only runs at the beginning of the search as setup.~ - Inside source: true *** True Line Result - unless old_star == state.star -** Processing line: ~ reset_search~ + # Only runs at the beginning of the search as setup. +** Processing line: ~ if bfs.came_from.empty?~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + if bfs.came_from.empty? +** Processing line: ~ bfs.frontier << grid.star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + bfs.frontier << grid.star +** Processing line: ~ bfs.came_from[grid.star] = nil~ - Inside source: true *** True Line Result - end + bfs.came_from[grid.star] = nil +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ +** Processing line: ~ # A step in the search~ - Inside source: true *** True Line Result - # Moves the target to the grid closest to the mouse in the first grid -** Processing line: ~ # Only reset_searchs the search if the target changes position~ + # A step in the search +** Processing line: ~ unless bfs.frontier.empty?~ - Inside source: true *** True Line Result - # Only reset_searchs the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + unless bfs.frontier.empty? +** Processing line: ~ # Takes the next frontier cell~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def input_target~ + # Takes the next frontier cell +** Processing line: ~ new_frontier = bfs.frontier.shift~ - Inside source: true *** True Line Result - def input_target -** Processing line: ~ old_target = state.target.clone~ + new_frontier = bfs.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - old_target = state.target.clone -** Processing line: ~ unless cell_closest_to_mouse == state.star~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - unless cell_closest_to_mouse == state.star -** Processing line: ~ state.target = cell_closest_to_mouse~ + adjacent_neighbors(new_frontier).each do |neighbor| +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - state.target = cell_closest_to_mouse -** Processing line: ~ end~ + # That have not been visited and are not walls +** Processing line: ~ unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_target == state.target~ + unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result - unless old_target == state.target -** Processing line: ~ reset_search~ + # Add them to the frontier and mark them as visited +** Processing line: ~ bfs.frontier << neighbor~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + bfs.frontier << neighbor +** Processing line: ~ bfs.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + bfs.came_from[neighbor] = new_frontier +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Moves the target to the cell closest to the mouse in the second grid -** Processing line: ~ # Only reset_searchs the search if the target changes position~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Only reset_searchs the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + +** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def input_target2~ + # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line +** Processing line: ~ # Comment this line and let a path generate to see the difference~ - Inside source: true *** True Line Result - def input_target2 -** Processing line: ~ old_target = state.target.clone~ + # Comment this line and let a path generate to see the difference +** Processing line: ~ bfs.frontier = bfs.frontier.sort_by {| cell | proximity_to_star(cell) }~ - Inside source: true *** True Line Result - old_target = state.target.clone -** Processing line: ~ unless cell_closest_to_mouse2 == state.star~ + bfs.frontier = bfs.frontier.sort_by {| cell | proximity_to_star(cell) } +** Processing line: ~~ - Inside source: true *** True Line Result - unless cell_closest_to_mouse2 == state.star -** Processing line: ~ state.target = cell_closest_to_mouse2~ + +** Processing line: ~ # If the search found the target~ - Inside source: true *** True Line Result - state.target = cell_closest_to_mouse2 -** Processing line: ~ end~ + # If the search found the target +** Processing line: ~ if bfs.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_target == state.target~ + if bfs.came_from.has_key?(grid.target) +** Processing line: ~ # Calculate the path between the target and star~ - Inside source: true *** True Line Result - unless old_target == state.target -** Processing line: ~ reset_search~ + # Calculate the path between the target and star +** Processing line: ~ bfs_calc_path~ - Inside source: true *** True Line Result - reset_search + bfs_calc_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72264,50 +79683,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the first grid that are under the cursor~ +** Processing line: ~ # Calculates the path between the target and star for the breadth first search~ - Inside source: true *** True Line Result - # Removes walls in the first grid that are under the cursor -** Processing line: ~ def input_remove_wall~ + # Calculates the path between the target and star for the breadth first search +** Processing line: ~ # Only called when the breadth first search finds the target~ - Inside source: true *** True Line Result - def input_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ + # Only called when the breadth first search finds the target +** Processing line: ~ def bfs_calc_path~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + def bfs_calc_path +** Processing line: ~ # Start from the target~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + # Start from the target +** Processing line: ~ endpoint = grid.target~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if mouse_over_grid?~ + endpoint = grid.target +** Processing line: ~ # And the cell it came from~ - Inside source: true *** True Line Result - if mouse_over_grid? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse)~ + # And the cell it came from +** Processing line: ~ next_endpoint = bfs.came_from[endpoint]~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse)~ + next_endpoint = bfs.came_from[endpoint] +** Processing line: ~ while endpoint and next_endpoint~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse) -** Processing line: ~ state.hills.delete(cell_closest_to_mouse)~ + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between these two cells and store it~ - Inside source: true *** True Line Result - state.hills.delete(cell_closest_to_mouse) -** Processing line: ~ reset_search~ + # Draw a path between these two cells and store it +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ bfs.path << path~ - Inside source: true *** True Line Result - end + bfs.path << path +** Processing line: ~ # And get the next pair of cells~ +- Inside source: true +*** True Line Result + # And get the next pair of cells +** Processing line: ~ endpoint = next_endpoint~ +- Inside source: true +*** True Line Result + endpoint = next_endpoint +** Processing line: ~ next_endpoint = bfs.came_from[endpoint]~ +- Inside source: true +*** True Line Result + next_endpoint = bfs.came_from[endpoint] +** Processing line: ~ # Continue till there are no more cells~ +- Inside source: true +*** True Line Result + # Continue till there are no more cells ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72320,130 +79755,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the second grid that are under the cursor~ +** Processing line: ~ # Moves the heuristic search forward one step~ - Inside source: true *** True Line Result - # Removes walls in the second grid that are under the cursor -** Processing line: ~ def input_remove_wall2~ + # Moves the heuristic search forward one step +** Processing line: ~ # Can be called from tick while the animation is playing~ - Inside source: true *** True Line Result - def input_remove_wall2 -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ + # Can be called from tick while the animation is playing +** Processing line: ~ # Can also be called when recalculating the searches after the user edited the grid~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + # Can also be called when recalculating the searches after the user edited the grid +** Processing line: ~ def heuristic_one_step_forward~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + def heuristic_one_step_forward +** Processing line: ~ # Stop the search if the target has been found~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if mouse_over_grid2?~ + # Stop the search if the target has been found +** Processing line: ~ return if heuristic.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - if mouse_over_grid2? -** Processing line: ~ if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2)~ + return if heuristic.came_from.has_key?(grid.target) +** Processing line: ~~ - Inside source: true *** True Line Result - if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2) -** Processing line: ~ state.walls.delete(cell_closest_to_mouse2)~ + +** Processing line: ~ # If the search has not begun~ - Inside source: true *** True Line Result - state.walls.delete(cell_closest_to_mouse2) -** Processing line: ~ state.hills.delete(cell_closest_to_mouse2)~ + # If the search has not begun +** Processing line: ~ if heuristic.came_from.empty?~ - Inside source: true *** True Line Result - state.hills.delete(cell_closest_to_mouse2) -** Processing line: ~ reset_search~ + if heuristic.came_from.empty? +** Processing line: ~ # Setup the search to begin from the star~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Setup the search to begin from the star +** Processing line: ~ heuristic.frontier << grid.star~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + heuristic.frontier << grid.star +** Processing line: ~ heuristic.came_from[grid.star] = nil~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + heuristic.came_from[grid.star] = nil +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Adds a hill in the first grid in the cell the mouse is over~ -- Inside source: true -*** True Line Result - # Adds a hill in the first grid in the cell the mouse is over -** Processing line: ~ def input_add_hill~ -- Inside source: true -*** True Line Result - def input_add_hill -** Processing line: ~ if mouse_over_grid?~ -- Inside source: true -*** True Line Result - if mouse_over_grid? -** Processing line: ~ unless state.hills.has_key?(cell_closest_to_mouse)~ +** Processing line: ~ # One step in the heuristic search~ - Inside source: true *** True Line Result - unless state.hills.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.hills[cell_closest_to_mouse] = true~ + # One step in the heuristic search +** Processing line: ~~ - Inside source: true *** True Line Result - state.hills[cell_closest_to_mouse] = true -** Processing line: ~ reset_search~ + +** Processing line: ~ # Unless there are no more cells to explore from~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Unless there are no more cells to explore from +** Processing line: ~ unless heuristic.frontier.empty?~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + unless heuristic.frontier.empty? +** Processing line: ~ # Get the next cell to explore from~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Get the next cell to explore from +** Processing line: ~ new_frontier = heuristic.frontier.shift~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + new_frontier = heuristic.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - -** Processing line: ~~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Adds a hill in the second grid in the cell the mouse is over~ + adjacent_neighbors(new_frontier).each do |neighbor| +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - # Adds a hill in the second grid in the cell the mouse is over -** Processing line: ~ def input_add_hill2~ + # That have not been visited and are not walls +** Processing line: ~ unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - def input_add_hill2 -** Processing line: ~ if mouse_over_grid2?~ + unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result - if mouse_over_grid2? -** Processing line: ~ unless state.hills.has_key?(cell_closest_to_mouse2)~ + # Add them to the frontier and mark them as visited +** Processing line: ~ heuristic.frontier << neighbor~ - Inside source: true *** True Line Result - unless state.hills.has_key?(cell_closest_to_mouse2) -** Processing line: ~ state.hills[cell_closest_to_mouse2] = true~ + heuristic.frontier << neighbor +** Processing line: ~ heuristic.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - state.hills[cell_closest_to_mouse2] = true -** Processing line: ~ reset_search~ + heuristic.came_from[neighbor] = new_frontier +** Processing line: ~ end~ - Inside source: true *** True Line Result - reset_search + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72452,46 +79875,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ +** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ - Inside source: true *** True Line Result - # Adds a wall in the first grid in the cell the mouse is over -** Processing line: ~ def input_add_wall~ + # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line +** Processing line: ~ heuristic.frontier = heuristic.frontier.sort_by {| cell | proximity_to_star(cell) }~ - Inside source: true *** True Line Result - def input_add_wall -** Processing line: ~ if mouse_over_grid?~ + heuristic.frontier = heuristic.frontier.sort_by {| cell | proximity_to_star(cell) } +** Processing line: ~ # Sort the frontier so cells that are close to the target are then prioritized~ - Inside source: true *** True Line Result - if mouse_over_grid? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse)~ + # Sort the frontier so cells that are close to the target are then prioritized +** Processing line: ~ heuristic.frontier = heuristic.frontier.sort_by {| cell | heuristic_heuristic(cell) }~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse) -** Processing line: ~ state.hills.delete(cell_closest_to_mouse)~ + heuristic.frontier = heuristic.frontier.sort_by {| cell | heuristic_heuristic(cell) } +** Processing line: ~~ - Inside source: true *** True Line Result - state.hills.delete(cell_closest_to_mouse) -** Processing line: ~ state.walls[cell_closest_to_mouse] = true~ + +** Processing line: ~ # If the search found the target~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse] = true -** Processing line: ~ reset_search~ + # If the search found the target +** Processing line: ~ if heuristic.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + if heuristic.came_from.has_key?(grid.target) +** Processing line: ~ # Calculate the path between the target and star~ - Inside source: true *** True Line Result - end + # Calculate the path between the target and star +** Processing line: ~ heuristic_calc_path~ +- Inside source: true +*** True Line Result + heuristic_calc_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72504,94 +79927,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ +** Processing line: ~ # Returns one-dimensional absolute distance between cell and target~ - Inside source: true *** True Line Result - # Adds a wall in the second grid in the cell the mouse is over -** Processing line: ~ def input_add_wall2~ + # Returns one-dimensional absolute distance between cell and target +** Processing line: ~ # Returns a number to compare distances between cells and the target~ - Inside source: true *** True Line Result - def input_add_wall2 -** Processing line: ~ if mouse_over_grid2?~ + # Returns a number to compare distances between cells and the target +** Processing line: ~ def heuristic_heuristic(cell)~ - Inside source: true *** True Line Result - if mouse_over_grid2? -** Processing line: ~ unless state.walls.has_key?(cell_closest_to_mouse2)~ + def heuristic_heuristic(cell) +** Processing line: ~ (grid.target.x - cell.x).abs + (grid.target.y - cell.y).abs~ - Inside source: true *** True Line Result - unless state.walls.has_key?(cell_closest_to_mouse2) -** Processing line: ~ state.hills.delete(cell_closest_to_mouse2)~ + (grid.target.x - cell.x).abs + (grid.target.y - cell.y).abs +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.hills.delete(cell_closest_to_mouse2) -** Processing line: ~ state.walls[cell_closest_to_mouse2] = true~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.walls[cell_closest_to_mouse2] = true -** Processing line: ~ reset_search~ + +** Processing line: ~ # Calculates the path between the target and star for the heuristic search~ - Inside source: true *** True Line Result - reset_search -** Processing line: ~ end~ + # Calculates the path between the target and star for the heuristic search +** Processing line: ~ # Only called when the heuristic search finds the target~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Only called when the heuristic search finds the target +** Processing line: ~ def heuristic_calc_path~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def heuristic_calc_path +** Processing line: ~ # Start from the target~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Start from the target +** Processing line: ~ endpoint = grid.target~ - Inside source: true *** True Line Result - -** Processing line: ~ # Whenever the user edits the grid,~ + endpoint = grid.target +** Processing line: ~ # And the cell it came from~ - Inside source: true *** True Line Result - # Whenever the user edits the grid, -** Processing line: ~ # The search has to be reset_searchd upto the current step~ + # And the cell it came from +** Processing line: ~ next_endpoint = heuristic.came_from[endpoint]~ - Inside source: true *** True Line Result - # The search has to be reset_searchd upto the current step -** Processing line: ~ # with the current grid as the initial state of the grid~ + next_endpoint = heuristic.came_from[endpoint] +** Processing line: ~ while endpoint and next_endpoint~ - Inside source: true *** True Line Result - # with the current grid as the initial state of the grid -** Processing line: ~ def reset_search~ + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between these two cells and store it~ - Inside source: true *** True Line Result - def reset_search -** Processing line: ~ breadth_first_search.visited = {}~ + # Draw a path between these two cells and store it +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ - Inside source: true *** True Line Result - breadth_first_search.visited = {} -** Processing line: ~ breadth_first_search.frontier = []~ + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ heuristic.path << path~ - Inside source: true *** True Line Result - breadth_first_search.frontier = [] -** Processing line: ~ breadth_first_search.came_from = {}~ + heuristic.path << path +** Processing line: ~ # And get the next pair of cells~ - Inside source: true *** True Line Result - breadth_first_search.came_from = {} -** Processing line: ~~ + # And get the next pair of cells +** Processing line: ~ endpoint = next_endpoint~ - Inside source: true *** True Line Result - -** Processing line: ~ dijkstra_search.frontier = []~ + endpoint = next_endpoint +** Processing line: ~ next_endpoint = heuristic.came_from[endpoint]~ - Inside source: true *** True Line Result - dijkstra_search.frontier = [] -** Processing line: ~ dijkstra_search.came_from = {}~ + next_endpoint = heuristic.came_from[endpoint] +** Processing line: ~ # Continue till there are no more cells~ - Inside source: true *** True Line Result - dijkstra_search.came_from = {} -** Processing line: ~ dijkstra_search.cost_so_far = {}~ + # Continue till there are no more cells +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra_search.cost_so_far = {} + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -72600,14 +80023,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # Returns a list of adjacent cells~ - Inside source: true *** True Line Result @@ -72656,26 +80071,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Sorts the neighbors so the rendered path is a zigzag path~ -- Inside source: true -*** True Line Result - # Sorts the neighbors so the rendered path is a zigzag path -** Processing line: ~ # Cells in a diagonal direction are given priority~ -- Inside source: true -*** True Line Result - # Cells in a diagonal direction are given priority -** Processing line: ~ # Comment this line to see the difference~ -- Inside source: true -*** True Line Result - # Comment this line to see the difference -** Processing line: ~ neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) }~ -- Inside source: true -*** True Line Result - neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ neighbors~ - Inside source: true *** True Line Result @@ -72712,18 +80107,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # So, if possible, the search tries to go diagonal (zigzag) first -** Processing line: ~ def proximity_to_star(x, y)~ +** Processing line: ~ def proximity_to_star(cell)~ - Inside source: true *** True Line Result - def proximity_to_star(x, y) -** Processing line: ~ distance_x = (state.star.x - x).abs~ + def proximity_to_star(cell) +** Processing line: ~ distance_x = (grid.star.x - cell.x).abs~ - Inside source: true *** True Line Result - distance_x = (state.star.x - x).abs -** Processing line: ~ distance_y = (state.star.y - y).abs~ + distance_x = (grid.star.x - cell.x).abs +** Processing line: ~ distance_y = (grid.star.y - cell.y).abs~ - Inside source: true *** True Line Result - distance_y = (state.star.y - y).abs + distance_y = (grid.star.y - cell.y).abs ** Processing line: ~~ - Inside source: true *** True Line Result @@ -72756,278 +80151,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ -- Inside source: true -*** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ -- Inside source: true -*** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse helps with this~ -- Inside source: true -*** True Line Result - # Finding the cell closest to the mouse helps with this -** Processing line: ~ def cell_closest_to_mouse~ -- Inside source: true -*** True Line Result - def cell_closest_to_mouse -** Processing line: ~ # Closest cell to the mouse in the first grid~ -- Inside source: true -*** True Line Result - # Closest cell to the mouse in the first grid -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ -- Inside source: true -*** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ -- Inside source: true -*** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Bound x and y to the grid~ -- Inside source: true -*** True Line Result - # Bound x and y to the grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ -- Inside source: true -*** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ -- Inside source: true -*** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ -- Inside source: true -*** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ -- Inside source: true -*** True Line Result - [x, y] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ -- Inside source: true -*** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ -- Inside source: true -*** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ -- Inside source: true -*** True Line Result - # Finding the cell closest to the mouse in the second grid helps with this -** Processing line: ~ def cell_closest_to_mouse2~ -- Inside source: true -*** True Line Result - def cell_closest_to_mouse2 -** Processing line: ~ # Closest cell grid to the mouse in the second~ -- Inside source: true -*** True Line Result - # Closest cell grid to the mouse in the second -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ -- Inside source: true -*** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ -- Inside source: true -*** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Translate the cell to the first grid~ -- Inside source: true -*** True Line Result - # Translate the cell to the first grid -** Processing line: ~ x -= grid.width + 1~ -- Inside source: true -*** True Line Result - x -= grid.width + 1 -** Processing line: ~ # Bound x and y to the first grid~ -- Inside source: true -*** True Line Result - # Bound x and y to the first grid -** Processing line: ~ x = 0 if x < 0~ -- Inside source: true -*** True Line Result - x = 0 if x < 0 -** Processing line: ~ y = 0 if y < 0~ -- Inside source: true -*** True Line Result - y = 0 if y < 0 -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ -- Inside source: true -*** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ -- Inside source: true -*** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ -- Inside source: true -*** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ -- Inside source: true -*** True Line Result - [x, y] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the star from the first grid -** Processing line: ~ def mouse_over_star?~ -- Inside source: true -*** True Line Result - def mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(state.star))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(scale_up(state.star)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the star from the second grid -** Processing line: ~ def mouse_over_star2?~ -- Inside source: true -*** True Line Result - def mouse_over_star2? -** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(state.star))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(move_and_scale_up(state.star)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the first grid -** Processing line: ~ def mouse_over_target?~ -- Inside source: true -*** True Line Result - def mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(state.target))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(scale_up(state.target)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the second grid -** Processing line: ~ def mouse_over_target2?~ -- Inside source: true -*** True Line Result - def mouse_over_target2? -** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(state.target))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(move_and_scale_up(state.target)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing walls from the first grid -** Processing line: ~ def mouse_over_wall?~ -- Inside source: true -*** True Line Result - def mouse_over_wall? -** Processing line: ~ state.walls.each_key do | wall |~ -- Inside source: true -*** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(wall))~ -- Inside source: true -*** True Line Result - return true if inputs.mouse.point.inside_rect?(scale_up(wall)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ false~ -- Inside source: true -*** True Line Result - false -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing walls from the second grid -** Processing line: ~ def mouse_over_wall2?~ -- Inside source: true -*** True Line Result - def mouse_over_wall2? -** Processing line: ~ state.walls.each_key do | wall |~ -- Inside source: true -*** True Line Result - state.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(move_and_scale_up(wall))~ -- Inside source: true -*** True Line Result - return true if inputs.mouse.point.inside_rect?(move_and_scale_up(wall)) -** Processing line: ~ end~ +** Processing line: ~ # Methods that allow code to be more concise. Subdivides args.state, which is where all variables are stored.~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Methods that allow code to be more concise. Subdivides args.state, which is where all variables are stored. +** Processing line: ~ def grid~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + def grid +** Processing line: ~ state.grid~ - Inside source: true *** True Line Result - false + state.grid ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73036,34 +80171,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing hills from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing hills from the first grid -** Processing line: ~ def mouse_over_hill?~ -- Inside source: true -*** True Line Result - def mouse_over_hill? -** Processing line: ~ state.hills.each_key do | hill |~ -- Inside source: true -*** True Line Result - state.hills.each_key do | hill | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(scale_up(hill))~ -- Inside source: true -*** True Line Result - return true if inputs.mouse.point.inside_rect?(scale_up(hill)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ +** Processing line: ~ def buttons~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + def buttons +** Processing line: ~ state.buttons~ - Inside source: true *** True Line Result - false + state.buttons ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73072,34 +80187,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing hills from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing hills from the second grid -** Processing line: ~ def mouse_over_hill2?~ -- Inside source: true -*** True Line Result - def mouse_over_hill2? -** Processing line: ~ state.hills.each_key do | hill |~ -- Inside source: true -*** True Line Result - state.hills.each_key do | hill | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(move_and_scale_up(hill))~ -- Inside source: true -*** True Line Result - return true if inputs.mouse.point.inside_rect?(move_and_scale_up(hill)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ +** Processing line: ~ def slider~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + def slider +** Processing line: ~ state.slider~ - Inside source: true *** True Line Result - false + state.slider ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73108,18 +80203,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be adding walls from the first grid -** Processing line: ~ def mouse_over_grid?~ +** Processing line: ~ def bfs~ - Inside source: true *** True Line Result - def mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(scale_up(grid.rect))~ + def bfs +** Processing line: ~ state.bfs~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(scale_up(grid.rect)) + state.bfs ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73128,18 +80219,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be adding walls from the second grid -** Processing line: ~ def mouse_over_grid2?~ +** Processing line: ~ def heuristic~ - Inside source: true *** True Line Result - def mouse_over_grid2? -** Processing line: ~ inputs.mouse.point.inside_rect?(move_and_scale_up(grid.rect))~ + def heuristic +** Processing line: ~ state.heuristic~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(move_and_scale_up(grid.rect)) + state.heuristic ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73148,26 +80235,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods provide handy aliases to colors~ -- Inside source: true -*** True Line Result - # These methods provide handy aliases to colors -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Light brown~ +** Processing line: ~ # Descriptive aliases for colors~ - Inside source: true *** True Line Result - # Light brown -** Processing line: ~ def unvisited_color~ + # Descriptive aliases for colors +** Processing line: ~ def default_color~ - Inside source: true *** True Line Result - def unvisited_color -** Processing line: ~ [221, 212, 213]~ + def default_color +** Processing line: ~ [221, 212, 213] # Light Brown~ - Inside source: true *** True Line Result - [221, 212, 213] + [221, 212, 213] # Light Brown ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73176,54 +80255,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Camo Green~ -- Inside source: true -*** True Line Result - # Camo Green ** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result def wall_color -** Processing line: ~ [134, 134, 120]~ -- Inside source: true -*** True Line Result - [134, 134, 120] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Pastel White~ -- Inside source: true -*** True Line Result - # Pastel White -** Processing line: ~ def path_color~ -- Inside source: true -*** True Line Result - def path_color -** Processing line: ~ [231, 230, 228]~ -- Inside source: true -*** True Line Result - [231, 230, 228] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def red~ -- Inside source: true -*** True Line Result - def red -** Processing line: ~ [255, 0, 0]~ +** Processing line: ~ [134, 134, 120] # Camo Green~ - Inside source: true *** True Line Result - [255, 0, 0] + [134, 134, 120] # Camo Green ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73232,18 +80271,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # A Green~ -- Inside source: true -*** True Line Result - # A Green -** Processing line: ~ def hill_color~ +** Processing line: ~ def visited_color~ - Inside source: true *** True Line Result - def hill_color -** Processing line: ~ [139, 173, 132]~ + def visited_color +** Processing line: ~ [204, 191, 179] # Dark Brown~ - Inside source: true *** True Line Result - [139, 173, 132] + [204, 191, 179] # Dark Brown ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73252,18 +80287,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Makes code more concise~ -- Inside source: true -*** True Line Result - # Makes code more concise -** Processing line: ~ def grid~ +** Processing line: ~ def frontier_color~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + def frontier_color +** Processing line: ~ [103, 136, 204] # Blue~ - Inside source: true *** True Line Result - state.grid + [103, 136, 204] # Blue ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73272,14 +80303,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def breadth_first_search~ +** Processing line: ~ def path_color~ - Inside source: true *** True Line Result - def breadth_first_search -** Processing line: ~ state.breadth_first_search~ + def path_color +** Processing line: ~ [231, 230, 228] # Pastel White~ - Inside source: true *** True Line Result - state.breadth_first_search + [231, 230, 228] # Pastel White ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73288,14 +80319,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def dijkstra_search~ +** Processing line: ~ def button_color~ - Inside source: true *** True Line Result - def dijkstra_search -** Processing line: ~ state.dijkstra_search~ + def button_color +** Processing line: ~ [190, 190, 190] # Gray~ - Inside source: true *** True Line Result - state.dijkstra_search + [190, 190, 190] # Gray ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73304,10 +80335,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # Method that is called by DragonRuby periodically~ - Inside source: true *** True Line Result @@ -73352,22 +80379,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Every tick, new args are passed, and the Dijkstra tick method is called~ +** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ - Inside source: true *** True Line Result - # Every tick, new args are passed, and the Dijkstra tick method is called -** Processing line: ~ $movement_costs ||= Movement_Costs.new(args)~ + # Every tick, new args are passed, and the Breadth First Search tick is called +** Processing line: ~ $heuristic_with_walls ||= Heuristic_With_Walls.new(args)~ - Inside source: true *** True Line Result - $movement_costs ||= Movement_Costs.new(args) -** Processing line: ~ $movement_costs.args = args~ + $heuristic_with_walls ||= Heuristic_With_Walls.new(args) +** Processing line: ~ $heuristic_with_walls.args = args~ - Inside source: true *** True Line Result - $movement_costs.args = args -** Processing line: ~ $movement_costs.tick~ + $heuristic_with_walls.args = args +** Processing line: ~ $heuristic_with_walls.tick~ - Inside source: true *** True Line Result - $movement_costs.tick + $heuristic_with_walls.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73384,10 +80411,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def reset -** Processing line: ~ $movement_costs = nil~ +** Processing line: ~ $heuristic_with_walls = nil~ - Inside source: true *** True Line Result - $movement_costs = nil + $heuristic_with_walls = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -73404,54 +80431,54 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Path Finding Algorithms - Heuristic - main.rb~ +** Processing line: ~*** Path Finding Algorithms - Heuristic With Walls - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Path Finding Algorithms - Heuristic - main.rb +*** Path Finding Algorithms - Heuristic With Walls - 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/13_path_finding_algorithms/06_heuristic/app/main.rb~ +** Processing line: ~ # ./samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/06_heuristic/app/main.rb + # ./samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb ** Processing line: ~ # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ +** Processing line: ~ # The effectiveness of the Heuristic search algorithm is shown through this demonstration.~ - Inside source: true *** True Line Result - -** Processing line: ~ # This time the heuristic search still explored less of the grid, hence finishing faster.~ + # The effectiveness of the Heuristic search algorithm is shown through this demonstration. +** Processing line: ~ # Notice that both searches find the shortest path~ - Inside source: true *** True Line Result - # This time the heuristic search still explored less of the grid, hence finishing faster. -** Processing line: ~ # However, it did not find the shortest path between the star and the target.~ + # Notice that both searches find the shortest path +** Processing line: ~ # The heuristic search, however, explores less of the grid, and is therefore faster.~ - Inside source: true *** True Line Result - # However, it did not find the shortest path between the star and the target. -** Processing line: ~~ + # The heuristic search, however, explores less of the grid, and is therefore faster. +** Processing line: ~ # The heuristic search prioritizes searching cells that are closer to the target.~ - Inside source: true *** True Line Result - -** Processing line: ~ # The only difference between this app and Heuristic is the change of the starting position.~ + # The heuristic search prioritizes searching cells that are closer to the target. +** Processing line: ~ # Make sure to look at the Heuristic with walls program to see some of the downsides of the heuristic algorithm.~ - Inside source: true *** True Line Result - # The only difference between this app and Heuristic is the change of the starting position. + # Make sure to look at the Heuristic with walls program to see some of the downsides of the heuristic algorithm. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ class Heuristic_With_Walls~ +** Processing line: ~ class Heuristic~ - Inside source: true *** True Line Result - class Heuristic_With_Walls + class Heuristic ** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result @@ -73552,10 +80579,142 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result grid.target ||= [14, 12] -** Processing line: ~ grid.walls ||= {}~ +** Processing line: ~ grid.walls ||= {~ - Inside source: true *** True Line Result - grid.walls ||= {} + grid.walls ||= { +** Processing line: ~ [2, 2] => true,~ +- Inside source: true +*** True Line Result + [2, 2] => true, +** Processing line: ~ [3, 2] => true,~ +- Inside source: true +*** True Line Result + [3, 2] => true, +** Processing line: ~ [4, 2] => true,~ +- Inside source: true +*** True Line Result + [4, 2] => true, +** Processing line: ~ [5, 2] => true,~ +- Inside source: true +*** True Line Result + [5, 2] => true, +** Processing line: ~ [6, 2] => true,~ +- Inside source: true +*** True Line Result + [6, 2] => true, +** Processing line: ~ [7, 2] => true,~ +- Inside source: true +*** True Line Result + [7, 2] => true, +** Processing line: ~ [8, 2] => true,~ +- Inside source: true +*** True Line Result + [8, 2] => true, +** Processing line: ~ [9, 2] => true,~ +- Inside source: true +*** True Line Result + [9, 2] => true, +** Processing line: ~ [10, 2] => true,~ +- Inside source: true +*** True Line Result + [10, 2] => true, +** Processing line: ~ [11, 2] => true,~ +- Inside source: true +*** True Line Result + [11, 2] => true, +** Processing line: ~ [12, 2] => true,~ +- Inside source: true +*** True Line Result + [12, 2] => true, +** Processing line: ~ [12, 3] => true,~ +- Inside source: true +*** True Line Result + [12, 3] => true, +** Processing line: ~ [12, 4] => true,~ +- Inside source: true +*** True Line Result + [12, 4] => true, +** Processing line: ~ [12, 5] => true,~ +- Inside source: true +*** True Line Result + [12, 5] => true, +** Processing line: ~ [12, 6] => true,~ +- Inside source: true +*** True Line Result + [12, 6] => true, +** Processing line: ~ [12, 7] => true,~ +- Inside source: true +*** True Line Result + [12, 7] => true, +** Processing line: ~ [12, 8] => true,~ +- Inside source: true +*** True Line Result + [12, 8] => true, +** Processing line: ~ [12, 9] => true,~ +- Inside source: true +*** True Line Result + [12, 9] => true, +** Processing line: ~ [12, 10] => true,~ +- Inside source: true +*** True Line Result + [12, 10] => true, +** Processing line: ~ [12, 11] => true,~ +- Inside source: true +*** True Line Result + [12, 11] => true, +** Processing line: ~ [12, 12] => true,~ +- Inside source: true +*** True Line Result + [12, 12] => true, +** Processing line: ~ [2, 12] => true,~ +- Inside source: true +*** True Line Result + [2, 12] => true, +** Processing line: ~ [3, 12] => true,~ +- Inside source: true +*** True Line Result + [3, 12] => true, +** Processing line: ~ [4, 12] => true,~ +- Inside source: true +*** True Line Result + [4, 12] => true, +** Processing line: ~ [5, 12] => true,~ +- Inside source: true +*** True Line Result + [5, 12] => true, +** Processing line: ~ [6, 12] => true,~ +- Inside source: true +*** True Line Result + [6, 12] => true, +** Processing line: ~ [7, 12] => true,~ +- Inside source: true +*** True Line Result + [7, 12] => true, +** Processing line: ~ [8, 12] => true,~ +- Inside source: true +*** True Line Result + [8, 12] => true, +** Processing line: ~ [9, 12] => true,~ +- Inside source: true +*** True Line Result + [9, 12] => true, +** Processing line: ~ [10, 12] => true,~ +- Inside source: true +*** True Line Result + [10, 12] => true, +** Processing line: ~ [11, 12] => true,~ +- Inside source: true +*** True Line Result + [11, 12] => true, +** Processing line: ~ [12, 12] => true~ +- Inside source: true +*** True Line Result + [12, 12] => true +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } ** Processing line: ~ # There are no hills in the Heuristic Search Demo~ - Inside source: true *** True Line Result @@ -75132,10 +82291,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def get_path_between(cell_one, cell_two) -** Processing line: ~ path = nil~ +** Processing line: ~ path = []~ - Inside source: true *** True Line Result - path = nil + path = [] ** Processing line: ~~ - Inside source: true *** True Line Result @@ -77304,18 +84463,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $heuristic_with_walls ||= Heuristic_With_Walls.new(args)~ +** Processing line: ~ $heuristic ||= Heuristic.new(args)~ - Inside source: true *** True Line Result - $heuristic_with_walls ||= Heuristic_With_Walls.new(args) -** Processing line: ~ $heuristic_with_walls.args = args~ + $heuristic ||= Heuristic.new(args) +** Processing line: ~ $heuristic.args = args~ - Inside source: true *** True Line Result - $heuristic_with_walls.args = args -** Processing line: ~ $heuristic_with_walls.tick~ + $heuristic.args = args +** Processing line: ~ $heuristic.tick~ - Inside source: true *** True Line Result - $heuristic_with_walls.tick + $heuristic.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -77332,10 +84491,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def reset -** Processing line: ~ $heuristic_with_walls = nil~ +** Processing line: ~ $heuristic = nil~ - Inside source: true *** True Line Result - $heuristic_with_walls = nil + $heuristic = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -77352,54 +84511,58 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Path Finding Algorithms - Heuristic With Walls - main.rb~ +** Processing line: ~*** Path Finding Algorithms - A Star - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Path Finding Algorithms - Heuristic With Walls - main.rb +*** Path Finding Algorithms - A Star - 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/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb~ +** Processing line: ~ # ./samples/13_path_finding_algorithms/08_a_star/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb + # ./samples/13_path_finding_algorithms/08_a_star/app/main.rb ** Processing line: ~ # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ - Inside source: true *** True Line Result # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~ # The effectiveness of the Heuristic search algorithm is shown through this demonstration.~ +** Processing line: ~~ - Inside source: true *** True Line Result - # The effectiveness of the Heuristic search algorithm is shown through this demonstration. -** Processing line: ~ # Notice that both searches find the shortest path~ + +** Processing line: ~ # The A* Search works by incorporating both the distance from the starting point~ - Inside source: true *** True Line Result - # Notice that both searches find the shortest path -** Processing line: ~ # The heuristic search, however, explores less of the grid, and is therefore faster.~ + # The A* Search works by incorporating both the distance from the starting point +** Processing line: ~ # and the distance from the target in its heurisitic.~ - Inside source: true *** True Line Result - # The heuristic search, however, explores less of the grid, and is therefore faster. -** Processing line: ~ # The heuristic search prioritizes searching cells that are closer to the target.~ + # and the distance from the target in its heurisitic. +** Processing line: ~~ - Inside source: true *** True Line Result - # The heuristic search prioritizes searching cells that are closer to the target. -** Processing line: ~ # Make sure to look at the Heuristic with walls program to see some of the downsides of the heuristic algorithm.~ + +** Processing line: ~ # It tends to find the correct (shortest) path even when the Greedy Best-First Search does not,~ - Inside source: true *** True Line Result - # Make sure to look at the Heuristic with walls program to see some of the downsides of the heuristic algorithm. + # It tends to find the correct (shortest) path even when the Greedy Best-First Search does not, +** Processing line: ~ # and it explores less of the grid, and is therefore faster, than Dijkstra's Search.~ +- Inside source: true +*** True Line Result + # and it explores less of the grid, and is therefore faster, than Dijkstra's Search. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ class Heuristic~ +** Processing line: ~ class A_Star_Algorithm~ - Inside source: true *** True Line Result - class Heuristic + class A_Star_Algorithm ** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result @@ -77424,30 +84587,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result input -** Processing line: ~ # If animation is playing, and max steps have not been reached~ -- Inside source: true -*** True Line Result - # If animation is playing, and max steps have not been reached -** Processing line: ~ # Move the search a step forward~ -- Inside source: true -*** True Line Result - # Move the search a step forward -** Processing line: ~ if state.play && state.current_step < state.max_steps~ -- Inside source: true -*** True Line Result - if state.play && state.current_step < state.max_steps -** Processing line: ~ # Variable that tells the program what step to recalculate up to~ +** Processing line: ~~ - Inside source: true *** True Line Result - # Variable that tells the program what step to recalculate up to -** Processing line: ~ state.current_step += 1~ + +** Processing line: ~ if dijkstra.came_from.empty?~ - Inside source: true *** True Line Result - state.current_step += 1 -** Processing line: ~ move_searches_one_step_forward~ + if dijkstra.came_from.empty? +** Processing line: ~ calc_searches~ - Inside source: true *** True Line Result - move_searches_one_step_forward + calc_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -77480,10 +84631,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result grid.height ||= 15 -** Processing line: ~ grid.cell_size ||= 40~ +** Processing line: ~ grid.cell_size ||= 27~ - Inside source: true *** True Line Result - grid.cell_size ||= 40 + grid.cell_size ||= 27 ** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ - Inside source: true *** True Line Result @@ -77496,10 +84647,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result grid.star ||= [0, 2] -** Processing line: ~ grid.target ||= [14, 12]~ +** Processing line: ~ grid.target ||= [11, 13]~ - Inside source: true *** True Line Result - grid.target ||= [14, 12] + grid.target ||= [11, 13] ** Processing line: ~ grid.walls ||= {~ - Inside source: true *** True Line Result @@ -77588,18 +84739,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [12, 12] => true, -** Processing line: ~ [2, 12] => true,~ -- Inside source: true -*** True Line Result - [2, 12] => true, -** Processing line: ~ [3, 12] => true,~ -- Inside source: true -*** True Line Result - [3, 12] => true, -** Processing line: ~ [4, 12] => true,~ -- Inside source: true -*** True Line Result - [4, 12] => true, ** Processing line: ~ [5, 12] => true,~ - Inside source: true *** True Line Result @@ -77636,10 +84775,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result } -** Processing line: ~ # There are no hills in the Heuristic Search Demo~ -- Inside source: true -*** True Line Result - # There are no hills in the Heuristic Search Demo ** Processing line: ~~ - Inside source: true *** True Line Result @@ -77700,250 +84835,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # It prevents calculating the path every tick. -** Processing line: ~ bfs.came_from ||= {}~ -- Inside source: true -*** True Line Result - bfs.came_from ||= {} -** Processing line: ~ bfs.frontier ||= []~ -- Inside source: true -*** True Line Result - bfs.frontier ||= [] -** Processing line: ~ bfs.path ||= []~ -- Inside source: true -*** True Line Result - bfs.path ||= [] -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ heuristic.came_from ||= {}~ -- Inside source: true -*** True Line Result - heuristic.came_from ||= {} -** Processing line: ~ heuristic.frontier ||= []~ -- Inside source: true -*** True Line Result - heuristic.frontier ||= [] -** Processing line: ~ heuristic.path ||= []~ -- Inside source: true -*** True Line Result - heuristic.path ||= [] -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Stores which step of the animation is being rendered~ -- Inside source: true -*** True Line Result - # Stores which step of the animation is being rendered -** Processing line: ~ # When the user moves the star or messes with the walls,~ -- Inside source: true -*** True Line Result - # When the user moves the star or messes with the walls, -** Processing line: ~ # the searches are recalculated up to this step~ -- Inside source: true -*** True Line Result - # the searches are recalculated up to this step -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Unless the current step has a value~ -- Inside source: true -*** True Line Result - # Unless the current step has a value -** Processing line: ~ unless state.current_step~ -- Inside source: true -*** True Line Result - unless state.current_step -** Processing line: ~ # Set the current step to 10~ -- Inside source: true -*** True Line Result - # Set the current step to 10 -** Processing line: ~ state.current_step = 10~ -- Inside source: true -*** True Line Result - state.current_step = 10 -** Processing line: ~ # And calculate the searches up to step 10~ -- Inside source: true -*** True Line Result - # And calculate the searches up to step 10 -** Processing line: ~ recalculate_searches~ -- Inside source: true -*** True Line Result - recalculate_searches -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # At some step the animation will end,~ -- Inside source: true -*** True Line Result - # At some step the animation will end, -** Processing line: ~ # and further steps won't change anything (the whole grid will be explored)~ -- Inside source: true -*** True Line Result - # and further steps won't change anything (the whole grid will be explored) -** Processing line: ~ # This step is roughly the grid's width * height~ -- Inside source: true -*** True Line Result - # This step is roughly the grid's width * height -** Processing line: ~ # When anim_steps equals max_steps no more calculations will occur~ -- Inside source: true -*** True Line Result - # When anim_steps equals max_steps no more calculations will occur -** Processing line: ~ # and the slider will be at the end~ -- Inside source: true -*** True Line Result - # and the slider will be at the end -** Processing line: ~ state.max_steps = grid.width * grid.height~ -- Inside source: true -*** True Line Result - state.max_steps = grid.width * grid.height -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Whether the animation should play or not~ -- Inside source: true -*** True Line Result - # Whether the animation should play or not -** Processing line: ~ # If true, every tick moves anim_steps forward one~ -- Inside source: true -*** True Line Result - # If true, every tick moves anim_steps forward one -** Processing line: ~ # Pressing the stepwise animation buttons will pause the animation~ -- Inside source: true -*** True Line Result - # Pressing the stepwise animation buttons will pause the animation -** Processing line: ~ # An if statement instead of the ||= operator is used for assigning a boolean value.~ -- Inside source: true -*** True Line Result - # An if statement instead of the ||= operator is used for assigning a boolean value. -** Processing line: ~ # The || operator does not differentiate between nil and false.~ +** Processing line: ~ dijkstra.came_from ||= {}~ - Inside source: true *** True Line Result - # The || operator does not differentiate between nil and false. -** Processing line: ~ if state.play == nil~ + dijkstra.came_from ||= {} +** Processing line: ~ dijkstra.cost_so_far ||= {}~ - Inside source: true *** True Line Result - if state.play == nil -** Processing line: ~ state.play = false~ + dijkstra.cost_so_far ||= {} +** Processing line: ~ dijkstra.frontier ||= []~ - Inside source: true *** True Line Result - state.play = false -** Processing line: ~ end~ + dijkstra.frontier ||= [] +** Processing line: ~ dijkstra.path ||= []~ - Inside source: true *** True Line Result - end + dijkstra.path ||= [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Store the rects of the buttons that control the animation~ -- Inside source: true -*** True Line Result - # Store the rects of the buttons that control the animation -** Processing line: ~ # They are here for user customization~ -- Inside source: true -*** True Line Result - # They are here for user customization -** Processing line: ~ # Editing these might require recentering the text inside them~ -- Inside source: true -*** True Line Result - # Editing these might require recentering the text inside them -** Processing line: ~ # Those values can be found in the render_button methods~ -- Inside source: true -*** True Line Result - # Those values can be found in the render_button methods -** Processing line: ~ buttons.left = [470, 600, 50, 50]~ +** Processing line: ~ greedy.came_from ||= {}~ - Inside source: true *** True Line Result - buttons.left = [470, 600, 50, 50] -** Processing line: ~ buttons.center = [520, 600, 200, 50]~ + greedy.came_from ||= {} +** Processing line: ~ greedy.frontier ||= []~ - Inside source: true *** True Line Result - buttons.center = [520, 600, 200, 50] -** Processing line: ~ buttons.right = [720, 600, 50, 50]~ + greedy.frontier ||= [] +** Processing line: ~ greedy.path ||= []~ - Inside source: true *** True Line Result - buttons.right = [720, 600, 50, 50] + greedy.path ||= [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The variables below are related to the slider~ -- Inside source: true -*** True Line Result - # The variables below are related to the slider -** Processing line: ~ # They allow the user to customize them~ -- Inside source: true -*** True Line Result - # They allow the user to customize them -** Processing line: ~ # They also give a central location for the render and input methods to get~ -- Inside source: true -*** True Line Result - # They also give a central location for the render and input methods to get -** Processing line: ~ # information from~ -- Inside source: true -*** True Line Result - # information from -** Processing line: ~ # x & y are the coordinates of the leftmost part of the slider line~ -- Inside source: true -*** True Line Result - # x & y are the coordinates of the leftmost part of the slider line -** Processing line: ~ slider.x = 440~ -- Inside source: true -*** True Line Result - slider.x = 440 -** Processing line: ~ slider.y = 675~ -- Inside source: true -*** True Line Result - slider.y = 675 -** Processing line: ~ # This is the width of the line~ -- Inside source: true -*** True Line Result - # This is the width of the line -** Processing line: ~ slider.w = 360~ -- Inside source: true -*** True Line Result - slider.w = 360 -** Processing line: ~ # This is the offset for the circle~ -- Inside source: true -*** True Line Result - # This is the offset for the circle -** Processing line: ~ # Allows the center of the circle to be on the line,~ -- Inside source: true -*** True Line Result - # Allows the center of the circle to be on the line, -** Processing line: ~ # as opposed to the upper right corner~ -- Inside source: true -*** True Line Result - # as opposed to the upper right corner -** Processing line: ~ slider.offset = 20~ -- Inside source: true -*** True Line Result - slider.offset = 20 -** Processing line: ~ # This is the spacing between each of the notches on the slider~ -- Inside source: true -*** True Line Result - # This is the spacing between each of the notches on the slider -** Processing line: ~ # Notches are places where the circle can rest on the slider line~ +** Processing line: ~ a_star.frontier ||= []~ - Inside source: true *** True Line Result - # Notches are places where the circle can rest on the slider line -** Processing line: ~ # There needs to be a notch for each step before the maximum number of steps~ + a_star.frontier ||= [] +** Processing line: ~ a_star.came_from ||= {}~ - Inside source: true *** True Line Result - # There needs to be a notch for each step before the maximum number of steps -** Processing line: ~ slider.spacing = slider.w.to_f / state.max_steps.to_f~ + a_star.came_from ||= {} +** Processing line: ~ a_star.path ||= []~ - Inside source: true *** True Line Result - slider.spacing = slider.w.to_f / state.max_steps.to_f + a_star.path ||= [] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -77968,18 +84907,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def render -** Processing line: ~ render_ui~ +** Processing line: ~ render_labels~ - Inside source: true *** True Line Result - render_ui -** Processing line: ~ render_bfs~ + render_labels +** Processing line: ~ render_dijkstra~ - Inside source: true *** True Line Result - render_bfs -** Processing line: ~ render_heuristic~ + render_dijkstra +** Processing line: ~ render_greedy~ - Inside source: true *** True Line Result - render_heuristic + render_greedy +** Processing line: ~ render_a_star~ +- Inside source: true +*** True Line Result + render_a_star ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -77988,22 +84931,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_ui~ +** Processing line: ~ def render_labels~ - Inside source: true *** True Line Result - def render_ui -** Processing line: ~ render_buttons~ + def render_labels +** Processing line: ~ outputs.labels << [150, 450, "Dijkstra's"]~ - Inside source: true *** True Line Result - render_buttons -** Processing line: ~ render_slider~ + outputs.labels << [150, 450, "Dijkstra's"] +** Processing line: ~ outputs.labels << [550, 450, "Greedy Best-First"]~ - Inside source: true *** True Line Result - render_slider -** Processing line: ~ render_labels~ + outputs.labels << [550, 450, "Greedy Best-First"] +** Processing line: ~ outputs.labels << [1025, 450, "A* Search"]~ - Inside source: true *** True Line Result - render_labels + outputs.labels << [1025, 450, "A* Search"] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78012,22 +84955,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_buttons~ +** Processing line: ~ def render_dijkstra~ - Inside source: true *** True Line Result - def render_buttons -** Processing line: ~ render_left_button~ + def render_dijkstra +** Processing line: ~ render_dijkstra_grid~ - Inside source: true *** True Line Result - render_left_button -** Processing line: ~ render_center_button~ + render_dijkstra_grid +** Processing line: ~ render_dijkstra_star~ - Inside source: true *** True Line Result - render_center_button -** Processing line: ~ render_right_button~ + render_dijkstra_star +** Processing line: ~ render_dijkstra_target~ - Inside source: true *** True Line Result - render_right_button + render_dijkstra_target +** Processing line: ~ render_dijkstra_visited~ +- Inside source: true +*** True Line Result + render_dijkstra_visited +** Processing line: ~ render_dijkstra_walls~ +- Inside source: true +*** True Line Result + render_dijkstra_walls +** Processing line: ~ render_dijkstra_path~ +- Inside source: true +*** True Line Result + render_dijkstra_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78036,38 +84991,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_bfs~ -- Inside source: true -*** True Line Result - def render_bfs -** Processing line: ~ render_bfs_grid~ +** Processing line: ~ def render_greedy~ - Inside source: true *** True Line Result - render_bfs_grid -** Processing line: ~ render_bfs_star~ + def render_greedy +** Processing line: ~ render_greedy_grid~ - Inside source: true *** True Line Result - render_bfs_star -** Processing line: ~ render_bfs_target~ + render_greedy_grid +** Processing line: ~ render_greedy_star~ - Inside source: true *** True Line Result - render_bfs_target -** Processing line: ~ render_bfs_visited~ + render_greedy_star +** Processing line: ~ render_greedy_target~ - Inside source: true *** True Line Result - render_bfs_visited -** Processing line: ~ render_bfs_walls~ + render_greedy_target +** Processing line: ~ render_greedy_visited~ - Inside source: true *** True Line Result - render_bfs_walls -** Processing line: ~ render_bfs_frontier~ + render_greedy_visited +** Processing line: ~ render_greedy_walls~ - Inside source: true *** True Line Result - render_bfs_frontier -** Processing line: ~ render_bfs_path~ + render_greedy_walls +** Processing line: ~ render_greedy_path~ - Inside source: true *** True Line Result - render_bfs_path + render_greedy_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78076,38 +85027,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_heuristic~ -- Inside source: true -*** True Line Result - def render_heuristic -** Processing line: ~ render_heuristic_grid~ +** Processing line: ~ def render_a_star~ - Inside source: true *** True Line Result - render_heuristic_grid -** Processing line: ~ render_heuristic_star~ + def render_a_star +** Processing line: ~ render_a_star_grid~ - Inside source: true *** True Line Result - render_heuristic_star -** Processing line: ~ render_heuristic_target~ + render_a_star_grid +** Processing line: ~ render_a_star_star~ - Inside source: true *** True Line Result - render_heuristic_target -** Processing line: ~ render_heuristic_visited~ + render_a_star_star +** Processing line: ~ render_a_star_target~ - Inside source: true *** True Line Result - render_heuristic_visited -** Processing line: ~ render_heuristic_walls~ + render_a_star_target +** Processing line: ~ render_a_star_visited~ - Inside source: true *** True Line Result - render_heuristic_walls -** Processing line: ~ render_heuristic_frontier~ + render_a_star_visited +** Processing line: ~ render_a_star_walls~ - Inside source: true *** True Line Result - render_heuristic_frontier -** Processing line: ~ render_heuristic_path~ + render_a_star_walls +** Processing line: ~ render_a_star_path~ - Inside source: true *** True Line Result - render_heuristic_path + render_a_star_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78124,18 +85071,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def input -** Processing line: ~ # Check and handle button input~ -- Inside source: true -*** True Line Result - # Check and handle button input -** Processing line: ~ input_buttons~ -- Inside source: true -*** True Line Result - input_buttons -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # If the mouse was lifted this tick~ - Inside source: true *** True Line Result @@ -78212,234 +85147,198 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def determine_input -** Processing line: ~ if mouse_over_slider?~ -- Inside source: true -*** True Line Result - if mouse_over_slider? -** Processing line: ~ state.user_input = :slider~ -- Inside source: true -*** True Line Result - state.user_input = :slider ** Processing line: ~ # If the mouse is over the star in the first grid~ - Inside source: true *** True Line Result # If the mouse is over the star in the first grid -** Processing line: ~ elsif bfs_mouse_over_star?~ +** Processing line: ~ if dijkstra_mouse_over_star?~ - Inside source: true *** True Line Result - elsif bfs_mouse_over_star? + if dijkstra_mouse_over_star? ** Processing line: ~ # The user is editing the star from the first grid~ - Inside source: true *** True Line Result # The user is editing the star from the first grid -** Processing line: ~ state.user_input = :bfs_star~ +** Processing line: ~ state.user_input = :dijkstra_star~ - Inside source: true *** True Line Result - state.user_input = :bfs_star + state.user_input = :dijkstra_star ** Processing line: ~ # If the mouse is over the star in the second grid~ - Inside source: true *** True Line Result # If the mouse is over the star in the second grid -** Processing line: ~ elsif heuristic_mouse_over_star?~ +** Processing line: ~ elsif greedy_mouse_over_star?~ - Inside source: true *** True Line Result - elsif heuristic_mouse_over_star? + elsif greedy_mouse_over_star? ** Processing line: ~ # The user is editing the star from the second grid~ - Inside source: true *** True Line Result # The user is editing the star from the second grid -** Processing line: ~ state.user_input = :heuristic_star~ -- Inside source: true -*** True Line Result - state.user_input = :heuristic_star -** Processing line: ~ # If the mouse is over the target in the first grid~ -- Inside source: true -*** True Line Result - # If the mouse is over the target in the first grid -** Processing line: ~ elsif bfs_mouse_over_target?~ -- Inside source: true -*** True Line Result - elsif bfs_mouse_over_target? -** Processing line: ~ # The user is editing the target from the first grid~ -- Inside source: true -*** True Line Result - # The user is editing the target from the first grid -** Processing line: ~ state.user_input = :bfs_target~ -- Inside source: true -*** True Line Result - state.user_input = :bfs_target -** Processing line: ~ # If the mouse is over the target in the second grid~ -- Inside source: true -*** True Line Result - # If the mouse is over the target in the second grid -** Processing line: ~ elsif heuristic_mouse_over_target?~ -- Inside source: true -*** True Line Result - elsif heuristic_mouse_over_target? -** Processing line: ~ # The user is editing the target from the second grid~ +** Processing line: ~ state.user_input = :greedy_star~ - Inside source: true *** True Line Result - # The user is editing the target from the second grid -** Processing line: ~ state.user_input = :heuristic_target~ + state.user_input = :greedy_star +** Processing line: ~ # If the mouse is over the star in the third grid~ - Inside source: true *** True Line Result - state.user_input = :heuristic_target -** Processing line: ~ # If the mouse is over a wall in the first grid~ + # If the mouse is over the star in the third grid +** Processing line: ~ elsif a_star_mouse_over_star?~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the first grid -** Processing line: ~ elsif bfs_mouse_over_wall?~ + elsif a_star_mouse_over_star? +** Processing line: ~ # The user is editing the star from the third grid~ - Inside source: true *** True Line Result - elsif bfs_mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the first grid~ + # The user is editing the star from the third grid +** Processing line: ~ state.user_input = :a_star_star~ - Inside source: true *** True Line Result - # The user is removing a wall from the first grid -** Processing line: ~ state.user_input = :bfs_remove_wall~ + state.user_input = :a_star_star +** Processing line: ~ # If the mouse is over the target in the first grid~ - Inside source: true *** True Line Result - state.user_input = :bfs_remove_wall -** Processing line: ~ # If the mouse is over a wall in the second grid~ + # If the mouse is over the target in the first grid +** Processing line: ~ elsif dijkstra_mouse_over_target?~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the second grid -** Processing line: ~ elsif heuristic_mouse_over_wall?~ + elsif dijkstra_mouse_over_target? +** Processing line: ~ # The user is editing the target from the first grid~ - Inside source: true *** True Line Result - elsif heuristic_mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the second grid~ + # The user is editing the target from the first grid +** Processing line: ~ state.user_input = :dijkstra_target~ - Inside source: true *** True Line Result - # The user is removing a wall from the second grid -** Processing line: ~ state.user_input = :heuristic_remove_wall~ + state.user_input = :dijkstra_target +** Processing line: ~ # If the mouse is over the target in the second grid~ - Inside source: true *** True Line Result - state.user_input = :heuristic_remove_wall -** Processing line: ~ # If the mouse is over the first grid~ + # If the mouse is over the target in the second grid +** Processing line: ~ elsif greedy_mouse_over_target?~ - Inside source: true *** True Line Result - # If the mouse is over the first grid -** Processing line: ~ elsif bfs_mouse_over_grid?~ + elsif greedy_mouse_over_target? +** Processing line: ~ # The user is editing the target from the second grid~ - Inside source: true *** True Line Result - elsif bfs_mouse_over_grid? -** Processing line: ~ # The user is adding a wall from the first grid~ + # The user is editing the target from the second grid +** Processing line: ~ state.user_input = :greedy_target~ - Inside source: true *** True Line Result - # The user is adding a wall from the first grid -** Processing line: ~ state.user_input = :bfs_add_wall~ + state.user_input = :greedy_target +** Processing line: ~ # If the mouse is over the target in the third grid~ - Inside source: true *** True Line Result - state.user_input = :bfs_add_wall -** Processing line: ~ # If the mouse is over the second grid~ + # If the mouse is over the target in the third grid +** Processing line: ~ elsif a_star_mouse_over_target?~ - Inside source: true *** True Line Result - # If the mouse is over the second grid -** Processing line: ~ elsif heuristic_mouse_over_grid?~ + elsif a_star_mouse_over_target? +** Processing line: ~ # The user is editing the target from the third grid~ - Inside source: true *** True Line Result - elsif heuristic_mouse_over_grid? -** Processing line: ~ # The user is adding a wall from the second grid~ + # The user is editing the target from the third grid +** Processing line: ~ state.user_input = :a_star_target~ - Inside source: true *** True Line Result - # The user is adding a wall from the second grid -** Processing line: ~ state.user_input = :heuristic_add_wall~ + state.user_input = :a_star_target +** Processing line: ~ # If the mouse is over a wall in the first grid~ - Inside source: true *** True Line Result - state.user_input = :heuristic_add_wall -** Processing line: ~ end~ + # If the mouse is over a wall in the first grid +** Processing line: ~ elsif dijkstra_mouse_over_wall?~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + elsif dijkstra_mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the first grid~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # The user is removing a wall from the first grid +** Processing line: ~ state.user_input = :dijkstra_remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ + state.user_input = :dijkstra_remove_wall +** Processing line: ~ # If the mouse is over a wall in the second grid~ - Inside source: true *** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_input~ + # If the mouse is over a wall in the second grid +** Processing line: ~ elsif greedy_mouse_over_wall?~ - Inside source: true *** True Line Result - def process_input -** Processing line: ~ if state.user_input == :slider~ + elsif greedy_mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the second grid~ - Inside source: true *** True Line Result - if state.user_input == :slider -** Processing line: ~ process_input_slider~ + # The user is removing a wall from the second grid +** Processing line: ~ state.user_input = :greedy_remove_wall~ - Inside source: true *** True Line Result - process_input_slider -** Processing line: ~ elsif state.user_input == :bfs_star~ + state.user_input = :greedy_remove_wall +** Processing line: ~ # If the mouse is over a wall in the third grid~ - Inside source: true *** True Line Result - elsif state.user_input == :bfs_star -** Processing line: ~ process_input_bfs_star~ + # If the mouse is over a wall in the third grid +** Processing line: ~ elsif a_star_mouse_over_wall?~ - Inside source: true *** True Line Result - process_input_bfs_star -** Processing line: ~ elsif state.user_input == :heuristic_star~ + elsif a_star_mouse_over_wall? +** Processing line: ~ # The user is removing a wall from the third grid~ - Inside source: true *** True Line Result - elsif state.user_input == :heuristic_star -** Processing line: ~ process_input_heuristic_star~ + # The user is removing a wall from the third grid +** Processing line: ~ state.user_input = :a_star_remove_wall~ - Inside source: true *** True Line Result - process_input_heuristic_star -** Processing line: ~ elsif state.user_input == :bfs_target~ + state.user_input = :a_star_remove_wall +** Processing line: ~ # If the mouse is over the first grid~ - Inside source: true *** True Line Result - elsif state.user_input == :bfs_target -** Processing line: ~ process_input_bfs_target~ + # If the mouse is over the first grid +** Processing line: ~ elsif dijkstra_mouse_over_grid?~ - Inside source: true *** True Line Result - process_input_bfs_target -** Processing line: ~ elsif state.user_input == :heuristic_target~ + elsif dijkstra_mouse_over_grid? +** Processing line: ~ # The user is adding a wall from the first grid~ - Inside source: true *** True Line Result - elsif state.user_input == :heuristic_target -** Processing line: ~ process_input_heuristic_target~ + # The user is adding a wall from the first grid +** Processing line: ~ state.user_input = :dijkstra_add_wall~ - Inside source: true *** True Line Result - process_input_heuristic_target -** Processing line: ~ elsif state.user_input == :bfs_remove_wall~ + state.user_input = :dijkstra_add_wall +** Processing line: ~ # If the mouse is over the second grid~ - Inside source: true *** True Line Result - elsif state.user_input == :bfs_remove_wall -** Processing line: ~ process_input_bfs_remove_wall~ + # If the mouse is over the second grid +** Processing line: ~ elsif greedy_mouse_over_grid?~ - Inside source: true *** True Line Result - process_input_bfs_remove_wall -** Processing line: ~ elsif state.user_input == :heuristic_remove_wall~ + elsif greedy_mouse_over_grid? +** Processing line: ~ # The user is adding a wall from the second grid~ - Inside source: true *** True Line Result - elsif state.user_input == :heuristic_remove_wall -** Processing line: ~ process_input_heuristic_remove_wall~ + # The user is adding a wall from the second grid +** Processing line: ~ state.user_input = :greedy_add_wall~ - Inside source: true *** True Line Result - process_input_heuristic_remove_wall -** Processing line: ~ elsif state.user_input == :bfs_add_wall~ + state.user_input = :greedy_add_wall +** Processing line: ~ # If the mouse is over the third grid~ - Inside source: true *** True Line Result - elsif state.user_input == :bfs_add_wall -** Processing line: ~ process_input_bfs_add_wall~ + # If the mouse is over the third grid +** Processing line: ~ elsif a_star_mouse_over_grid?~ - Inside source: true *** True Line Result - process_input_bfs_add_wall -** Processing line: ~ elsif state.user_input == :heuristic_add_wall~ + elsif a_star_mouse_over_grid? +** Processing line: ~ # The user is adding a wall from the third grid~ - Inside source: true *** True Line Result - elsif state.user_input == :heuristic_add_wall -** Processing line: ~ process_input_heuristic_add_wall~ + # The user is adding a wall from the third grid +** Processing line: ~ state.user_input = :a_star_add_wall~ - Inside source: true *** True Line Result - process_input_heuristic_add_wall + state.user_input = :a_star_add_wall ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78452,194 +85351,114 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_slider~ -- Inside source: true -*** True Line Result - def render_slider -** Processing line: ~ # Using primitives hides the line under the white circle of the slider~ -- Inside source: true -*** True Line Result - # Using primitives hides the line under the white circle of the slider -** Processing line: ~ # Draws the line~ -- Inside source: true -*** True Line Result - # Draws the line -** Processing line: ~ outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line~ -- Inside source: true -*** True Line Result - outputs.primitives << [slider.x, slider.y, slider.x + slider.w, slider.y].line -** Processing line: ~ # The circle needs to be offset so that the center of the circle~ -- Inside source: true -*** True Line Result - # The circle needs to be offset so that the center of the circle -** Processing line: ~ # overlaps the line instead of the upper right corner of the circle~ -- Inside source: true -*** True Line Result - # overlaps the line instead of the upper right corner of the circle -** Processing line: ~ # The circle's x value is also moved based on the current seach step~ -- Inside source: true -*** True Line Result - # The circle's x value is also moved based on the current seach step -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing)~ -- Inside source: true -*** True Line Result - circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ -- Inside source: true -*** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ -- Inside source: true -*** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ outputs.primitives << [circle_rect, 'circle-white.png'].sprite~ -- Inside source: true -*** True Line Result - outputs.primitives << [circle_rect, 'circle-white.png'].sprite -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def render_labels~ -- Inside source: true -*** True Line Result - def render_labels -** Processing line: ~ outputs.labels << [205, 625, "Breadth First Search"]~ -- Inside source: true -*** True Line Result - outputs.labels << [205, 625, "Breadth First Search"] -** Processing line: ~ outputs.labels << [820, 625, "Heuristic Best-First Search"]~ -- Inside source: true -*** True Line Result - outputs.labels << [820, 625, "Heuristic Best-First Search"] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def render_left_button~ -- Inside source: true -*** True Line Result - def render_left_button -** Processing line: ~ # Draws the button_color button, and a black border~ -- Inside source: true -*** True Line Result - # Draws the button_color button, and a black border -** Processing line: ~ # The border separates the buttons visually~ +** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.left, button_color]~ + # Processes click and drag based on what the user is currently dragging +** Processing line: ~ def process_input~ - Inside source: true *** True Line Result - outputs.solids << [buttons.left, button_color] -** Processing line: ~ outputs.borders << [buttons.left]~ + def process_input +** Processing line: ~ if state.user_input == :dijkstra_star~ - Inside source: true *** True Line Result - outputs.borders << [buttons.left] -** Processing line: ~~ + if state.user_input == :dijkstra_star +** Processing line: ~ process_input_dijkstra_star~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders an explanatory label in the center of the button~ + process_input_dijkstra_star +** Processing line: ~ elsif state.user_input == :greedy_star~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + elsif state.user_input == :greedy_star +** Processing line: ~ process_input_greedy_star~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ + process_input_greedy_star +** Processing line: ~ elsif state.user_input == :a_star_star~ - Inside source: true *** True Line Result - # If the button size is changed, the label might need to be edited as well -** Processing line: ~ # to keep the label in the center of the button~ + elsif state.user_input == :a_star_star +** Processing line: ~ process_input_a_star_star~ - Inside source: true *** True Line Result - # to keep the label in the center of the button -** Processing line: ~ label_x = buttons.left.x + 20~ + process_input_a_star_star +** Processing line: ~ elsif state.user_input == :dijkstra_target~ - Inside source: true *** True Line Result - label_x = buttons.left.x + 20 -** Processing line: ~ label_y = buttons.left.y + 35~ + elsif state.user_input == :dijkstra_target +** Processing line: ~ process_input_dijkstra_target~ - Inside source: true *** True Line Result - label_y = buttons.left.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, "<"]~ + process_input_dijkstra_target +** Processing line: ~ elsif state.user_input == :greedy_target~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, "<"] -** Processing line: ~ end~ + elsif state.user_input == :greedy_target +** Processing line: ~ process_input_greedy_target~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + process_input_greedy_target +** Processing line: ~ elsif state.user_input == :a_star_target~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_center_button~ + elsif state.user_input == :a_star_target +** Processing line: ~ process_input_a_star_target~ - Inside source: true *** True Line Result - def render_center_button -** Processing line: ~ # Draws the button_color button, and a black border~ + process_input_a_star_target +** Processing line: ~ elsif state.user_input == :dijkstra_remove_wall~ - Inside source: true *** True Line Result - # Draws the button_color button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + elsif state.user_input == :dijkstra_remove_wall +** Processing line: ~ process_input_dijkstra_remove_wall~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.center, button_color]~ + process_input_dijkstra_remove_wall +** Processing line: ~ elsif state.user_input == :greedy_remove_wall~ - Inside source: true *** True Line Result - outputs.solids << [buttons.center, button_color] -** Processing line: ~ outputs.borders << [buttons.center]~ + elsif state.user_input == :greedy_remove_wall +** Processing line: ~ process_input_greedy_remove_wall~ - Inside source: true *** True Line Result - outputs.borders << [buttons.center] -** Processing line: ~~ + process_input_greedy_remove_wall +** Processing line: ~ elsif state.user_input == :a_star_remove_wall~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders an explanatory label in the center of the button~ + elsif state.user_input == :a_star_remove_wall +** Processing line: ~ process_input_a_star_remove_wall~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + process_input_a_star_remove_wall +** Processing line: ~ elsif state.user_input == :dijkstra_add_wall~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ # If the button size is changed, the label might need to be edited as well~ + elsif state.user_input == :dijkstra_add_wall +** Processing line: ~ process_input_dijkstra_add_wall~ - Inside source: true *** True Line Result - # If the button size is changed, the label might need to be edited as well -** Processing line: ~ # to keep the label in the center of the button~ + process_input_dijkstra_add_wall +** Processing line: ~ elsif state.user_input == :greedy_add_wall~ - Inside source: true *** True Line Result - # to keep the label in the center of the button -** Processing line: ~ label_x = buttons.center.x + 37~ + elsif state.user_input == :greedy_add_wall +** Processing line: ~ process_input_greedy_add_wall~ - Inside source: true *** True Line Result - label_x = buttons.center.x + 37 -** Processing line: ~ label_y = buttons.center.y + 35~ + process_input_greedy_add_wall +** Processing line: ~ elsif state.user_input == :a_star_add_wall~ - Inside source: true *** True Line Result - label_y = buttons.center.y + 35 -** Processing line: ~ label_text = state.play ? "Pause Animation" : "Play Animation"~ + elsif state.user_input == :a_star_add_wall +** Processing line: ~ process_input_a_star_add_wall~ - Inside source: true *** True Line Result - label_text = state.play ? "Pause Animation" : "Play Animation" -** Processing line: ~ outputs.labels << [label_x, label_y, label_text]~ + process_input_a_star_add_wall +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, label_text] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78648,50 +85467,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_right_button~ +** Processing line: ~ def render_dijkstra_grid~ - Inside source: true *** True Line Result - def render_right_button -** Processing line: ~ # Draws the button_color button, and a black border~ + def render_dijkstra_grid +** Processing line: ~ # A large rect the size of the grid~ - Inside source: true *** True Line Result - # Draws the button_color button, and a black border -** Processing line: ~ # The border separates the buttons visually~ + # A large rect the size of the grid +** Processing line: ~ outputs.solids << [dijkstra_scale_up(grid.rect), default_color]~ - Inside source: true *** True Line Result - # The border separates the buttons visually -** Processing line: ~ outputs.solids << [buttons.right, button_color]~ + outputs.solids << [dijkstra_scale_up(grid.rect), default_color] +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.solids << [buttons.right, button_color] -** Processing line: ~ outputs.borders << [buttons.right]~ + +** Processing line: ~ # The vertical grid lines~ - Inside source: true *** True Line Result - outputs.borders << [buttons.right] -** Processing line: ~~ + # The vertical grid lines +** Processing line: ~ for x in 0..grid.width~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders an explanatory label in the center of the button~ + for x in 0..grid.width +** Processing line: ~ outputs.lines << dijkstra_vertical_line(x)~ - Inside source: true *** True Line Result - # Renders an explanatory label in the center of the button -** Processing line: ~ # Explains to the user what the button does~ + outputs.lines << dijkstra_vertical_line(x) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Explains to the user what the button does -** Processing line: ~ label_x = buttons.right.x + 20~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - label_x = buttons.right.x + 20 -** Processing line: ~ label_y = buttons.right.y + 35~ + +** Processing line: ~ # The horizontal grid lines~ - Inside source: true *** True Line Result - label_y = buttons.right.y + 35 -** Processing line: ~ outputs.labels << [label_x, label_y, ">"]~ + # The horizontal grid lines +** Processing line: ~ for y in 0..grid.height~ - Inside source: true *** True Line Result - outputs.labels << [label_x, label_y, ">"] + for y in 0..grid.height +** Processing line: ~ outputs.lines << dijkstra_horizontal_line(y)~ +- Inside source: true +*** True Line Result + outputs.lines << dijkstra_horizontal_line(y) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78700,18 +85527,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_bfs_grid~ +** Processing line: ~ def render_greedy_grid~ - Inside source: true *** True Line Result - def render_bfs_grid + def render_greedy_grid ** Processing line: ~ # A large rect the size of the grid~ - Inside source: true *** True Line Result # A large rect the size of the grid -** Processing line: ~ outputs.solids << [bfs_scale_up(grid.rect), default_color]~ +** Processing line: ~ outputs.solids << [greedy_scale_up(grid.rect), default_color]~ - Inside source: true *** True Line Result - outputs.solids << [bfs_scale_up(grid.rect), default_color] + outputs.solids << [greedy_scale_up(grid.rect), default_color] ** Processing line: ~~ - Inside source: true *** True Line Result @@ -78724,10 +85551,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for x in 0..grid.width -** Processing line: ~ outputs.lines << bfs_vertical_line(x)~ +** Processing line: ~ outputs.lines << greedy_vertical_line(x)~ - Inside source: true *** True Line Result - outputs.lines << bfs_vertical_line(x) + outputs.lines << greedy_vertical_line(x) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78744,10 +85571,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for y in 0..grid.height -** Processing line: ~ outputs.lines << bfs_horizontal_line(y)~ +** Processing line: ~ outputs.lines << greedy_horizontal_line(y)~ - Inside source: true *** True Line Result - outputs.lines << bfs_horizontal_line(y) + outputs.lines << greedy_horizontal_line(y) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78760,18 +85587,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_heuristic_grid~ +** Processing line: ~ def render_a_star_grid~ - Inside source: true *** True Line Result - def render_heuristic_grid + def render_a_star_grid ** Processing line: ~ # A large rect the size of the grid~ - Inside source: true *** True Line Result # A large rect the size of the grid -** Processing line: ~ outputs.solids << [heuristic_scale_up(grid.rect), default_color]~ +** Processing line: ~ outputs.solids << [a_star_scale_up(grid.rect), default_color]~ - Inside source: true *** True Line Result - outputs.solids << [heuristic_scale_up(grid.rect), default_color] + outputs.solids << [a_star_scale_up(grid.rect), default_color] ** Processing line: ~~ - Inside source: true *** True Line Result @@ -78784,10 +85611,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for x in 0..grid.width -** Processing line: ~ outputs.lines << heuristic_vertical_line(x)~ +** Processing line: ~ outputs.lines << a_star_vertical_line(x)~ - Inside source: true *** True Line Result - outputs.lines << heuristic_vertical_line(x) + outputs.lines << a_star_vertical_line(x) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78804,10 +85631,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result for y in 0..grid.height -** Processing line: ~ outputs.lines << heuristic_horizontal_line(y)~ +** Processing line: ~ outputs.lines << a_star_horizontal_line(y)~ - Inside source: true *** True Line Result - outputs.lines << heuristic_horizontal_line(y) + outputs.lines << a_star_horizontal_line(y) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78824,14 +85651,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Returns a vertical line for a column of the first grid -** Processing line: ~ def bfs_vertical_line column~ +** Processing line: ~ def dijkstra_vertical_line column~ - Inside source: true *** True Line Result - def bfs_vertical_line column -** Processing line: ~ bfs_scale_up([column, 0, column, grid.height])~ + def dijkstra_vertical_line column +** Processing line: ~ dijkstra_scale_up([column, 0, column, grid.height])~ - Inside source: true *** True Line Result - bfs_scale_up([column, 0, column, grid.height]) + dijkstra_scale_up([column, 0, column, grid.height]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78844,14 +85671,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Returns a horizontal line for a column of the first grid -** Processing line: ~ def bfs_horizontal_line row~ +** Processing line: ~ def dijkstra_horizontal_line row~ - Inside source: true *** True Line Result - def bfs_horizontal_line row -** Processing line: ~ bfs_scale_up([0, row, grid.width, row])~ + def dijkstra_horizontal_line row +** Processing line: ~ dijkstra_scale_up([0, row, grid.width, row])~ - Inside source: true *** True Line Result - bfs_scale_up([0, row, grid.width, row]) + dijkstra_scale_up([0, row, grid.width, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78864,14 +85691,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Returns a vertical line for a column of the second grid -** Processing line: ~ def heuristic_vertical_line column~ +** Processing line: ~ def greedy_vertical_line column~ - Inside source: true *** True Line Result - def heuristic_vertical_line column -** Processing line: ~ bfs_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ + def greedy_vertical_line column +** Processing line: ~ dijkstra_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ - Inside source: true *** True Line Result - bfs_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) + dijkstra_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78884,14 +85711,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Returns a horizontal line for a column of the second grid -** Processing line: ~ def heuristic_horizontal_line row~ +** Processing line: ~ def greedy_horizontal_line row~ - Inside source: true *** True Line Result - def heuristic_horizontal_line row -** Processing line: ~ bfs_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ + def greedy_horizontal_line row +** Processing line: ~ dijkstra_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ - Inside source: true *** True Line Result - bfs_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) + dijkstra_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Returns a vertical line for a column of the third grid~ +- Inside source: true +*** True Line Result + # Returns a vertical line for a column of the third grid +** Processing line: ~ def a_star_vertical_line column~ +- Inside source: true +*** True Line Result + def a_star_vertical_line column +** Processing line: ~ dijkstra_scale_up([column + (grid.width * 2) + 2, 0, column + (grid.width * 2) + 2, grid.height])~ +- Inside source: true +*** True Line Result + dijkstra_scale_up([column + (grid.width * 2) + 2, 0, column + (grid.width * 2) + 2, grid.height]) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Returns a horizontal line for a column of the third grid~ +- Inside source: true +*** True Line Result + # Returns a horizontal line for a column of the third grid +** Processing line: ~ def a_star_horizontal_line row~ +- Inside source: true +*** True Line Result + def a_star_horizontal_line row +** Processing line: ~ dijkstra_scale_up([(grid.width * 2) + 2, row, (grid.width * 2) + grid.width + 2, row])~ +- Inside source: true +*** True Line Result + dijkstra_scale_up([(grid.width * 2) + 2, row, (grid.width * 2) + grid.width + 2, row]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78904,14 +85771,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the star on the first grid -** Processing line: ~ def render_bfs_star~ +** Processing line: ~ def render_dijkstra_star~ - Inside source: true *** True Line Result - def render_bfs_star -** Processing line: ~ outputs.sprites << [bfs_scale_up(grid.star), 'star.png']~ + def render_dijkstra_star +** Processing line: ~ outputs.sprites << [dijkstra_scale_up(grid.star), 'star.png']~ - Inside source: true *** True Line Result - outputs.sprites << [bfs_scale_up(grid.star), 'star.png'] + outputs.sprites << [dijkstra_scale_up(grid.star), 'star.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78924,14 +85791,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the star on the second grid -** Processing line: ~ def render_heuristic_star~ +** Processing line: ~ def render_greedy_star~ - Inside source: true *** True Line Result - def render_heuristic_star -** Processing line: ~ outputs.sprites << [heuristic_scale_up(grid.star), 'star.png']~ + def render_greedy_star +** Processing line: ~ outputs.sprites << [greedy_scale_up(grid.star), 'star.png']~ - Inside source: true *** True Line Result - outputs.sprites << [heuristic_scale_up(grid.star), 'star.png'] + outputs.sprites << [greedy_scale_up(grid.star), 'star.png'] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Renders the star on the third grid~ +- Inside source: true +*** True Line Result + # Renders the star on the third grid +** Processing line: ~ def render_a_star_star~ +- Inside source: true +*** True Line Result + def render_a_star_star +** Processing line: ~ outputs.sprites << [a_star_scale_up(grid.star), 'star.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [a_star_scale_up(grid.star), 'star.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78944,14 +85831,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the target on the first grid -** Processing line: ~ def render_bfs_target~ +** Processing line: ~ def render_dijkstra_target~ - Inside source: true *** True Line Result - def render_bfs_target -** Processing line: ~ outputs.sprites << [bfs_scale_up(grid.target), 'target.png']~ + def render_dijkstra_target +** Processing line: ~ outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png']~ - Inside source: true *** True Line Result - outputs.sprites << [bfs_scale_up(grid.target), 'target.png'] + outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78964,14 +85851,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the target on the second grid -** Processing line: ~ def render_heuristic_target~ +** Processing line: ~ def render_greedy_target~ - Inside source: true *** True Line Result - def render_heuristic_target -** Processing line: ~ outputs.sprites << [heuristic_scale_up(grid.target), 'target.png']~ + def render_greedy_target +** Processing line: ~ outputs.sprites << [greedy_scale_up(grid.target), 'target.png']~ - Inside source: true *** True Line Result - outputs.sprites << [heuristic_scale_up(grid.target), 'target.png'] + outputs.sprites << [greedy_scale_up(grid.target), 'target.png'] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Renders the target on the third grid~ +- Inside source: true +*** True Line Result + # Renders the target on the third grid +** Processing line: ~ def render_a_star_target~ +- Inside source: true +*** True Line Result + def render_a_star_target +** Processing line: ~ outputs.sprites << [a_star_scale_up(grid.target), 'target.png']~ +- Inside source: true +*** True Line Result + outputs.sprites << [a_star_scale_up(grid.target), 'target.png'] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -78984,18 +85891,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the walls on the first grid -** Processing line: ~ def render_bfs_walls~ +** Processing line: ~ def render_dijkstra_walls~ - Inside source: true *** True Line Result - def render_bfs_walls + def render_dijkstra_walls ** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result grid.walls.each_key do | wall | -** Processing line: ~ outputs.solids << [bfs_scale_up(wall), wall_color]~ +** Processing line: ~ outputs.solids << [dijkstra_scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - outputs.solids << [bfs_scale_up(wall), wall_color] + outputs.solids << [dijkstra_scale_up(wall), wall_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79012,18 +85919,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the walls on the second grid -** Processing line: ~ def render_heuristic_walls~ +** Processing line: ~ def render_greedy_walls~ - Inside source: true *** True Line Result - def render_heuristic_walls + def render_greedy_walls ** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result grid.walls.each_key do | wall | -** Processing line: ~ outputs.solids << [heuristic_scale_up(wall), wall_color]~ +** Processing line: ~ outputs.solids << [greedy_scale_up(wall), wall_color]~ - Inside source: true *** True Line Result - outputs.solids << [heuristic_scale_up(wall), wall_color] + outputs.solids << [greedy_scale_up(wall), wall_color] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # Renders the walls on the third grid~ +- Inside source: true +*** True Line Result + # Renders the walls on the third grid +** Processing line: ~ def render_a_star_walls~ +- Inside source: true +*** True Line Result + def render_a_star_walls +** Processing line: ~ grid.walls.each_key do | wall |~ +- Inside source: true +*** True Line Result + grid.walls.each_key do | wall | +** Processing line: ~ outputs.solids << [a_star_scale_up(wall), wall_color]~ +- Inside source: true +*** True Line Result + outputs.solids << [a_star_scale_up(wall), wall_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79040,18 +85975,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the visited cells on the first grid -** Processing line: ~ def render_bfs_visited~ +** Processing line: ~ def render_dijkstra_visited~ - Inside source: true *** True Line Result - def render_bfs_visited -** Processing line: ~ bfs.came_from.each_key do | visited_cell |~ + def render_dijkstra_visited +** Processing line: ~ dijkstra.came_from.each_key do | visited_cell |~ - Inside source: true *** True Line Result - bfs.came_from.each_key do | visited_cell | -** Processing line: ~ outputs.solids << [bfs_scale_up(visited_cell), visited_color]~ + dijkstra.came_from.each_key do | visited_cell | +** Processing line: ~ outputs.solids << [dijkstra_scale_up(visited_cell), visited_color]~ - Inside source: true *** True Line Result - outputs.solids << [bfs_scale_up(visited_cell), visited_color] + outputs.solids << [dijkstra_scale_up(visited_cell), visited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79068,18 +86003,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Renders the visited cells on the second grid -** Processing line: ~ def render_heuristic_visited~ +** Processing line: ~ def render_greedy_visited~ - Inside source: true *** True Line Result - def render_heuristic_visited -** Processing line: ~ heuristic.came_from.each_key do | visited_cell |~ + def render_greedy_visited +** Processing line: ~ greedy.came_from.each_key do | visited_cell |~ - Inside source: true *** True Line Result - heuristic.came_from.each_key do | visited_cell | -** Processing line: ~ outputs.solids << [heuristic_scale_up(visited_cell), visited_color]~ + greedy.came_from.each_key do | visited_cell | +** Processing line: ~ outputs.solids << [greedy_scale_up(visited_cell), visited_color]~ - Inside source: true *** True Line Result - outputs.solids << [heuristic_scale_up(visited_cell), visited_color] + outputs.solids << [greedy_scale_up(visited_cell), visited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79092,22 +86027,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the frontier cells on the first grid~ +** Processing line: ~ # Renders the visited cells on the third grid~ - Inside source: true *** True Line Result - # Renders the frontier cells on the first grid -** Processing line: ~ def render_bfs_frontier~ + # Renders the visited cells on the third grid +** Processing line: ~ def render_a_star_visited~ - Inside source: true *** True Line Result - def render_bfs_frontier -** Processing line: ~ bfs.frontier.each do | frontier_cell |~ + def render_a_star_visited +** Processing line: ~ a_star.came_from.each_key do | visited_cell |~ - Inside source: true *** True Line Result - bfs.frontier.each do | frontier_cell | -** Processing line: ~ outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200]~ + a_star.came_from.each_key do | visited_cell | +** Processing line: ~ outputs.solids << [a_star_scale_up(visited_cell), visited_color]~ - Inside source: true *** True Line Result - outputs.solids << [bfs_scale_up(frontier_cell), frontier_color, 200] + outputs.solids << [a_star_scale_up(visited_cell), visited_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79120,22 +86055,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the frontier cells on the second grid~ +** Processing line: ~ # Renders the path found by the breadth first search on the first grid~ - Inside source: true *** True Line Result - # Renders the frontier cells on the second grid -** Processing line: ~ def render_heuristic_frontier~ + # Renders the path found by the breadth first search on the first grid +** Processing line: ~ def render_dijkstra_path~ - Inside source: true *** True Line Result - def render_heuristic_frontier -** Processing line: ~ heuristic.frontier.each do | frontier_cell |~ + def render_dijkstra_path +** Processing line: ~ dijkstra.path.each do | path |~ - Inside source: true *** True Line Result - heuristic.frontier.each do | frontier_cell | -** Processing line: ~ outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200]~ + dijkstra.path.each do | path | +** Processing line: ~ outputs.solids << [dijkstra_scale_up(path), path_color]~ - Inside source: true *** True Line Result - outputs.solids << [heuristic_scale_up(frontier_cell), frontier_color, 200] + outputs.solids << [dijkstra_scale_up(path), path_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79148,22 +86083,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the path found by the breadth first search on the first grid~ +** Processing line: ~ # Renders the path found by the greedy search on the second grid~ - Inside source: true *** True Line Result - # Renders the path found by the breadth first search on the first grid -** Processing line: ~ def render_bfs_path~ + # Renders the path found by the greedy search on the second grid +** Processing line: ~ def render_greedy_path~ - Inside source: true *** True Line Result - def render_bfs_path -** Processing line: ~ bfs.path.each do | path |~ + def render_greedy_path +** Processing line: ~ greedy.path.each do | path |~ - Inside source: true *** True Line Result - bfs.path.each do | path | -** Processing line: ~ outputs.solids << [bfs_scale_up(path), path_color]~ + greedy.path.each do | path | +** Processing line: ~ outputs.solids << [greedy_scale_up(path), path_color]~ - Inside source: true *** True Line Result - outputs.solids << [bfs_scale_up(path), path_color] + outputs.solids << [greedy_scale_up(path), path_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79176,22 +86111,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Renders the path found by the heuristic search on the second grid~ +** Processing line: ~ # Renders the path found by the a_star search on the third grid~ - Inside source: true *** True Line Result - # Renders the path found by the heuristic search on the second grid -** Processing line: ~ def render_heuristic_path~ + # Renders the path found by the a_star search on the third grid +** Processing line: ~ def render_a_star_path~ - Inside source: true *** True Line Result - def render_heuristic_path -** Processing line: ~ heuristic.path.each do | path |~ + def render_a_star_path +** Processing line: ~ a_star.path.each do | path |~ - Inside source: true *** True Line Result - heuristic.path.each do | path | -** Processing line: ~ outputs.solids << [heuristic_scale_up(path), path_color]~ + a_star.path.each do | path | +** Processing line: ~ outputs.solids << [a_star_scale_up(path), path_color]~ - Inside source: true *** True Line Result - outputs.solids << [heuristic_scale_up(path), path_color] + outputs.solids << [a_star_scale_up(path), path_color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79328,10 +86263,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # This method scales up cells for the first grid -** Processing line: ~ def bfs_scale_up(cell)~ +** Processing line: ~ def dijkstra_scale_up(cell)~ - Inside source: true *** True Line Result - def bfs_scale_up(cell) + def dijkstra_scale_up(cell) ** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result @@ -79416,10 +86351,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # so separate methods exist for the grid lines -** Processing line: ~ def heuristic_scale_up(cell)~ +** Processing line: ~ def greedy_scale_up(cell)~ - Inside source: true *** True Line Result - def heuristic_scale_up(cell) + def greedy_scale_up(cell) ** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result @@ -79440,10 +86375,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Proceeds as if scaling up for the first grid -** Processing line: ~ bfs_scale_up(cell)~ +** Processing line: ~ dijkstra_scale_up(cell)~ - Inside source: true *** True Line Result - bfs_scale_up(cell) + dijkstra_scale_up(cell) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79452,70 +86387,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Checks and handles input for the buttons~ -- Inside source: true -*** True Line Result - # Checks and handles input for the buttons -** Processing line: ~ # Called when the mouse is lifted~ -- Inside source: true -*** True Line Result - # Called when the mouse is lifted -** Processing line: ~ def input_buttons~ -- Inside source: true -*** True Line Result - def input_buttons -** Processing line: ~ input_left_button~ +** Processing line: ~ # Translates the given cell (grid.width + 1) * 2 to the right and then scales up~ - Inside source: true *** True Line Result - input_left_button -** Processing line: ~ input_center_button~ + # Translates the given cell (grid.width + 1) * 2 to the right and then scales up +** Processing line: ~ # Used to draw cells for the third grid~ - Inside source: true *** True Line Result - input_center_button -** Processing line: ~ input_right_button~ + # Used to draw cells for the third grid +** Processing line: ~ # This method does not work for lines,~ - Inside source: true *** True Line Result - input_right_button -** Processing line: ~ end~ + # This method does not work for lines, +** Processing line: ~ # so separate methods exist for the grid lines~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # so separate methods exist for the grid lines +** Processing line: ~ def a_star_scale_up(cell)~ - Inside source: true *** True Line Result - -** Processing line: ~ # Checks if the previous step button is clicked~ + def a_star_scale_up(cell) +** Processing line: ~ # Prevents the original value of cell from being edited~ - Inside source: true *** True Line Result - # Checks if the previous step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step backward~ + # Prevents the original value of cell from being edited +** Processing line: ~ cell = cell.clone~ - Inside source: true *** True Line Result - # If it is, it pauses the animation and moves the search one step backward -** Processing line: ~ def input_left_button~ + cell = cell.clone +** Processing line: ~ # Translates the cell to the second grid equivalent~ - Inside source: true *** True Line Result - def input_left_button -** Processing line: ~ if left_button_clicked?~ + # Translates the cell to the second grid equivalent +** Processing line: ~ cell.x += grid.width + 1~ - Inside source: true *** True Line Result - if left_button_clicked? -** Processing line: ~ state.play = false~ + cell.x += grid.width + 1 +** Processing line: ~ # Translates the cell to the third grid equivalent~ - Inside source: true *** True Line Result - state.play = false -** Processing line: ~ state.current_step -= 1~ + # Translates the cell to the third grid equivalent +** Processing line: ~ cell.x += grid.width + 1~ - Inside source: true *** True Line Result - state.current_step -= 1 -** Processing line: ~ recalculate_searches~ + cell.x += grid.width + 1 +** Processing line: ~ # Proceeds as if scaling up for the first grid~ - Inside source: true *** True Line Result - recalculate_searches -** Processing line: ~ end~ + # Proceeds as if scaling up for the first grid +** Processing line: ~ dijkstra_scale_up(cell)~ - Inside source: true *** True Line Result - end + dijkstra_scale_up(cell) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79524,30 +86447,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Controls the play/pause button~ -- Inside source: true -*** True Line Result - # Controls the play/pause button -** Processing line: ~ # Inverses whether the animation is playing or not when clicked~ -- Inside source: true -*** True Line Result - # Inverses whether the animation is playing or not when clicked -** Processing line: ~ def input_center_button~ -- Inside source: true -*** True Line Result - def input_center_button -** Processing line: ~ if center_button_clicked? || inputs.keyboard.key_down.space~ +** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ - Inside source: true *** True Line Result - if center_button_clicked? || inputs.keyboard.key_down.space -** Processing line: ~ state.play = !state.play~ + # Signal that the user is going to be moving the star from the first grid +** Processing line: ~ def dijkstra_mouse_over_star?~ - Inside source: true *** True Line Result - state.play = !state.play -** Processing line: ~ end~ + def dijkstra_mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.star))~ - Inside source: true *** True Line Result - end + inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79556,38 +86467,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Checks if the next step button is clicked~ -- Inside source: true -*** True Line Result - # Checks if the next step button is clicked -** Processing line: ~ # If it is, it pauses the animation and moves the search one step forward~ -- Inside source: true -*** True Line Result - # If it is, it pauses the animation and moves the search one step forward -** Processing line: ~ def input_right_button~ -- Inside source: true -*** True Line Result - def input_right_button -** Processing line: ~ if right_button_clicked?~ -- Inside source: true -*** True Line Result - if right_button_clicked? -** Processing line: ~ state.play = false~ -- Inside source: true -*** True Line Result - state.play = false -** Processing line: ~ state.current_step += 1~ +** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ - Inside source: true *** True Line Result - state.current_step += 1 -** Processing line: ~ move_searches_one_step_forward~ + # Signal that the user is going to be moving the star from the second grid +** Processing line: ~ def greedy_mouse_over_star?~ - Inside source: true *** True Line Result - move_searches_one_step_forward -** Processing line: ~ end~ + def greedy_mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.star))~ - Inside source: true *** True Line Result - end + inputs.mouse.point.inside_rect?(greedy_scale_up(grid.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79596,18 +86487,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # These methods detect when the buttons are clicked~ +** Processing line: ~ # Signal that the user is going to be moving the star from the third grid~ - Inside source: true *** True Line Result - # These methods detect when the buttons are clicked -** Processing line: ~ def left_button_clicked?~ + # Signal that the user is going to be moving the star from the third grid +** Processing line: ~ def a_star_mouse_over_star?~ - Inside source: true *** True Line Result - def left_button_clicked? -** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.left) && inputs.mouse.up~ + def a_star_mouse_over_star? +** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.star))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(buttons.left) && inputs.mouse.up + inputs.mouse.point.inside_rect?(a_star_scale_up(grid.star)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79616,30 +86507,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def center_button_clicked?~ -- Inside source: true -*** True Line Result - def center_button_clicked? -** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.center) && inputs.mouse.up~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(buttons.center) && inputs.mouse.up -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ +** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def right_button_clicked?~ + # Signal that the user is going to be moving the target from the first grid +** Processing line: ~ def dijkstra_mouse_over_target?~ - Inside source: true *** True Line Result - def right_button_clicked? -** Processing line: ~ inputs.mouse.point.inside_rect?(buttons.right) && inputs.mouse.up~ + def dijkstra_mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.target))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(buttons.right) && inputs.mouse.up + inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79648,38 +86527,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the slider~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the slider -** Processing line: ~ # Is the mouse over the circle of the slider?~ -- Inside source: true -*** True Line Result - # Is the mouse over the circle of the slider? -** Processing line: ~ def mouse_over_slider?~ -- Inside source: true -*** True Line Result - def mouse_over_slider? -** Processing line: ~ circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing)~ -- Inside source: true -*** True Line Result - circle_x = (slider.x - slider.offset) + (state.current_step * slider.spacing) -** Processing line: ~ circle_y = (slider.y - slider.offset)~ +** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ - Inside source: true *** True Line Result - circle_y = (slider.y - slider.offset) -** Processing line: ~ circle_rect = [circle_x, circle_y, 37, 37]~ + # Signal that the user is going to be moving the target from the second grid +** Processing line: ~ def greedy_mouse_over_target?~ - Inside source: true *** True Line Result - circle_rect = [circle_x, circle_y, 37, 37] -** Processing line: ~ inputs.mouse.point.inside_rect?(circle_rect)~ + def greedy_mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.target))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(circle_rect) + inputs.mouse.point.inside_rect?(greedy_scale_up(grid.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79688,18 +86547,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ +** Processing line: ~ # Signal that the user is going to be moving the target from the third grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the first grid -** Processing line: ~ def bfs_mouse_over_star?~ + # Signal that the user is going to be moving the target from the third grid +** Processing line: ~ def a_star_mouse_over_target?~ - Inside source: true *** True Line Result - def bfs_mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.star))~ + def a_star_mouse_over_target? +** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.target))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(bfs_scale_up(grid.star)) + inputs.mouse.point.inside_rect?(a_star_scale_up(grid.target)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79708,58 +86567,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the star from the second grid -** Processing line: ~ def heuristic_mouse_over_star?~ -- Inside source: true -*** True Line Result - def heuristic_mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.star))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.star)) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ +** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ + # Signal that the user is going to be removing walls from the first grid +** Processing line: ~ def dijkstra_mouse_over_wall?~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the target from the first grid -** Processing line: ~ def bfs_mouse_over_target?~ + def dijkstra_mouse_over_wall? +** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result - def bfs_mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.target))~ + grid.walls.each_key do | wall | +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(dijkstra_scale_up(wall))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(bfs_scale_up(grid.target)) -** Processing line: ~ end~ + return true if inputs.mouse.point.inside_rect?(dijkstra_scale_up(wall)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the second grid -** Processing line: ~ def heuristic_mouse_over_target?~ -- Inside source: true -*** True Line Result - def heuristic_mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.target))~ +** Processing line: ~ false~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.target)) + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79768,22 +86603,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ +** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls from the first grid -** Processing line: ~ def bfs_mouse_over_wall?~ + # Signal that the user is going to be removing walls from the second grid +** Processing line: ~ def greedy_mouse_over_wall?~ - Inside source: true *** True Line Result - def bfs_mouse_over_wall? + def greedy_mouse_over_wall? ** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result grid.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(bfs_scale_up(wall))~ +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(greedy_scale_up(wall))~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(bfs_scale_up(wall)) + return true if inputs.mouse.point.inside_rect?(greedy_scale_up(wall)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79804,22 +86639,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ +** Processing line: ~ # Signal that the user is going to be removing walls from the third grid~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls from the second grid -** Processing line: ~ def heuristic_mouse_over_wall?~ + # Signal that the user is going to be removing walls from the third grid +** Processing line: ~ def a_star_mouse_over_wall?~ - Inside source: true *** True Line Result - def heuristic_mouse_over_wall? + def a_star_mouse_over_wall? ** Processing line: ~ grid.walls.each_key do | wall |~ - Inside source: true *** True Line Result grid.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(heuristic_scale_up(wall))~ +** Processing line: ~ return true if inputs.mouse.point.inside_rect?(a_star_scale_up(wall))~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(heuristic_scale_up(wall)) + return true if inputs.mouse.point.inside_rect?(a_star_scale_up(wall)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79844,14 +86679,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Signal that the user is going to be adding walls from the first grid -** Processing line: ~ def bfs_mouse_over_grid?~ +** Processing line: ~ def dijkstra_mouse_over_grid?~ - Inside source: true *** True Line Result - def bfs_mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(bfs_scale_up(grid.rect))~ + def dijkstra_mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.rect))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(bfs_scale_up(grid.rect)) + inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79864,14 +86699,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Signal that the user is going to be adding walls from the second grid -** Processing line: ~ def heuristic_mouse_over_grid?~ +** Processing line: ~ def greedy_mouse_over_grid?~ - Inside source: true *** True Line Result - def heuristic_mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.rect))~ + def greedy_mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.rect))~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(heuristic_scale_up(grid.rect)) + inputs.mouse.point.inside_rect?(greedy_scale_up(grid.rect)) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79880,74 +86715,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method is called when the user is editing the slider~ -- Inside source: true -*** True Line Result - # This method is called when the user is editing the slider -** Processing line: ~ # It pauses the animation and moves the white circle to the closest integer point~ +** Processing line: ~ # Signal that the user is going to be adding walls from the third grid~ - Inside source: true *** True Line Result - # It pauses the animation and moves the white circle to the closest integer point -** Processing line: ~ # on the slider~ + # Signal that the user is going to be adding walls from the third grid +** Processing line: ~ def a_star_mouse_over_grid?~ - Inside source: true *** True Line Result - # on the slider -** Processing line: ~ # Changes the step of the search to be animated~ + def a_star_mouse_over_grid? +** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.rect))~ - Inside source: true *** True Line Result - # Changes the step of the search to be animated -** Processing line: ~ def process_input_slider~ + inputs.mouse.point.inside_rect?(a_star_scale_up(grid.rect)) +** Processing line: ~ end~ - Inside source: true *** True Line Result - def process_input_slider -** Processing line: ~ state.play = false~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.play = false -** Processing line: ~ mouse_x = inputs.mouse.point.x~ + +** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ - Inside source: true *** True Line Result - mouse_x = inputs.mouse.point.x -** Processing line: ~~ + # Moves the star to the cell closest to the mouse in the first grid +** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result - -** Processing line: ~ # Bounds the mouse_x to the closest x value on the slider line~ + # Only resets the search if the star changes position +** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ - Inside source: true *** True Line Result - # Bounds the mouse_x to the closest x value on the slider line -** Processing line: ~ mouse_x = slider.x if mouse_x < slider.x~ + # Called whenever the user is editing the star (puts mouse down on star) +** Processing line: ~ def process_input_dijkstra_star~ - Inside source: true *** True Line Result - mouse_x = slider.x if mouse_x < slider.x -** Processing line: ~ mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w~ + def process_input_dijkstra_star +** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result - mouse_x = slider.x + slider.w if mouse_x > slider.x + slider.w -** Processing line: ~~ + old_star = grid.star.clone +** Processing line: ~ unless dijkstra_cell_closest_to_mouse == grid.target~ - Inside source: true *** True Line Result - -** Processing line: ~ # Sets the current search step to the one represented by the mouse x value~ + unless dijkstra_cell_closest_to_mouse == grid.target +** Processing line: ~ grid.star = dijkstra_cell_closest_to_mouse~ - Inside source: true *** True Line Result - # Sets the current search step to the one represented by the mouse x value -** Processing line: ~ # The slider's circle moves due to the render_slider method using anim_steps~ + grid.star = dijkstra_cell_closest_to_mouse +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The slider's circle moves due to the render_slider method using anim_steps -** Processing line: ~ state.current_step = ((mouse_x - slider.x) / slider.spacing).to_i~ + end +** Processing line: ~ unless old_star == grid.star~ - Inside source: true *** True Line Result - state.current_step = ((mouse_x - slider.x) / slider.spacing).to_i -** Processing line: ~~ + unless old_star == grid.star +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - -** Processing line: ~ recalculate_searches~ + reset_searches +** Processing line: ~ end~ - Inside source: true *** True Line Result - recalculate_searches + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79956,10 +86787,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the first grid + # Moves the star to the cell closest to the mouse in the second grid ** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result @@ -79968,22 +86799,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def process_input_bfs_star~ +** Processing line: ~ def process_input_greedy_star~ - Inside source: true *** True Line Result - def process_input_bfs_star + def process_input_greedy_star ** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result old_star = grid.star.clone -** Processing line: ~ unless bfs_cell_closest_to_mouse == grid.target~ +** Processing line: ~ unless greedy_cell_closest_to_mouse == grid.target~ - Inside source: true *** True Line Result - unless bfs_cell_closest_to_mouse == grid.target -** Processing line: ~ grid.star = bfs_cell_closest_to_mouse~ + unless greedy_cell_closest_to_mouse == grid.target +** Processing line: ~ grid.star = greedy_cell_closest_to_mouse~ - Inside source: true *** True Line Result - grid.star = bfs_cell_closest_to_mouse + grid.star = greedy_cell_closest_to_mouse ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -79992,10 +86823,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result unless old_star == grid.star -** Processing line: ~ recalculate_searches~ +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80008,10 +86839,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ +** Processing line: ~ # Moves the star to the cell closest to the mouse in the third grid~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the second grid + # Moves the star to the cell closest to the mouse in the third grid ** Processing line: ~ # Only resets the search if the star changes position~ - Inside source: true *** True Line Result @@ -80020,22 +86851,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def process_input_heuristic_star~ +** Processing line: ~ def process_input_a_star_star~ - Inside source: true *** True Line Result - def process_input_heuristic_star + def process_input_a_star_star ** Processing line: ~ old_star = grid.star.clone~ - Inside source: true *** True Line Result old_star = grid.star.clone -** Processing line: ~ unless heuristic_cell_closest_to_mouse == grid.target~ +** Processing line: ~ unless a_star_cell_closest_to_mouse == grid.target~ - Inside source: true *** True Line Result - unless heuristic_cell_closest_to_mouse == grid.target -** Processing line: ~ grid.star = heuristic_cell_closest_to_mouse~ + unless a_star_cell_closest_to_mouse == grid.target +** Processing line: ~ grid.star = a_star_cell_closest_to_mouse~ - Inside source: true *** True Line Result - grid.star = heuristic_cell_closest_to_mouse + grid.star = a_star_cell_closest_to_mouse ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80044,10 +86875,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result unless old_star == grid.star -** Processing line: ~ recalculate_searches~ +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80064,30 +86895,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Moves the target to the grid closest to the mouse in the first grid -** Processing line: ~ # Only recalculate_searchess the search if the target changes position~ +** Processing line: ~ # Only reset_searchess the search if the target changes position~ - Inside source: true *** True Line Result - # Only recalculate_searchess the search if the target changes position + # Only reset_searchess the search if the target changes position ** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def process_input_bfs_target~ +** Processing line: ~ def process_input_dijkstra_target~ - Inside source: true *** True Line Result - def process_input_bfs_target + def process_input_dijkstra_target ** Processing line: ~ old_target = grid.target.clone~ - Inside source: true *** True Line Result old_target = grid.target.clone -** Processing line: ~ unless bfs_cell_closest_to_mouse == grid.star~ +** Processing line: ~ unless dijkstra_cell_closest_to_mouse == grid.star~ - Inside source: true *** True Line Result - unless bfs_cell_closest_to_mouse == grid.star -** Processing line: ~ grid.target = bfs_cell_closest_to_mouse~ + unless dijkstra_cell_closest_to_mouse == grid.star +** Processing line: ~ grid.target = dijkstra_cell_closest_to_mouse~ - Inside source: true *** True Line Result - grid.target = bfs_cell_closest_to_mouse + grid.target = dijkstra_cell_closest_to_mouse ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80096,10 +86927,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result unless old_target == grid.target -** Processing line: ~ recalculate_searches~ +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80116,30 +86947,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Moves the target to the cell closest to the mouse in the second grid -** Processing line: ~ # Only recalculate_searchess the search if the target changes position~ +** Processing line: ~ # Only reset_searchess the search if the target changes position~ - Inside source: true *** True Line Result - # Only recalculate_searchess the search if the target changes position + # Only reset_searchess the search if the target changes position ** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ - Inside source: true *** True Line Result # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def process_input_heuristic_target~ +** Processing line: ~ def process_input_greedy_target~ - Inside source: true *** True Line Result - def process_input_heuristic_target + def process_input_greedy_target ** Processing line: ~ old_target = grid.target.clone~ - Inside source: true *** True Line Result old_target = grid.target.clone -** Processing line: ~ unless heuristic_cell_closest_to_mouse == grid.star~ +** Processing line: ~ unless greedy_cell_closest_to_mouse == grid.star~ - Inside source: true *** True Line Result - unless heuristic_cell_closest_to_mouse == grid.star -** Processing line: ~ grid.target = heuristic_cell_closest_to_mouse~ + unless greedy_cell_closest_to_mouse == grid.star +** Processing line: ~ grid.target = greedy_cell_closest_to_mouse~ - Inside source: true *** True Line Result - grid.target = heuristic_cell_closest_to_mouse + grid.target = greedy_cell_closest_to_mouse ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80148,10 +86979,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result unless old_target == grid.target -** Processing line: ~ recalculate_searches~ +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches +** 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: ~ # Moves the target to the cell closest to the mouse in the third grid~ +- Inside source: true +*** True Line Result + # Moves the target to the cell closest to the mouse in the third grid +** Processing line: ~ # Only reset_searchess the search if the target changes position~ +- Inside source: true +*** True Line Result + # Only reset_searchess the search if the target changes position +** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ +- Inside source: true +*** True Line Result + # Called whenever the user is editing the target (puts mouse down on target) +** Processing line: ~ def process_input_a_star_target~ +- Inside source: true +*** True Line Result + def process_input_a_star_target +** Processing line: ~ old_target = grid.target.clone~ +- Inside source: true +*** True Line Result + old_target = grid.target.clone +** Processing line: ~ unless a_star_cell_closest_to_mouse == grid.star~ +- Inside source: true +*** True Line Result + unless a_star_cell_closest_to_mouse == grid.star +** Processing line: ~ grid.target = a_star_cell_closest_to_mouse~ +- Inside source: true +*** True Line Result + grid.target = a_star_cell_closest_to_mouse +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ unless old_target == grid.target~ +- Inside source: true +*** True Line Result + unless old_target == grid.target +** Processing line: ~ reset_searches~ +- Inside source: true +*** True Line Result + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80168,10 +87051,114 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Removes walls in the first grid that are under the cursor -** Processing line: ~ def process_input_bfs_remove_wall~ +** Processing line: ~ def process_input_dijkstra_remove_wall~ +- Inside source: true +*** True Line Result + def process_input_dijkstra_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ +- Inside source: true +*** True Line Result + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ +- Inside source: true +*** True Line Result + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ +- Inside source: true +*** True Line Result + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if dijkstra_mouse_over_grid?~ +- Inside source: true +*** True Line Result + if dijkstra_mouse_over_grid? +** Processing line: ~ if grid.walls.has_key?(dijkstra_cell_closest_to_mouse)~ +- Inside source: true +*** True Line Result + if grid.walls.has_key?(dijkstra_cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(dijkstra_cell_closest_to_mouse)~ +- Inside source: true +*** True Line Result + grid.walls.delete(dijkstra_cell_closest_to_mouse) +** Processing line: ~ reset_searches~ +- Inside source: true +*** True Line Result + reset_searches +** 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: ~ # Removes walls in the second grid that are under the cursor~ +- Inside source: true +*** True Line Result + # Removes walls in the second grid that are under the cursor +** Processing line: ~ def process_input_greedy_remove_wall~ +- Inside source: true +*** True Line Result + def process_input_greedy_remove_wall +** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ +- Inside source: true +*** True Line Result + # The mouse needs to be inside the grid, because we only want to remove walls +** Processing line: ~ # the cursor is directly over~ +- Inside source: true +*** True Line Result + # the cursor is directly over +** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ +- Inside source: true +*** True Line Result + # Recalculations should only occur when a wall is actually deleted +** Processing line: ~ if greedy_mouse_over_grid?~ +- Inside source: true +*** True Line Result + if greedy_mouse_over_grid? +** Processing line: ~ if grid.walls.has_key?(greedy_cell_closest_to_mouse)~ +- Inside source: true +*** True Line Result + if grid.walls.has_key?(greedy_cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(greedy_cell_closest_to_mouse)~ +- Inside source: true +*** True Line Result + grid.walls.delete(greedy_cell_closest_to_mouse) +** Processing line: ~ reset_searches~ +- Inside source: true +*** True Line Result + reset_searches +** 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: ~ # Removes walls in the third grid that are under the cursor~ +- Inside source: true +*** True Line Result + # Removes walls in the third grid that are under the cursor +** Processing line: ~ def process_input_a_star_remove_wall~ - Inside source: true *** True Line Result - def process_input_bfs_remove_wall + def process_input_a_star_remove_wall ** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ - Inside source: true *** True Line Result @@ -80184,22 +87171,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if bfs_mouse_over_grid?~ +** Processing line: ~ if a_star_mouse_over_grid?~ - Inside source: true *** True Line Result - if bfs_mouse_over_grid? -** Processing line: ~ if grid.walls.has_key?(bfs_cell_closest_to_mouse)~ + if a_star_mouse_over_grid? +** Processing line: ~ if grid.walls.has_key?(a_star_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - if grid.walls.has_key?(bfs_cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(bfs_cell_closest_to_mouse)~ + if grid.walls.has_key?(a_star_cell_closest_to_mouse) +** Processing line: ~ grid.walls.delete(a_star_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - grid.walls.delete(bfs_cell_closest_to_mouse) -** Processing line: ~ recalculate_searches~ + grid.walls.delete(a_star_cell_closest_to_mouse) +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80216,42 +87203,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the second grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the second grid that are under the cursor -** Processing line: ~ def process_input_heuristic_remove_wall~ -- Inside source: true -*** True Line Result - def process_input_heuristic_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ -- Inside source: true -*** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ +** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + # Adds a wall in the first grid in the cell the mouse is over +** Processing line: ~ def process_input_dijkstra_add_wall~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if heuristic_mouse_over_grid?~ + def process_input_dijkstra_add_wall +** Processing line: ~ if dijkstra_mouse_over_grid?~ - Inside source: true *** True Line Result - if heuristic_mouse_over_grid? -** Processing line: ~ if grid.walls.has_key?(heuristic_cell_closest_to_mouse)~ + if dijkstra_mouse_over_grid? +** Processing line: ~ unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - if grid.walls.has_key?(heuristic_cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(heuristic_cell_closest_to_mouse)~ + unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse) +** Processing line: ~ grid.walls[dijkstra_cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - grid.walls.delete(heuristic_cell_closest_to_mouse) -** Processing line: ~ recalculate_searches~ + grid.walls[dijkstra_cell_closest_to_mouse] = true +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80264,30 +87239,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ +** Processing line: ~~ - Inside source: true *** True Line Result - # Adds a wall in the first grid in the cell the mouse is over -** Processing line: ~ def process_input_bfs_add_wall~ + +** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ - Inside source: true *** True Line Result - def process_input_bfs_add_wall -** Processing line: ~ if bfs_mouse_over_grid?~ + # Adds a wall in the second grid in the cell the mouse is over +** Processing line: ~ def process_input_greedy_add_wall~ - Inside source: true *** True Line Result - if bfs_mouse_over_grid? -** Processing line: ~ unless grid.walls.has_key?(bfs_cell_closest_to_mouse)~ + def process_input_greedy_add_wall +** Processing line: ~ if greedy_mouse_over_grid?~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(bfs_cell_closest_to_mouse) -** Processing line: ~ grid.walls[bfs_cell_closest_to_mouse] = true~ + if greedy_mouse_over_grid? +** Processing line: ~ unless grid.walls.has_key?(greedy_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - grid.walls[bfs_cell_closest_to_mouse] = true -** Processing line: ~ recalculate_searches~ + unless grid.walls.has_key?(greedy_cell_closest_to_mouse) +** Processing line: ~ grid.walls[greedy_cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - recalculate_searches + grid.walls[greedy_cell_closest_to_mouse] = true +** Processing line: ~ reset_searches~ +- Inside source: true +*** True Line Result + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80304,30 +87283,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ +** Processing line: ~ # Adds a wall in the third grid in the cell the mouse is over~ - Inside source: true *** True Line Result - # Adds a wall in the second grid in the cell the mouse is over -** Processing line: ~ def process_input_heuristic_add_wall~ + # Adds a wall in the third grid in the cell the mouse is over +** Processing line: ~ def process_input_a_star_add_wall~ - Inside source: true *** True Line Result - def process_input_heuristic_add_wall -** Processing line: ~ if heuristic_mouse_over_grid?~ + def process_input_a_star_add_wall +** Processing line: ~ if a_star_mouse_over_grid?~ - Inside source: true *** True Line Result - if heuristic_mouse_over_grid? -** Processing line: ~ unless grid.walls.has_key?(heuristic_cell_closest_to_mouse)~ + if a_star_mouse_over_grid? +** Processing line: ~ unless grid.walls.has_key?(a_star_cell_closest_to_mouse)~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(heuristic_cell_closest_to_mouse) -** Processing line: ~ grid.walls[heuristic_cell_closest_to_mouse] = true~ + unless grid.walls.has_key?(a_star_cell_closest_to_mouse) +** Processing line: ~ grid.walls[a_star_cell_closest_to_mouse] = true~ - Inside source: true *** True Line Result - grid.walls[heuristic_cell_closest_to_mouse] = true -** Processing line: ~ recalculate_searches~ + grid.walls[a_star_cell_closest_to_mouse] = true +** Processing line: ~ reset_searches~ - Inside source: true *** True Line Result - recalculate_searches + reset_searches ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80356,10 +87335,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Finding the cell closest to the mouse helps with this -** Processing line: ~ def bfs_cell_closest_to_mouse~ +** Processing line: ~ def dijkstra_cell_closest_to_mouse~ - Inside source: true *** True Line Result - def bfs_cell_closest_to_mouse + def dijkstra_cell_closest_to_mouse ** Processing line: ~ # Closest cell to the mouse in the first grid~ - Inside source: true *** True Line Result @@ -80412,10 +87391,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Finding the cell closest to the mouse in the second grid helps with this -** Processing line: ~ def heuristic_cell_closest_to_mouse~ +** Processing line: ~ def greedy_cell_closest_to_mouse~ - Inside source: true *** True Line Result - def heuristic_cell_closest_to_mouse + def greedy_cell_closest_to_mouse ** Processing line: ~ # Closest cell grid to the mouse in the second~ - Inside source: true *** True Line Result @@ -80472,50 +87451,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def recalculate_searches~ +** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ - Inside source: true *** True Line Result - def recalculate_searches -** Processing line: ~ # Reset the searches~ + # When the user grabs the star and puts their cursor to the far right +** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ - Inside source: true *** True Line Result - # Reset the searches -** Processing line: ~ bfs.came_from = {}~ + # and moves up and down, the star is supposed to move along the grid as well +** Processing line: ~ # Finding the cell closest to the mouse in the third grid helps with this~ - Inside source: true *** True Line Result - bfs.came_from = {} -** Processing line: ~ bfs.frontier = []~ + # Finding the cell closest to the mouse in the third grid helps with this +** Processing line: ~ def a_star_cell_closest_to_mouse~ - Inside source: true *** True Line Result - bfs.frontier = [] -** Processing line: ~ bfs.path = []~ + def a_star_cell_closest_to_mouse +** Processing line: ~ # Closest cell grid to the mouse in the second~ - Inside source: true *** True Line Result - bfs.path = [] -** Processing line: ~ heuristic.came_from = {}~ + # Closest cell grid to the mouse in the second +** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ - Inside source: true *** True Line Result - heuristic.came_from = {} -** Processing line: ~ heuristic.frontier = []~ + x = (inputs.mouse.point.x / grid.cell_size).to_i +** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ - Inside source: true *** True Line Result - heuristic.frontier = [] -** Processing line: ~ heuristic.path = []~ + y = (inputs.mouse.point.y / grid.cell_size).to_i +** Processing line: ~ # Translate the cell to the first grid~ - Inside source: true *** True Line Result - heuristic.path = [] -** Processing line: ~~ + # Translate the cell to the first grid +** Processing line: ~ x -= (grid.width + 1) * 2~ - Inside source: true *** True Line Result - -** Processing line: ~ # Move the searches forward to the current step~ + x -= (grid.width + 1) * 2 +** Processing line: ~ # Bound x and y to the first grid~ - Inside source: true *** True Line Result - # Move the searches forward to the current step -** Processing line: ~ state.current_step.times { move_searches_one_step_forward }~ + # Bound x and y to the first grid +** Processing line: ~ x = 0 if x < 0~ - Inside source: true *** True Line Result - state.current_step.times { move_searches_one_step_forward } + x = 0 if x < 0 +** Processing line: ~ y = 0 if y < 0~ +- Inside source: true +*** True Line Result + y = 0 if y < 0 +** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ +- Inside source: true +*** True Line Result + x = grid.width - 1 if x > grid.width - 1 +** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ +- Inside source: true +*** True Line Result + y = grid.height - 1 if y > grid.height - 1 +** Processing line: ~ # Return closest cell~ +- Inside source: true +*** True Line Result + # Return closest cell +** Processing line: ~ [x, y]~ +- Inside source: true +*** True Line Result + [x, y] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80524,18 +87523,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def move_searches_one_step_forward~ +** Processing line: ~ def reset_searches~ - Inside source: true *** True Line Result - def move_searches_one_step_forward -** Processing line: ~ bfs_one_step_forward~ + def reset_searches +** Processing line: ~ # Reset the searches~ - Inside source: true *** True Line Result - bfs_one_step_forward -** Processing line: ~ heuristic_one_step_forward~ + # Reset the searches +** Processing line: ~ dijkstra.came_from = {}~ - Inside source: true *** True Line Result - heuristic_one_step_forward + dijkstra.came_from = {} +** Processing line: ~ dijkstra.cost_so_far = {}~ +- Inside source: true +*** True Line Result + dijkstra.cost_so_far = {} +** Processing line: ~ dijkstra.frontier = []~ +- Inside source: true +*** True Line Result + dijkstra.frontier = [] +** Processing line: ~ dijkstra.path = []~ +- Inside source: true +*** True Line Result + dijkstra.path = [] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ greedy.came_from = {}~ +- Inside source: true +*** True Line Result + greedy.came_from = {} +** Processing line: ~ greedy.frontier = []~ +- Inside source: true +*** True Line Result + greedy.frontier = [] +** Processing line: ~ greedy.path = []~ +- Inside source: true +*** True Line Result + greedy.path = [] +** Processing line: ~ a_star.came_from = {}~ +- Inside source: true +*** True Line Result + a_star.came_from = {} +** Processing line: ~ a_star.frontier = []~ +- Inside source: true +*** True Line Result + a_star.frontier = [] +** Processing line: ~ a_star.path = []~ +- Inside source: true +*** True Line Result + a_star.path = [] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80544,86 +87583,110 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def bfs_one_step_forward~ +** Processing line: ~ def calc_searches~ - Inside source: true *** True Line Result - def bfs_one_step_forward -** Processing line: ~ return if bfs.came_from.has_key?(grid.target)~ + def calc_searches +** Processing line: ~ calc_dijkstra~ - Inside source: true *** True Line Result - return if bfs.came_from.has_key?(grid.target) + calc_dijkstra +** Processing line: ~ calc_greedy~ +- Inside source: true +*** True Line Result + calc_greedy +** Processing line: ~ calc_a_star~ +- Inside source: true +*** True Line Result + calc_a_star +** Processing line: ~ # Move the searches forward to the current step~ +- Inside source: true +*** True Line Result + # Move the searches forward to the current step +** Processing line: ~ # state.current_step.times { move_searches_one_step_forward }~ +- Inside source: true +*** True Line Result + # state.current_step.times { move_searches_one_step_forward } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Only runs at the beginning of the search as setup.~ +** Processing line: ~ def calc_dijkstra~ - Inside source: true *** True Line Result - # Only runs at the beginning of the search as setup. -** Processing line: ~ if bfs.came_from.empty?~ + def calc_dijkstra +** Processing line: ~ # Sets up the search to begin from the star~ - Inside source: true *** True Line Result - if bfs.came_from.empty? -** Processing line: ~ bfs.frontier << grid.star~ + # Sets up the search to begin from the star +** Processing line: ~ dijkstra.frontier << grid.star~ - Inside source: true *** True Line Result - bfs.frontier << grid.star -** Processing line: ~ bfs.came_from[grid.star] = nil~ + dijkstra.frontier << grid.star +** Processing line: ~ dijkstra.came_from[grid.star] = nil~ - Inside source: true *** True Line Result - bfs.came_from[grid.star] = nil -** Processing line: ~ end~ + dijkstra.came_from[grid.star] = nil +** Processing line: ~ dijkstra.cost_so_far[grid.star] = 0~ - Inside source: true *** True Line Result - end + dijkstra.cost_so_far[grid.star] = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # A step in the search~ +** Processing line: ~ # Until the target is found or there are no more cells to explore from~ - Inside source: true *** True Line Result - # A step in the search -** Processing line: ~ unless bfs.frontier.empty?~ + # Until the target is found or there are no more cells to explore from +** Processing line: ~ until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty?~ - Inside source: true *** True Line Result - unless bfs.frontier.empty? -** Processing line: ~ # Takes the next frontier cell~ + until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty? +** Processing line: ~ # Take the next frontier cell. The first element is the cell, the second is the priority.~ - Inside source: true *** True Line Result - # Takes the next frontier cell -** Processing line: ~ new_frontier = bfs.frontier.shift~ + # Take the next frontier cell. The first element is the cell, the second is the priority. +** Processing line: ~ new_frontier = dijkstra.frontier.shift#[0]~ - Inside source: true *** True Line Result - new_frontier = bfs.frontier.shift + new_frontier = dijkstra.frontier.shift#[0] ** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ +** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do |neighbor| + adjacent_neighbors(new_frontier).each do | neighbor | ** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result # That have not been visited and are not walls -** Processing line: ~ unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ +** Processing line: ~ unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - unless bfs.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) + unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) ** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result # Add them to the frontier and mark them as visited -** Processing line: ~ bfs.frontier << neighbor~ +** Processing line: ~ dijkstra.frontier << neighbor~ - Inside source: true *** True Line Result - bfs.frontier << neighbor -** Processing line: ~ bfs.came_from[neighbor] = new_frontier~ + dijkstra.frontier << neighbor +** Processing line: ~ dijkstra.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - bfs.came_from[neighbor] = new_frontier + dijkstra.came_from[neighbor] = new_frontier +** Processing line: ~ dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1~ +- Inside source: true +*** True Line Result + dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80632,26 +87695,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ +** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ - Inside source: true *** True Line Result - # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line -** Processing line: ~ # Comment this line and let a path generate to see the difference~ + # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line +** Processing line: ~ # Comment this line and let a path generate to see the difference~ - Inside source: true *** True Line Result - # Comment this line and let a path generate to see the difference -** Processing line: ~ bfs.frontier = bfs.frontier.sort_by {| cell | proximity_to_star(cell) }~ + # Comment this line and let a path generate to see the difference +** Processing line: ~ dijkstra.frontier = dijkstra.frontier.sort_by {| cell | proximity_to_star(cell) }~ - Inside source: true *** True Line Result - bfs.frontier = bfs.frontier.sort_by {| cell | proximity_to_star(cell) } + dijkstra.frontier = dijkstra.frontier.sort_by {| cell | proximity_to_star(cell) } +** Processing line: ~ dijkstra.frontier = dijkstra.frontier.sort_by {| cell | dijkstra.cost_so_far[cell] }~ +- Inside source: true +*** True Line Result + dijkstra.frontier = dijkstra.frontier.sort_by {| cell | dijkstra.cost_so_far[cell] } +** 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 @@ -80660,18 +87731,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # If the search found the target -** Processing line: ~ if bfs.came_from.has_key?(grid.target)~ +** Processing line: ~ if dijkstra.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - if bfs.came_from.has_key?(grid.target) + if dijkstra.came_from.has_key?(grid.target) ** Processing line: ~ # Calculate the path between the target and star~ - Inside source: true *** True Line Result # Calculate the path between the target and star -** Processing line: ~ bfs_calc_path~ +** Processing line: ~ dijkstra_calc_path~ - Inside source: true *** True Line Result - bfs_calc_path + dijkstra_calc_path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80684,186 +87755,214 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path between the target and star for the breadth first search~ +** Processing line: ~ def calc_greedy~ - Inside source: true *** True Line Result - # Calculates the path between the target and star for the breadth first search -** Processing line: ~ # Only called when the breadth first search finds the target~ + def calc_greedy +** Processing line: ~ # Sets up the search to begin from the star~ - Inside source: true *** True Line Result - # Only called when the breadth first search finds the target -** Processing line: ~ def bfs_calc_path~ + # Sets up the search to begin from the star +** Processing line: ~ greedy.frontier << grid.star~ - Inside source: true *** True Line Result - def bfs_calc_path -** Processing line: ~ # Start from the target~ + greedy.frontier << grid.star +** Processing line: ~ greedy.came_from[grid.star] = nil~ - Inside source: true *** True Line Result - # Start from the target -** Processing line: ~ endpoint = grid.target~ + greedy.came_from[grid.star] = nil +** Processing line: ~~ - Inside source: true *** True Line Result - endpoint = grid.target -** Processing line: ~ # And the cell it came from~ + +** Processing line: ~ # Until the target is found or there are no more cells to explore from~ - Inside source: true *** True Line Result - # And the cell it came from -** Processing line: ~ next_endpoint = bfs.came_from[endpoint]~ + # Until the target is found or there are no more cells to explore from +** Processing line: ~ until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty?~ - Inside source: true *** True Line Result - next_endpoint = bfs.came_from[endpoint] -** Processing line: ~ while endpoint and next_endpoint~ + until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty? +** Processing line: ~ # Take the next frontier cell~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between these two cells and store it~ + # Take the next frontier cell +** Processing line: ~ new_frontier = greedy.frontier.shift~ - Inside source: true *** True Line Result - # Draw a path between these two cells and store it -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + new_frontier = greedy.frontier.shift +** Processing line: ~ # For each of its neighbors~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ bfs.path << path~ + # For each of its neighbors +** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ - Inside source: true *** True Line Result - bfs.path << path -** Processing line: ~ # And get the next pair of cells~ + adjacent_neighbors(new_frontier).each do | neighbor | +** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result - # And get the next pair of cells -** Processing line: ~ endpoint = next_endpoint~ + # That have not been visited and are not walls +** Processing line: ~ unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = bfs.came_from[endpoint]~ + unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) +** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result - next_endpoint = bfs.came_from[endpoint] -** Processing line: ~ # Continue till there are no more cells~ + # Add them to the frontier and mark them as visited +** Processing line: ~ greedy.frontier << neighbor~ - Inside source: true *** True Line Result - # Continue till there are no more cells -** Processing line: ~ end~ + greedy.frontier << neighbor +** Processing line: ~ greedy.came_from[neighbor] = new_frontier~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + greedy.came_from[neighbor] = new_frontier +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the heuristic search forward one step~ + end +** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ - Inside source: true *** True Line Result - # Moves the heuristic search forward one step -** Processing line: ~ # Can be called from tick while the animation is playing~ + # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line +** Processing line: ~ # Comment this line and let a path generate to see the difference~ - Inside source: true *** True Line Result - # Can be called from tick while the animation is playing -** Processing line: ~ # Can also be called when recalculating the searches after the user edited the grid~ + # Comment this line and let a path generate to see the difference +** Processing line: ~ greedy.frontier = greedy.frontier.sort_by {| cell | proximity_to_star(cell) }~ - Inside source: true *** True Line Result - # Can also be called when recalculating the searches after the user edited the grid -** Processing line: ~ def heuristic_one_step_forward~ + greedy.frontier = greedy.frontier.sort_by {| cell | proximity_to_star(cell) } +** Processing line: ~ # Sort the frontier so cells that are close to the target are then prioritized~ - Inside source: true *** True Line Result - def heuristic_one_step_forward -** Processing line: ~ # Stop the search if the target has been found~ + # Sort the frontier so cells that are close to the target are then prioritized +** Processing line: ~ greedy.frontier = greedy.frontier.sort_by {| cell | greedy_heuristic(cell) }~ - Inside source: true *** True Line Result - # Stop the search if the target has been found -** Processing line: ~ return if heuristic.came_from.has_key?(grid.target)~ + greedy.frontier = greedy.frontier.sort_by {| cell | greedy_heuristic(cell) } +** Processing line: ~ end~ - Inside source: true *** True Line Result - return if heuristic.came_from.has_key?(grid.target) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the search has not begun~ +** Processing line: ~~ - Inside source: true *** True Line Result - # If the search has not begun -** Processing line: ~ if heuristic.came_from.empty?~ + +** Processing line: ~ # If the search found the target~ - Inside source: true *** True Line Result - if heuristic.came_from.empty? -** Processing line: ~ # Setup the search to begin from the star~ + # If the search found the target +** Processing line: ~ if greedy.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - # Setup the search to begin from the star -** Processing line: ~ heuristic.frontier << grid.star~ + if greedy.came_from.has_key?(grid.target) +** Processing line: ~ # Calculate the path between the target and star~ - Inside source: true *** True Line Result - heuristic.frontier << grid.star -** Processing line: ~ heuristic.came_from[grid.star] = nil~ + # Calculate the path between the target and star +** Processing line: ~ greedy_calc_path~ - Inside source: true *** True Line Result - heuristic.came_from[grid.star] = nil + greedy_calc_path ** 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: ~ # One step in the heuristic search~ +** Processing line: ~ def calc_a_star~ - Inside source: true *** True Line Result - # One step in the heuristic search + def calc_a_star +** Processing line: ~ # Setup the search to start from the star~ +- Inside source: true +*** True Line Result + # Setup the search to start from the star +** Processing line: ~ a_star.came_from[grid.star] = nil~ +- Inside source: true +*** True Line Result + a_star.came_from[grid.star] = nil +** Processing line: ~ a_star.cost_so_far[grid.star] = 0~ +- Inside source: true +*** True Line Result + a_star.cost_so_far[grid.star] = 0 +** Processing line: ~ a_star.frontier << grid.star~ +- Inside source: true +*** True Line Result + a_star.frontier << grid.star ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Unless there are no more cells to explore from~ +** Processing line: ~ # Until there are no more cells to explore from or the search has found the target~ - Inside source: true *** True Line Result - # Unless there are no more cells to explore from -** Processing line: ~ unless heuristic.frontier.empty?~ + # Until there are no more cells to explore from or the search has found the target +** Processing line: ~ until a_star.frontier.empty? or a_star.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - unless heuristic.frontier.empty? -** Processing line: ~ # Get the next cell to explore from~ + until a_star.frontier.empty? or a_star.came_from.has_key?(grid.target) +** Processing line: ~ # Get the next cell to expand from~ - Inside source: true *** True Line Result - # Get the next cell to explore from -** Processing line: ~ new_frontier = heuristic.frontier.shift~ + # Get the next cell to expand from +** Processing line: ~ current_frontier = a_star.frontier.shift~ - Inside source: true *** True Line Result - new_frontier = heuristic.frontier.shift -** Processing line: ~ # For each of its neighbors~ + current_frontier = a_star.frontier.shift +** Processing line: ~~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do |neighbor|~ + +** Processing line: ~ # For each of that cells neighbors~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do |neighbor| + # For each of that cells neighbors +** Processing line: ~ adjacent_neighbors(current_frontier).each do | neighbor |~ +- Inside source: true +*** True Line Result + adjacent_neighbors(current_frontier).each do | neighbor | ** Processing line: ~ # That have not been visited and are not walls~ - Inside source: true *** True Line Result # That have not been visited and are not walls -** Processing line: ~ unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)~ +** Processing line: ~ unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ - Inside source: true *** True Line Result - unless heuristic.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) + unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) ** Processing line: ~ # Add them to the frontier and mark them as visited~ - Inside source: true *** True Line Result # Add them to the frontier and mark them as visited -** Processing line: ~ heuristic.frontier << neighbor~ +** Processing line: ~ a_star.frontier << neighbor~ - Inside source: true *** True Line Result - heuristic.frontier << neighbor -** Processing line: ~ heuristic.came_from[neighbor] = new_frontier~ + a_star.frontier << neighbor +** Processing line: ~ a_star.came_from[neighbor] = current_frontier~ - Inside source: true *** True Line Result - heuristic.came_from[neighbor] = new_frontier + a_star.came_from[neighbor] = current_frontier +** Processing line: ~ a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1~ +- Inside source: true +*** True Line Result + a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80872,30 +87971,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ +** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ - Inside source: true *** True Line Result - # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line -** Processing line: ~ heuristic.frontier = heuristic.frontier.sort_by {| cell | proximity_to_star(cell) }~ + # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line +** Processing line: ~ # Comment this line and let a path generate to see the difference~ - Inside source: true *** True Line Result - heuristic.frontier = heuristic.frontier.sort_by {| cell | proximity_to_star(cell) } -** Processing line: ~ # Sort the frontier so cells that are close to the target are then prioritized~ + # Comment this line and let a path generate to see the difference +** Processing line: ~ a_star.frontier = a_star.frontier.sort_by {| cell | proximity_to_star(cell) }~ - Inside source: true *** True Line Result - # Sort the frontier so cells that are close to the target are then prioritized -** Processing line: ~ heuristic.frontier = heuristic.frontier.sort_by {| cell | heuristic_heuristic(cell) }~ + a_star.frontier = a_star.frontier.sort_by {| cell | proximity_to_star(cell) } +** Processing line: ~ a_star.frontier = a_star.frontier.sort_by {| cell | a_star.cost_so_far[cell] + greedy_heuristic(cell) }~ - Inside source: true *** True Line Result - heuristic.frontier = heuristic.frontier.sort_by {| cell | heuristic_heuristic(cell) } + a_star.frontier = a_star.frontier.sort_by {| cell | a_star.cost_so_far[cell] + greedy_heuristic(cell) } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result @@ -80904,18 +88003,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # If the search found the target -** Processing line: ~ if heuristic.came_from.has_key?(grid.target)~ +** Processing line: ~ if a_star.came_from.has_key?(grid.target)~ - Inside source: true *** True Line Result - if heuristic.came_from.has_key?(grid.target) + if a_star.came_from.has_key?(grid.target) ** Processing line: ~ # Calculate the path between the target and star~ - Inside source: true *** True Line Result # Calculate the path between the target and star -** Processing line: ~ heuristic_calc_path~ +** Processing line: ~ a_star_calc_path~ - Inside source: true *** True Line Result - heuristic_calc_path + a_star_calc_path +** 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: ~ # Calculates the path between the target and star for the breadth first search~ +- Inside source: true +*** True Line Result + # Calculates the path between the target and star for the breadth first search +** Processing line: ~ # Only called when the breadth first search finds the target~ +- Inside source: true +*** True Line Result + # Only called when the breadth first search finds the target +** Processing line: ~ def dijkstra_calc_path~ +- Inside source: true +*** True Line Result + def dijkstra_calc_path +** Processing line: ~ # Start from the target~ +- Inside source: true +*** True Line Result + # Start from the target +** Processing line: ~ endpoint = grid.target~ +- Inside source: true +*** True Line Result + endpoint = grid.target +** Processing line: ~ # And the cell it came from~ +- Inside source: true +*** True Line Result + # And the cell it came from +** Processing line: ~ next_endpoint = dijkstra.came_from[endpoint]~ +- Inside source: true +*** True Line Result + next_endpoint = dijkstra.came_from[endpoint] +** Processing line: ~ while endpoint and next_endpoint~ +- Inside source: true +*** True Line Result + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between these two cells and store it~ +- Inside source: true +*** True Line Result + # Draw a path between these two cells and store it +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ +- Inside source: true +*** True Line Result + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ dijkstra.path << path~ +- Inside source: true +*** True Line Result + dijkstra.path << path +** Processing line: ~ # And get the next pair of cells~ +- Inside source: true +*** True Line Result + # And get the next pair of cells +** Processing line: ~ endpoint = next_endpoint~ +- Inside source: true +*** True Line Result + endpoint = next_endpoint +** Processing line: ~ next_endpoint = dijkstra.came_from[endpoint]~ +- Inside source: true +*** True Line Result + next_endpoint = dijkstra.came_from[endpoint] +** Processing line: ~ # Continue till there are no more cells~ +- Inside source: true +*** True Line Result + # Continue till there are no more cells ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -80936,10 +88107,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Returns a number to compare distances between cells and the target -** Processing line: ~ def heuristic_heuristic(cell)~ +** Processing line: ~ def greedy_heuristic(cell)~ - Inside source: true *** True Line Result - def heuristic_heuristic(cell) + def greedy_heuristic(cell) ** Processing line: ~ (grid.target.x - cell.x).abs + (grid.target.y - cell.y).abs~ - Inside source: true *** True Line Result @@ -80952,18 +88123,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path between the target and star for the heuristic search~ +** Processing line: ~ # Calculates the path between the target and star for the greedy search~ - Inside source: true *** True Line Result - # Calculates the path between the target and star for the heuristic search -** Processing line: ~ # Only called when the heuristic search finds the target~ + # Calculates the path between the target and star for the greedy search +** Processing line: ~ # Only called when the greedy search finds the target~ - Inside source: true *** True Line Result - # Only called when the heuristic search finds the target -** Processing line: ~ def heuristic_calc_path~ + # Only called when the greedy search finds the target +** Processing line: ~ def greedy_calc_path~ - Inside source: true *** True Line Result - def heuristic_calc_path + def greedy_calc_path ** Processing line: ~ # Start from the target~ - Inside source: true *** True Line Result @@ -80976,10 +88147,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # And the cell it came from -** Processing line: ~ next_endpoint = heuristic.came_from[endpoint]~ +** Processing line: ~ next_endpoint = greedy.came_from[endpoint]~ - Inside source: true *** True Line Result - next_endpoint = heuristic.came_from[endpoint] + next_endpoint = greedy.came_from[endpoint] ** Processing line: ~ while endpoint and next_endpoint~ - Inside source: true *** True Line Result @@ -80992,10 +88163,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ heuristic.path << path~ +** Processing line: ~ greedy.path << path~ - Inside source: true *** True Line Result - heuristic.path << path + greedy.path << path ** Processing line: ~ # And get the next pair of cells~ - Inside source: true *** True Line Result @@ -81004,10 +88175,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result endpoint = next_endpoint -** Processing line: ~ next_endpoint = heuristic.came_from[endpoint]~ +** Processing line: ~ next_endpoint = greedy.came_from[endpoint]~ - Inside source: true *** True Line Result - next_endpoint = heuristic.came_from[endpoint] + next_endpoint = greedy.came_from[endpoint] +** Processing line: ~ # Continue till there are no more cells~ +- Inside source: true +*** True Line Result + # Continue till there are no more cells +** 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: ~ # Calculates the path between the target and star for the a_star search~ +- Inside source: true +*** True Line Result + # Calculates the path between the target and star for the a_star search +** Processing line: ~ # Only called when the a_star search finds the target~ +- Inside source: true +*** True Line Result + # Only called when the a_star search finds the target +** Processing line: ~ def a_star_calc_path~ +- Inside source: true +*** True Line Result + def a_star_calc_path +** Processing line: ~ # Start from the target~ +- Inside source: true +*** True Line Result + # Start from the target +** Processing line: ~ endpoint = grid.target~ +- Inside source: true +*** True Line Result + endpoint = grid.target +** Processing line: ~ # And the cell it came from~ +- Inside source: true +*** True Line Result + # And the cell it came from +** Processing line: ~ next_endpoint = a_star.came_from[endpoint]~ +- Inside source: true +*** True Line Result + next_endpoint = a_star.came_from[endpoint] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ while endpoint and next_endpoint~ +- Inside source: true +*** True Line Result + while endpoint and next_endpoint +** Processing line: ~ # Draw a path between these two cells and store it~ +- Inside source: true +*** True Line Result + # Draw a path between these two cells and store it +** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ +- Inside source: true +*** True Line Result + path = get_path_between(endpoint, next_endpoint) +** Processing line: ~ a_star.path << path~ +- Inside source: true +*** True Line Result + a_star.path << path +** Processing line: ~ # And get the next pair of cells~ +- Inside source: true +*** True Line Result + # And get the next pair of cells +** Processing line: ~ endpoint = next_endpoint~ +- Inside source: true +*** True Line Result + endpoint = next_endpoint +** Processing line: ~ next_endpoint = a_star.came_from[endpoint]~ +- Inside source: true +*** True Line Result + next_endpoint = a_star.came_from[endpoint] ** Processing line: ~ # Continue till there are no more cells~ - Inside source: true *** True Line Result @@ -81172,30 +88419,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def buttons~ -- Inside source: true -*** True Line Result - def buttons -** Processing line: ~ state.buttons~ -- Inside source: true -*** True Line Result - state.buttons -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def slider~ +** Processing line: ~ def dijkstra~ - Inside source: true *** True Line Result - def slider -** Processing line: ~ state.slider~ + def dijkstra +** Processing line: ~ state.dijkstra~ - Inside source: true *** True Line Result - state.slider + state.dijkstra ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81204,14 +88435,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def bfs~ +** Processing line: ~ def greedy~ - Inside source: true *** True Line Result - def bfs -** Processing line: ~ state.bfs~ + def greedy +** Processing line: ~ state.greedy~ - Inside source: true *** True Line Result - state.bfs + state.greedy ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81220,14 +88451,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def heuristic~ +** Processing line: ~ def a_star~ - Inside source: true *** True Line Result - def heuristic -** Processing line: ~ state.heuristic~ + def a_star +** Processing line: ~ state.a_star~ - Inside source: true *** True Line Result - state.heuristic + state.a_star ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81288,22 +88519,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def frontier_color~ -- Inside source: true -*** True Line Result - def frontier_color -** Processing line: ~ [103, 136, 204] # Blue~ -- Inside source: true -*** True Line Result - [103, 136, 204] # Blue -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ def path_color~ - Inside source: true *** True Line Result @@ -81336,6 +88551,14 @@ 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: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ # Method that is called by DragonRuby periodically~ - Inside source: true *** True Line Result @@ -81384,18 +88607,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $heuristic ||= Heuristic.new(args)~ +** Processing line: ~ $a_star_algorithm ||= A_Star_Algorithm.new(args)~ - Inside source: true *** True Line Result - $heuristic ||= Heuristic.new(args) -** Processing line: ~ $heuristic.args = args~ + $a_star_algorithm ||= A_Star_Algorithm.new(args) +** Processing line: ~ $a_star_algorithm.args = args~ - Inside source: true *** True Line Result - $heuristic.args = args -** Processing line: ~ $heuristic.tick~ + $a_star_algorithm.args = args +** Processing line: ~ $a_star_algorithm.tick~ - Inside source: true *** True Line Result - $heuristic.tick + $a_star_algorithm.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81412,10 +88635,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def reset -** Processing line: ~ $heuristic = nil~ +** Processing line: ~ $a_star_algorithm = nil~ - Inside source: true *** True Line Result - $heuristic = nil + $a_star_algorithm = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81432,418 +88655,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: ~*** Path Finding Algorithms - A Star - main.rb~ +** Processing line: ~*** Path Finding Algorithms - Tower Defense - main.rb~ - Header detected. *** True Line Result - -*** True Line Result -*** Path Finding Algorithms - A Star - 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/13_path_finding_algorithms/08_a_star/app/main.rb~ -- Inside source: true -*** True Line Result - # ./samples/13_path_finding_algorithms/08_a_star/app/main.rb -** Processing line: ~ # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html~ -- Inside source: true -*** True Line Result - # This program is inspired by https://www.redblobgames.com/pathfinding/a-star/introduction.html -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # The A* Search works by incorporating both the distance from the starting point~ -- Inside source: true -*** True Line Result - # The A* Search works by incorporating both the distance from the starting point -** Processing line: ~ # and the distance from the target in its heurisitic.~ -- Inside source: true -*** True Line Result - # and the distance from the target in its heurisitic. -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # It tends to find the correct (shortest) path even when the Greedy Best-First Search does not,~ -- Inside source: true -*** True Line Result - # It tends to find the correct (shortest) path even when the Greedy Best-First Search does not, -** Processing line: ~ # and it explores less of the grid, and is therefore faster, than Dijkstra's Search.~ -- Inside source: true -*** True Line Result - # and it explores less of the grid, and is therefore faster, than Dijkstra's Search. -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ class A_Star_Algorithm~ -- Inside source: true -*** True Line Result - class A_Star_Algorithm -** Processing line: ~ attr_gtk~ -- Inside source: true -*** True Line Result - attr_gtk -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def tick~ -- Inside source: true -*** True Line Result - def tick -** Processing line: ~ defaults~ -- Inside source: true -*** True Line Result - defaults -** Processing line: ~ render~ -- Inside source: true -*** True Line Result - render -** Processing line: ~ input~ -- Inside source: true -*** True Line Result - input -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ if dijkstra.came_from.empty?~ -- Inside source: true -*** True Line Result - if dijkstra.came_from.empty? -** Processing line: ~ calc_searches~ -- Inside source: true -*** True Line Result - calc_searches -** 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 defaults~ -- Inside source: true -*** True Line Result - def defaults -** Processing line: ~ # Variables to edit the size and appearance of the grid~ -- Inside source: true -*** True Line Result - # Variables to edit the size and appearance of the grid -** Processing line: ~ # Freely customizable to user's liking~ -- Inside source: true -*** True Line Result - # Freely customizable to user's liking -** Processing line: ~ grid.width ||= 15~ -- Inside source: true -*** True Line Result - grid.width ||= 15 -** Processing line: ~ grid.height ||= 15~ -- Inside source: true -*** True Line Result - grid.height ||= 15 -** Processing line: ~ grid.cell_size ||= 27~ -- Inside source: true -*** True Line Result - grid.cell_size ||= 27 -** Processing line: ~ grid.rect ||= [0, 0, grid.width, grid.height]~ -- Inside source: true -*** True Line Result - grid.rect ||= [0, 0, grid.width, grid.height] -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ grid.star ||= [0, 2]~ -- Inside source: true -*** True Line Result - grid.star ||= [0, 2] -** Processing line: ~ grid.target ||= [11, 13]~ -- Inside source: true -*** True Line Result - grid.target ||= [11, 13] -** Processing line: ~ grid.walls ||= {~ -- Inside source: true -*** True Line Result - grid.walls ||= { -** Processing line: ~ [2, 2] => true,~ -- Inside source: true -*** True Line Result - [2, 2] => true, -** Processing line: ~ [3, 2] => true,~ -- Inside source: true -*** True Line Result - [3, 2] => true, -** Processing line: ~ [4, 2] => true,~ -- Inside source: true -*** True Line Result - [4, 2] => true, -** Processing line: ~ [5, 2] => true,~ -- Inside source: true -*** True Line Result - [5, 2] => true, -** Processing line: ~ [6, 2] => true,~ -- Inside source: true -*** True Line Result - [6, 2] => true, -** Processing line: ~ [7, 2] => true,~ -- Inside source: true -*** True Line Result - [7, 2] => true, -** Processing line: ~ [8, 2] => true,~ -- Inside source: true -*** True Line Result - [8, 2] => true, -** Processing line: ~ [9, 2] => true,~ -- Inside source: true -*** True Line Result - [9, 2] => true, -** Processing line: ~ [10, 2] => true,~ -- Inside source: true -*** True Line Result - [10, 2] => true, -** Processing line: ~ [11, 2] => true,~ -- Inside source: true -*** True Line Result - [11, 2] => true, -** Processing line: ~ [12, 2] => true,~ -- Inside source: true -*** True Line Result - [12, 2] => true, -** Processing line: ~ [12, 3] => true,~ -- Inside source: true -*** True Line Result - [12, 3] => true, -** Processing line: ~ [12, 4] => true,~ -- Inside source: true -*** True Line Result - [12, 4] => true, -** Processing line: ~ [12, 5] => true,~ -- Inside source: true -*** True Line Result - [12, 5] => true, -** Processing line: ~ [12, 6] => true,~ -- Inside source: true -*** True Line Result - [12, 6] => true, -** Processing line: ~ [12, 7] => true,~ -- Inside source: true + *** True Line Result - [12, 7] => true, -** Processing line: ~ [12, 8] => true,~ -- Inside source: true +*** Path Finding Algorithms - Tower Defense - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - [12, 8] => true, -** Processing line: ~ [12, 9] => true,~ -- Inside source: true + *** True Line Result - [12, 9] => true, -** Processing line: ~ [12, 10] => true,~ +#+begin_src ruby +** Processing line: ~ # ./samples/13_path_finding_algorithms/09_tower_defense/app/main.rb~ - Inside source: true *** True Line Result - [12, 10] => true, -** Processing line: ~ [12, 11] => true,~ + # ./samples/13_path_finding_algorithms/09_tower_defense/app/main.rb +** Processing line: ~ # An example of some major components in a tower defence game~ - Inside source: true *** True Line Result - [12, 11] => true, -** Processing line: ~ [12, 12] => true,~ + # An example of some major components in a tower defence game +** Processing line: ~ # The pathing of the tanks is determined by A* algorithm -- try editing the walls~ - Inside source: true *** True Line Result - [12, 12] => true, -** Processing line: ~ [5, 12] => true,~ + # The pathing of the tanks is determined by A* algorithm -- try editing the walls +** Processing line: ~~ - Inside source: true *** True Line Result - [5, 12] => true, -** Processing line: ~ [6, 12] => true,~ + +** Processing line: ~ # The turrets shoot bullets at the closest tank. The bullets are heat-seeking~ - Inside source: true *** True Line Result - [6, 12] => true, -** Processing line: ~ [7, 12] => true,~ + # The turrets shoot bullets at the closest tank. The bullets are heat-seeking +** Processing line: ~~ - Inside source: true *** True Line Result - [7, 12] => true, -** Processing line: ~ [8, 12] => true,~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - [8, 12] => true, -** Processing line: ~ [9, 12] => true,~ + def tick args +** Processing line: ~ $gtk.reset if args.inputs.keyboard.key_down.r~ - Inside source: true *** True Line Result - [9, 12] => true, -** Processing line: ~ [10, 12] => true,~ + $gtk.reset if args.inputs.keyboard.key_down.r +** Processing line: ~ defaults args~ - Inside source: true *** True Line Result - [10, 12] => true, -** Processing line: ~ [11, 12] => true,~ + defaults args +** Processing line: ~ render args~ - Inside source: true *** True Line Result - [11, 12] => true, -** Processing line: ~ [12, 12] => true~ + render args +** Processing line: ~ calc args~ - Inside source: true *** True Line Result - [12, 12] => true -** Processing line: ~ }~ + calc args +** Processing line: ~ end~ - Inside source: true *** True Line Result - } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # What the user is currently editing on the grid~ +** Processing line: ~ def defaults args~ - Inside source: true *** True Line Result - # What the user is currently editing on the grid -** Processing line: ~ # We store this value, because we want to remember the value even when~ + def defaults args +** Processing line: ~ args.outputs.background_color = wall_color~ - Inside source: true *** True Line Result - # We store this value, because we want to remember the value even when -** Processing line: ~ # the user's cursor is no longer over what they're interacting with, but~ + args.outputs.background_color = wall_color +** Processing line: ~ args.state.grid_size = 5~ - Inside source: true *** True Line Result - # the user's cursor is no longer over what they're interacting with, but -** Processing line: ~ # they are still clicking down on the mouse.~ + args.state.grid_size = 5 +** Processing line: ~ args.state.tile_size = 50~ - Inside source: true *** True Line Result - # they are still clicking down on the mouse. -** Processing line: ~ state.user_input ||= :none~ + args.state.tile_size = 50 +** Processing line: ~ args.state.grid_start ||= [0, 0]~ - Inside source: true *** True Line Result - state.user_input ||= :none -** Processing line: ~~ + args.state.grid_start ||= [0, 0] +** Processing line: ~ args.state.grid_goal ||= [4, 4]~ - Inside source: true *** True Line Result - -** Processing line: ~ # These variables allow the breadth first search to take place~ + args.state.grid_goal ||= [4, 4] +** Processing line: ~~ - Inside source: true *** True Line Result - # These variables allow the breadth first search to take place -** Processing line: ~ # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key.~ + +** Processing line: ~ # Try editing these walls to see the path change!~ - Inside source: true *** True Line Result - # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key. -** Processing line: ~ # Used to prevent searching cells that have already been found~ + # Try editing these walls to see the path change! +** Processing line: ~ args.state.walls ||= {~ - Inside source: true *** True Line Result - # Used to prevent searching cells that have already been found -** Processing line: ~ # and to trace a path from the target back to the starting point.~ + args.state.walls ||= { +** Processing line: ~ [0, 4] => true,~ - Inside source: true *** True Line Result - # and to trace a path from the target back to the starting point. -** Processing line: ~ # Frontier is an array of cells to expand the search from.~ + [0, 4] => true, +** Processing line: ~ [1, 3] => true,~ - Inside source: true *** True Line Result - # Frontier is an array of cells to expand the search from. -** Processing line: ~ # The search is over when there are no more cells to search from.~ + [1, 3] => true, +** Processing line: ~ [3, 1] => true,~ - Inside source: true *** True Line Result - # The search is over when there are no more cells to search from. -** Processing line: ~ # Path stores the path from the target to the star, once the target has been found~ + [3, 1] => true, +** Processing line: ~ # [4, 0] => true,~ - Inside source: true *** True Line Result - # Path stores the path from the target to the star, once the target has been found -** Processing line: ~ # It prevents calculating the path every tick.~ + # [4, 0] => true, +** Processing line: ~ }~ - Inside source: true *** True Line Result - # It prevents calculating the path every tick. -** Processing line: ~ dijkstra.came_from ||= {}~ + } +** Processing line: ~~ - Inside source: true *** True Line Result - dijkstra.came_from ||= {} -** Processing line: ~ dijkstra.cost_so_far ||= {}~ + +** Processing line: ~ args.state.a_star.frontier ||= []~ - Inside source: true *** True Line Result - dijkstra.cost_so_far ||= {} -** Processing line: ~ dijkstra.frontier ||= []~ + args.state.a_star.frontier ||= [] +** Processing line: ~ args.state.a_star.came_from ||= {}~ - Inside source: true *** True Line Result - dijkstra.frontier ||= [] -** Processing line: ~ dijkstra.path ||= []~ + args.state.a_star.came_from ||= {} +** Processing line: ~ args.state.a_star.path ||= []~ - Inside source: true *** True Line Result - dijkstra.path ||= [] + args.state.a_star.path ||= [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ greedy.came_from ||= {}~ +** Processing line: ~ args.state.tanks ||= []~ - Inside source: true *** True Line Result - greedy.came_from ||= {} -** Processing line: ~ greedy.frontier ||= []~ + args.state.tanks ||= [] +** Processing line: ~ args.state.tank_spawn_period ||= 60~ - Inside source: true *** True Line Result - greedy.frontier ||= [] -** Processing line: ~ greedy.path ||= []~ + args.state.tank_spawn_period ||= 60 +** Processing line: ~ args.state.tank_sprite_path ||= 'sprites/circle/white.png'~ - Inside source: true *** True Line Result - greedy.path ||= [] + args.state.tank_sprite_path ||= 'sprites/circle/white.png' +** Processing line: ~ args.state.tank_speed ||= 1~ +- Inside source: true +*** True Line Result + args.state.tank_speed ||= 1 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ a_star.frontier ||= []~ +** Processing line: ~ args.state.turret_shoot_period = 10~ - Inside source: true *** True Line Result - a_star.frontier ||= [] -** Processing line: ~ a_star.came_from ||= {}~ + args.state.turret_shoot_period = 10 +** Processing line: ~ # Turrets can be entered as [x, y] but are immediately mapped to hashes~ - Inside source: true *** True Line Result - a_star.came_from ||= {} -** Processing line: ~ a_star.path ||= []~ + # Turrets can be entered as [x, y] but are immediately mapped to hashes +** Processing line: ~ # Walls are also added where the turrets are to prevent tanks from pathing over them~ - Inside source: true *** True Line Result - a_star.path ||= [] -** Processing line: ~ end~ + # Walls are also added where the turrets are to prevent tanks from pathing over them +** Processing line: ~ args.state.turrets ||= [~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.turrets ||= [ +** Processing line: ~ [2, 2]~ - Inside source: true *** True Line Result - -** Processing line: ~ # All methods with render draw stuff on the screen~ + [2, 2] +** Processing line: ~ ].each { |turret| args.state.walls[turret] = true}.map do |x, y|~ - Inside source: true *** True Line Result - # All methods with render draw stuff on the screen -** Processing line: ~ # UI has buttons, the slider, and labels~ + ].each { |turret| args.state.walls[turret] = true}.map do |x, y| +** Processing line: ~ {~ - Inside source: true *** True Line Result - # UI has buttons, the slider, and labels -** Processing line: ~ # The search specific rendering occurs in the respective methods~ + { +** Processing line: ~ x: x * args.state.tile_size,~ - Inside source: true *** True Line Result - # The search specific rendering occurs in the respective methods -** Processing line: ~ def render~ + x: x * args.state.tile_size, +** Processing line: ~ y: y * args.state.tile_size,~ - Inside source: true *** True Line Result - def render -** Processing line: ~ render_labels~ + y: y * args.state.tile_size, +** Processing line: ~ w: args.state.tile_size,~ - Inside source: true *** True Line Result - render_labels -** Processing line: ~ render_dijkstra~ + w: args.state.tile_size, +** Processing line: ~ h: args.state.tile_size,~ - Inside source: true *** True Line Result - render_dijkstra -** Processing line: ~ render_greedy~ + h: args.state.tile_size, +** Processing line: ~ path: 'sprites/circle/gray.png',~ - Inside source: true *** True Line Result - render_greedy -** Processing line: ~ render_a_star~ + path: 'sprites/circle/gray.png', +** Processing line: ~ range: 100~ - Inside source: true *** True Line Result - render_a_star + range: 100 +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81852,130 +88879,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_labels~ +** Processing line: ~ args.state.bullet_size ||= 25~ - Inside source: true *** True Line Result - def render_labels -** Processing line: ~ outputs.labels << [150, 450, "Dijkstra's"]~ + args.state.bullet_size ||= 25 +** Processing line: ~ args.state.bullets ||= []~ - Inside source: true *** True Line Result - outputs.labels << [150, 450, "Dijkstra's"] -** Processing line: ~ outputs.labels << [550, 450, "Greedy Best-First"]~ + args.state.bullets ||= [] +** Processing line: ~ args.state.bullet_path ||= 'sprites/circle/orange.png'~ - Inside source: true *** True Line Result - outputs.labels << [550, 450, "Greedy Best-First"] -** Processing line: ~ outputs.labels << [1025, 450, "A* Search"]~ + args.state.bullet_path ||= 'sprites/circle/orange.png' +** Processing line: ~ #~ - Inside source: true *** True Line Result - outputs.labels << [1025, 450, "A* Search"] -** Processing line: ~ end~ + # +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_dijkstra~ -- Inside source: true -*** True Line Result - def render_dijkstra -** Processing line: ~ render_dijkstra_grid~ +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - render_dijkstra_grid -** Processing line: ~ render_dijkstra_star~ + def render args +** Processing line: ~ render_grid args~ - Inside source: true *** True Line Result - render_dijkstra_star -** Processing line: ~ render_dijkstra_target~ + render_grid args +** Processing line: ~ render_a_star args~ - Inside source: true *** True Line Result - render_dijkstra_target -** Processing line: ~ render_dijkstra_visited~ + render_a_star args +** Processing line: ~ args.outputs.sprites << args.state.tanks~ - Inside source: true *** True Line Result - render_dijkstra_visited -** Processing line: ~ render_dijkstra_walls~ + args.outputs.sprites << args.state.tanks +** Processing line: ~ args.outputs.sprites << args.state.turrets~ - Inside source: true *** True Line Result - render_dijkstra_walls -** Processing line: ~ render_dijkstra_path~ + args.outputs.sprites << args.state.turrets +** Processing line: ~ args.outputs.sprites << args.state.bullets~ - Inside source: true *** True Line Result - render_dijkstra_path -** Processing line: ~ end~ + args.outputs.sprites << args.state.bullets +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_greedy~ -- Inside source: true -*** True Line Result - def render_greedy -** Processing line: ~ render_greedy_grid~ -- Inside source: true -*** True Line Result - render_greedy_grid -** Processing line: ~ render_greedy_star~ +** Processing line: ~ def render_grid args~ - Inside source: true *** True Line Result - render_greedy_star -** Processing line: ~ render_greedy_target~ + def render_grid args +** Processing line: ~ # Draw a square the size and color of the grid~ - Inside source: true *** True Line Result - render_greedy_target -** Processing line: ~ render_greedy_visited~ + # Draw a square the size and color of the grid +** Processing line: ~ args.outputs.solids << [~ - Inside source: true *** True Line Result - render_greedy_visited -** Processing line: ~ render_greedy_walls~ + args.outputs.solids << [ +** Processing line: ~ 0,~ - Inside source: true *** True Line Result - render_greedy_walls -** Processing line: ~ render_greedy_path~ + 0, +** Processing line: ~ 0,~ - Inside source: true *** True Line Result - render_greedy_path -** Processing line: ~ end~ + 0, +** Processing line: ~ args.state.grid_size * args.state.tile_size,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.grid_size * args.state.tile_size, +** Processing line: ~ args.state.grid_size * args.state.tile_size,~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_a_star~ + args.state.grid_size * args.state.tile_size, +** Processing line: ~ grid_color~ - Inside source: true *** True Line Result - def render_a_star -** Processing line: ~ render_a_star_grid~ + grid_color +** Processing line: ~ ]~ - Inside source: true *** True Line Result - render_a_star_grid -** Processing line: ~ render_a_star_star~ + ] +** Processing line: ~~ - Inside source: true *** True Line Result - render_a_star_star -** Processing line: ~ render_a_star_target~ + +** Processing line: ~ # Draw lines across the grid to show tiles~ - Inside source: true *** True Line Result - render_a_star_target -** Processing line: ~ render_a_star_visited~ + # Draw lines across the grid to show tiles +** Processing line: ~ (args.state.grid_size + 1).times do | value |~ - Inside source: true *** True Line Result - render_a_star_visited -** Processing line: ~ render_a_star_walls~ + (args.state.grid_size + 1).times do | value | +** Processing line: ~ render_horizontal_line(args, value)~ - Inside source: true *** True Line Result - render_a_star_walls -** Processing line: ~ render_a_star_path~ + render_horizontal_line(args, value) +** Processing line: ~ render_vertical_line(args, value)~ - Inside source: true *** True Line Result - render_a_star_path + render_vertical_line(args, value) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -81984,286 +88999,278 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # This method handles user input every tick~ -- Inside source: true -*** True Line Result - # This method handles user input every tick -** Processing line: ~ def input~ -- Inside source: true -*** True Line Result - def input -** Processing line: ~ # If the mouse was lifted this tick~ +** Processing line: ~ # Render special tiles~ - Inside source: true *** True Line Result - # If the mouse was lifted this tick -** Processing line: ~ if inputs.mouse.up~ + # Render special tiles +** Processing line: ~ render_tile(args, args.state.grid_start, start_color)~ - Inside source: true *** True Line Result - if inputs.mouse.up -** Processing line: ~ # Set current input to none~ + render_tile(args, args.state.grid_start, start_color) +** Processing line: ~ render_tile(args, args.state.grid_goal, goal_color)~ - Inside source: true *** True Line Result - # Set current input to none -** Processing line: ~ state.user_input = :none~ + render_tile(args, args.state.grid_goal, goal_color) +** Processing line: ~ args.state.walls.keys.each { |wall| render_tile(args, wall, wall_color) }~ - Inside source: true *** True Line Result - state.user_input = :none -** Processing line: ~ end~ + args.state.walls.keys.each { |wall| render_tile(args, wall, wall_color) } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the mouse was clicked this tick~ -- Inside source: true -*** True Line Result - # If the mouse was clicked this tick -** Processing line: ~ if inputs.mouse.down~ +** Processing line: ~ def render_vertical_line args, x~ - Inside source: true *** True Line Result - if inputs.mouse.down -** Processing line: ~ # Determine what the user is editing and appropriately edit the state.user_input variable~ + def render_vertical_line args, x +** Processing line: ~ args.outputs.lines << [~ - Inside source: true *** True Line Result - # Determine what the user is editing and appropriately edit the state.user_input variable -** Processing line: ~ determine_input~ + args.outputs.lines << [ +** Processing line: ~ x * args.state.tile_size,~ - Inside source: true *** True Line Result - determine_input -** Processing line: ~ end~ + x * args.state.tile_size, +** Processing line: ~ 0,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + 0, +** Processing line: ~ x * args.state.tile_size,~ - Inside source: true *** True Line Result - -** Processing line: ~ # Process user input based on user_input variable and current mouse position~ + x * args.state.tile_size, +** Processing line: ~ args.state.tile_size * args.state.grid_size,~ - Inside source: true *** True Line Result - # Process user input based on user_input variable and current mouse position -** Processing line: ~ process_input~ + args.state.tile_size * args.state.grid_size, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - process_input -** Processing line: ~ end~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Determines what the user is editing~ +** Processing line: ~ def render_horizontal_line args, y~ - Inside source: true *** True Line Result - # Determines what the user is editing -** Processing line: ~ # This method is called when the mouse is clicked down~ + def render_horizontal_line args, y +** Processing line: ~ args.outputs.lines << [~ - Inside source: true *** True Line Result - # This method is called when the mouse is clicked down -** Processing line: ~ def determine_input~ + args.outputs.lines << [ +** Processing line: ~ 0,~ - Inside source: true *** True Line Result - def determine_input -** Processing line: ~ # If the mouse is over the star in the first grid~ + 0, +** Processing line: ~ y * args.state.tile_size,~ - Inside source: true *** True Line Result - # If the mouse is over the star in the first grid -** Processing line: ~ if dijkstra_mouse_over_star?~ + y * args.state.tile_size, +** Processing line: ~ args.state.tile_size * args.state.grid_size,~ - Inside source: true *** True Line Result - if dijkstra_mouse_over_star? -** Processing line: ~ # The user is editing the star from the first grid~ + args.state.tile_size * args.state.grid_size, +** Processing line: ~ y * args.state.tile_size,~ - Inside source: true *** True Line Result - # The user is editing the star from the first grid -** Processing line: ~ state.user_input = :dijkstra_star~ + y * args.state.tile_size, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - state.user_input = :dijkstra_star -** Processing line: ~ # If the mouse is over the star in the second grid~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If the mouse is over the star in the second grid -** Processing line: ~ elsif greedy_mouse_over_star?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif greedy_mouse_over_star? -** Processing line: ~ # The user is editing the star from the second grid~ + +** Processing line: ~ def render_tile args, tile, color~ - Inside source: true *** True Line Result - # The user is editing the star from the second grid -** Processing line: ~ state.user_input = :greedy_star~ + def render_tile args, tile, color +** Processing line: ~ args.outputs.solids << [~ - Inside source: true *** True Line Result - state.user_input = :greedy_star -** Processing line: ~ # If the mouse is over the star in the third grid~ + args.outputs.solids << [ +** Processing line: ~ tile.x * args.state.tile_size,~ - Inside source: true *** True Line Result - # If the mouse is over the star in the third grid -** Processing line: ~ elsif a_star_mouse_over_star?~ + tile.x * args.state.tile_size, +** Processing line: ~ tile.y * args.state.tile_size,~ - Inside source: true *** True Line Result - elsif a_star_mouse_over_star? -** Processing line: ~ # The user is editing the star from the third grid~ + tile.y * args.state.tile_size, +** Processing line: ~ args.state.tile_size,~ - Inside source: true *** True Line Result - # The user is editing the star from the third grid -** Processing line: ~ state.user_input = :a_star_star~ + args.state.tile_size, +** Processing line: ~ args.state.tile_size,~ - Inside source: true *** True Line Result - state.user_input = :a_star_star -** Processing line: ~ # If the mouse is over the target in the first grid~ + args.state.tile_size, +** Processing line: ~ color~ - Inside source: true *** True Line Result - # If the mouse is over the target in the first grid -** Processing line: ~ elsif dijkstra_mouse_over_target?~ + color +** Processing line: ~ ]~ - Inside source: true *** True Line Result - elsif dijkstra_mouse_over_target? -** Processing line: ~ # The user is editing the target from the first grid~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The user is editing the target from the first grid -** Processing line: ~ state.user_input = :dijkstra_target~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.user_input = :dijkstra_target -** Processing line: ~ # If the mouse is over the target in the second grid~ + +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - # If the mouse is over the target in the second grid -** Processing line: ~ elsif greedy_mouse_over_target?~ + def calc args +** Processing line: ~ calc_a_star args~ - Inside source: true *** True Line Result - elsif greedy_mouse_over_target? -** Processing line: ~ # The user is editing the target from the second grid~ + calc_a_star args +** Processing line: ~ calc_tanks args~ - Inside source: true *** True Line Result - # The user is editing the target from the second grid -** Processing line: ~ state.user_input = :greedy_target~ + calc_tanks args +** Processing line: ~ calc_turrets args~ - Inside source: true *** True Line Result - state.user_input = :greedy_target -** Processing line: ~ # If the mouse is over the target in the third grid~ + calc_turrets args +** Processing line: ~ calc_bullets args~ - Inside source: true *** True Line Result - # If the mouse is over the target in the third grid -** Processing line: ~ elsif a_star_mouse_over_target?~ + calc_bullets args +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif a_star_mouse_over_target? -** Processing line: ~ # The user is editing the target from the third grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is editing the target from the third grid -** Processing line: ~ state.user_input = :a_star_target~ + +** Processing line: ~ def calc_a_star args~ - Inside source: true *** True Line Result - state.user_input = :a_star_target -** Processing line: ~ # If the mouse is over a wall in the first grid~ + def calc_a_star args +** Processing line: ~ # Only does this one time~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the first grid -** Processing line: ~ elsif dijkstra_mouse_over_wall?~ + # Only does this one time +** Processing line: ~ return unless args.state.a_star.path.empty?~ - Inside source: true *** True Line Result - elsif dijkstra_mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the first grid~ + return unless args.state.a_star.path.empty? +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is removing a wall from the first grid -** Processing line: ~ state.user_input = :dijkstra_remove_wall~ + +** Processing line: ~ # Start the search from the grid start~ - Inside source: true *** True Line Result - state.user_input = :dijkstra_remove_wall -** Processing line: ~ # If the mouse is over a wall in the second grid~ + # Start the search from the grid start +** Processing line: ~ args.state.a_star.frontier << args.state.grid_start~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the second grid -** Processing line: ~ elsif greedy_mouse_over_wall?~ + args.state.a_star.frontier << args.state.grid_start +** Processing line: ~ args.state.a_star.came_from[args.state.grid_start] = nil~ - Inside source: true *** True Line Result - elsif greedy_mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the second grid~ + args.state.a_star.came_from[args.state.grid_start] = nil +** Processing line: ~~ - Inside source: true *** True Line Result - # The user is removing a wall from the second grid -** Processing line: ~ state.user_input = :greedy_remove_wall~ + +** Processing line: ~ # Until a path to the goal has been found or there are no more tiles to explore~ - Inside source: true *** True Line Result - state.user_input = :greedy_remove_wall -** Processing line: ~ # If the mouse is over a wall in the third grid~ + # Until a path to the goal has been found or there are no more tiles to explore +** Processing line: ~ until (args.state.a_star.came_from.has_key?(args.state.grid_goal)|| args.state.a_star.frontier.empty?)~ - Inside source: true *** True Line Result - # If the mouse is over a wall in the third grid -** Processing line: ~ elsif a_star_mouse_over_wall?~ + until (args.state.a_star.came_from.has_key?(args.state.grid_goal)|| args.state.a_star.frontier.empty?) +** Processing line: ~ # For the first tile in the frontier~ - Inside source: true *** True Line Result - elsif a_star_mouse_over_wall? -** Processing line: ~ # The user is removing a wall from the third grid~ + # For the first tile in the frontier +** Processing line: ~ tile_to_expand_from = args.state.a_star.frontier.shift~ - Inside source: true *** True Line Result - # The user is removing a wall from the third grid -** Processing line: ~ state.user_input = :a_star_remove_wall~ + tile_to_expand_from = args.state.a_star.frontier.shift +** Processing line: ~ # Add each of its neighbors to the frontier~ - Inside source: true *** True Line Result - state.user_input = :a_star_remove_wall -** Processing line: ~ # If the mouse is over the first grid~ + # Add each of its neighbors to the frontier +** Processing line: ~ neighbors(args, tile_to_expand_from).each do | tile |~ - Inside source: true *** True Line Result - # If the mouse is over the first grid -** Processing line: ~ elsif dijkstra_mouse_over_grid?~ + neighbors(args, tile_to_expand_from).each do | tile | +** Processing line: ~ args.state.a_star.frontier << tile~ - Inside source: true *** True Line Result - elsif dijkstra_mouse_over_grid? -** Processing line: ~ # The user is adding a wall from the first grid~ + args.state.a_star.frontier << tile +** Processing line: ~ args.state.a_star.came_from[tile] = tile_to_expand_from~ - Inside source: true *** True Line Result - # The user is adding a wall from the first grid -** Processing line: ~ state.user_input = :dijkstra_add_wall~ + args.state.a_star.came_from[tile] = tile_to_expand_from +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.user_input = :dijkstra_add_wall -** Processing line: ~ # If the mouse is over the second grid~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If the mouse is over the second grid -** Processing line: ~ elsif greedy_mouse_over_grid?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif greedy_mouse_over_grid? -** Processing line: ~ # The user is adding a wall from the second grid~ + +** Processing line: ~ # Stop calculating a path if the goal was never reached~ - Inside source: true *** True Line Result - # The user is adding a wall from the second grid -** Processing line: ~ state.user_input = :greedy_add_wall~ + # Stop calculating a path if the goal was never reached +** Processing line: ~ return unless args.state.a_star.came_from.has_key? args.state.grid_goal~ - Inside source: true *** True Line Result - state.user_input = :greedy_add_wall -** Processing line: ~ # If the mouse is over the third grid~ + return unless args.state.a_star.came_from.has_key? args.state.grid_goal +** Processing line: ~~ - Inside source: true *** True Line Result - # If the mouse is over the third grid -** Processing line: ~ elsif a_star_mouse_over_grid?~ + +** Processing line: ~ # Fill path by tracing back from the goal~ - Inside source: true *** True Line Result - elsif a_star_mouse_over_grid? -** Processing line: ~ # The user is adding a wall from the third grid~ + # Fill path by tracing back from the goal +** Processing line: ~ current_cell = args.state.grid_goal~ - Inside source: true *** True Line Result - # The user is adding a wall from the third grid -** Processing line: ~ state.user_input = :a_star_add_wall~ + current_cell = args.state.grid_goal +** Processing line: ~ while current_cell~ - Inside source: true *** True Line Result - state.user_input = :a_star_add_wall -** Processing line: ~ end~ + while current_cell +** Processing line: ~ args.state.a_star.path.unshift current_cell~ - Inside source: true *** True Line Result - end + args.state.a_star.path.unshift current_cell +** Processing line: ~ current_cell = args.state.a_star.came_from[current_cell]~ +- Inside source: true +*** True Line Result + current_cell = args.state.a_star.came_from[current_cell] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -82272,110 +89279,102 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Processes click and drag based on what the user is currently dragging~ -- Inside source: true -*** True Line Result - # Processes click and drag based on what the user is currently dragging -** Processing line: ~ def process_input~ -- Inside source: true -*** True Line Result - def process_input -** Processing line: ~ if state.user_input == :dijkstra_star~ +** Processing line: ~ puts "The path has been calculated"~ - Inside source: true *** True Line Result - if state.user_input == :dijkstra_star -** Processing line: ~ process_input_dijkstra_star~ + puts "The path has been calculated" +** Processing line: ~ puts args.state.a_star.path~ - Inside source: true *** True Line Result - process_input_dijkstra_star -** Processing line: ~ elsif state.user_input == :greedy_star~ + puts args.state.a_star.path +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif state.user_input == :greedy_star -** Processing line: ~ process_input_greedy_star~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - process_input_greedy_star -** Processing line: ~ elsif state.user_input == :a_star_star~ + +** Processing line: ~ def calc_tanks args~ - Inside source: true *** True Line Result - elsif state.user_input == :a_star_star -** Processing line: ~ process_input_a_star_star~ + def calc_tanks args +** Processing line: ~ spawn_tank args~ - Inside source: true *** True Line Result - process_input_a_star_star -** Processing line: ~ elsif state.user_input == :dijkstra_target~ + spawn_tank args +** Processing line: ~ move_tanks args~ - Inside source: true *** True Line Result - elsif state.user_input == :dijkstra_target -** Processing line: ~ process_input_dijkstra_target~ + move_tanks args +** Processing line: ~ end~ - Inside source: true *** True Line Result - process_input_dijkstra_target -** Processing line: ~ elsif state.user_input == :greedy_target~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - elsif state.user_input == :greedy_target -** Processing line: ~ process_input_greedy_target~ + +** Processing line: ~ def move_tanks args~ - Inside source: true *** True Line Result - process_input_greedy_target -** Processing line: ~ elsif state.user_input == :a_star_target~ + def move_tanks args +** Processing line: ~ # Remove tanks that have reached the end of their path~ - Inside source: true *** True Line Result - elsif state.user_input == :a_star_target -** Processing line: ~ process_input_a_star_target~ + # Remove tanks that have reached the end of their path +** Processing line: ~ args.state.tanks.reject! { |tank| tank[:a_star].empty? }~ - Inside source: true *** True Line Result - process_input_a_star_target -** Processing line: ~ elsif state.user_input == :dijkstra_remove_wall~ + args.state.tanks.reject! { |tank| tank[:a_star].empty? } +** Processing line: ~~ - Inside source: true *** True Line Result - elsif state.user_input == :dijkstra_remove_wall -** Processing line: ~ process_input_dijkstra_remove_wall~ + +** Processing line: ~ # Tanks have an array that has each tile it has to go to in order from a* path~ - Inside source: true *** True Line Result - process_input_dijkstra_remove_wall -** Processing line: ~ elsif state.user_input == :greedy_remove_wall~ + # Tanks have an array that has each tile it has to go to in order from a* path +** Processing line: ~ args.state.tanks.each do | tank |~ - Inside source: true *** True Line Result - elsif state.user_input == :greedy_remove_wall -** Processing line: ~ process_input_greedy_remove_wall~ + args.state.tanks.each do | tank | +** Processing line: ~ destination = tank[:a_star][0]~ - Inside source: true *** True Line Result - process_input_greedy_remove_wall -** Processing line: ~ elsif state.user_input == :a_star_remove_wall~ + destination = tank[:a_star][0] +** Processing line: ~ # Move the tank towards the destination~ - Inside source: true *** True Line Result - elsif state.user_input == :a_star_remove_wall -** Processing line: ~ process_input_a_star_remove_wall~ + # Move the tank towards the destination +** Processing line: ~ tank[:x] += copy_sign(args.state.tank_speed, ((destination.x * args.state.tile_size) - tank[:x]))~ - Inside source: true *** True Line Result - process_input_a_star_remove_wall -** Processing line: ~ elsif state.user_input == :dijkstra_add_wall~ + tank[:x] += copy_sign(args.state.tank_speed, ((destination.x * args.state.tile_size) - tank[:x])) +** Processing line: ~ tank[:y] += copy_sign(args.state.tank_speed, ((destination.y * args.state.tile_size) - tank[:y]))~ - Inside source: true *** True Line Result - elsif state.user_input == :dijkstra_add_wall -** Processing line: ~ process_input_dijkstra_add_wall~ + tank[:y] += copy_sign(args.state.tank_speed, ((destination.y * args.state.tile_size) - tank[:y])) +** Processing line: ~ # If the tank has reached its destination~ - Inside source: true *** True Line Result - process_input_dijkstra_add_wall -** Processing line: ~ elsif state.user_input == :greedy_add_wall~ + # If the tank has reached its destination +** Processing line: ~ if (destination.x * args.state.tile_size) == tank[:x] and~ - Inside source: true *** True Line Result - elsif state.user_input == :greedy_add_wall -** Processing line: ~ process_input_greedy_add_wall~ + if (destination.x * args.state.tile_size) == tank[:x] and +** Processing line: ~ (destination.y * args.state.tile_size) == tank[:y]~ - Inside source: true *** True Line Result - process_input_greedy_add_wall -** Processing line: ~ elsif state.user_input == :a_star_add_wall~ + (destination.y * args.state.tile_size) == tank[:y] +** Processing line: ~ # Set the destination to the next point in the path~ - Inside source: true *** True Line Result - elsif state.user_input == :a_star_add_wall -** Processing line: ~ process_input_a_star_add_wall~ + # Set the destination to the next point in the path +** Processing line: ~ tank[:a_star].shift~ - Inside source: true *** True Line Result - process_input_a_star_add_wall + tank[:a_star].shift ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -82384,118 +89383,114 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_dijkstra_grid~ +** Processing line: ~ def calc_turrets args~ - Inside source: true *** True Line Result - def render_dijkstra_grid -** Processing line: ~ # A large rect the size of the grid~ + def calc_turrets args +** Processing line: ~ return unless args.state.tick_count.mod_zero? args.state.turret_shoot_period~ - Inside source: true *** True Line Result - # A large rect the size of the grid -** Processing line: ~ outputs.solids << [dijkstra_scale_up(grid.rect), default_color]~ + return unless args.state.tick_count.mod_zero? args.state.turret_shoot_period +** Processing line: ~ args.state.turrets.each do | turret |~ - Inside source: true *** True Line Result - outputs.solids << [dijkstra_scale_up(grid.rect), default_color] -** Processing line: ~~ + args.state.turrets.each do | turret | +** Processing line: ~ # Finds the closest tank~ - Inside source: true *** True Line Result - -** Processing line: ~ # The vertical grid lines~ + # Finds the closest tank +** Processing line: ~ target = nil~ - Inside source: true *** True Line Result - # The vertical grid lines -** Processing line: ~ for x in 0..grid.width~ + target = nil +** Processing line: ~ shortest_distance = turret[:range] + 1~ - Inside source: true *** True Line Result - for x in 0..grid.width -** Processing line: ~ outputs.lines << dijkstra_vertical_line(x)~ + shortest_distance = turret[:range] + 1 +** Processing line: ~ args.state.tanks.each do | tank |~ - Inside source: true *** True Line Result - outputs.lines << dijkstra_vertical_line(x) -** Processing line: ~ end~ + args.state.tanks.each do | tank | +** Processing line: ~ distance = distance_between(turret[:x], turret[:y], tank[:x], tank[:y])~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + distance = distance_between(turret[:x], turret[:y], tank[:x], tank[:y]) +** Processing line: ~ if distance < shortest_distance~ - Inside source: true *** True Line Result - -** Processing line: ~ # The horizontal grid lines~ + if distance < shortest_distance +** Processing line: ~ target = tank~ - Inside source: true *** True Line Result - # The horizontal grid lines -** Processing line: ~ for y in 0..grid.height~ + target = tank +** Processing line: ~ shortest_distance = distance~ - Inside source: true *** True Line Result - for y in 0..grid.height -** Processing line: ~ outputs.lines << dijkstra_horizontal_line(y)~ + shortest_distance = distance +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.lines << dijkstra_horizontal_line(y) + 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 render_greedy_grid~ +** Processing line: ~ # If there is a tank in range, fires a bullet~ - Inside source: true *** True Line Result - def render_greedy_grid -** Processing line: ~ # A large rect the size of the grid~ + # If there is a tank in range, fires a bullet +** Processing line: ~ if target~ - Inside source: true *** True Line Result - # A large rect the size of the grid -** Processing line: ~ outputs.solids << [greedy_scale_up(grid.rect), default_color]~ + if target +** Processing line: ~ args.state.bullets << {~ - Inside source: true *** True Line Result - outputs.solids << [greedy_scale_up(grid.rect), default_color] -** Processing line: ~~ + args.state.bullets << { +** Processing line: ~ x: turret[:x],~ - Inside source: true *** True Line Result - -** Processing line: ~ # The vertical grid lines~ + x: turret[:x], +** Processing line: ~ y: turret[:y],~ - Inside source: true *** True Line Result - # The vertical grid lines -** Processing line: ~ for x in 0..grid.width~ + y: turret[:y], +** Processing line: ~ w: args.state.bullet_size,~ - Inside source: true *** True Line Result - for x in 0..grid.width -** Processing line: ~ outputs.lines << greedy_vertical_line(x)~ + w: args.state.bullet_size, +** Processing line: ~ h: args.state.bullet_size,~ - Inside source: true *** True Line Result - outputs.lines << greedy_vertical_line(x) -** Processing line: ~ end~ + h: args.state.bullet_size, +** Processing line: ~ path: args.state.bullet_path,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + path: args.state.bullet_path, +** Processing line: ~ # Note that this makes it heat-seeking, because target is passed by reference~ - Inside source: true *** True Line Result - -** Processing line: ~ # The horizontal grid lines~ + # Note that this makes it heat-seeking, because target is passed by reference +** Processing line: ~ # Could do target.clone to make the bullet go to where the tank initially was~ - Inside source: true *** True Line Result - # The horizontal grid lines -** Processing line: ~ for y in 0..grid.height~ + # Could do target.clone to make the bullet go to where the tank initially was +** Processing line: ~ target: target~ - Inside source: true *** True Line Result - for y in 0..grid.height -** Processing line: ~ outputs.lines << greedy_horizontal_line(y)~ + target: target +** Processing line: ~ }~ - Inside source: true *** True Line Result - outputs.lines << greedy_horizontal_line(y) + } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -82504,802 +89499,858 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_a_star_grid~ +** Processing line: ~ def calc_bullets args~ - Inside source: true *** True Line Result - def render_a_star_grid -** Processing line: ~ # A large rect the size of the grid~ + def calc_bullets args +** Processing line: ~ # Bullets aim for the center of their targets~ - Inside source: true *** True Line Result - # A large rect the size of the grid -** Processing line: ~ outputs.solids << [a_star_scale_up(grid.rect), default_color]~ + # Bullets aim for the center of their targets +** Processing line: ~ args.state.bullets.each { |bullet| move bullet, center_of(bullet[:target])}~ - Inside source: true *** True Line Result - outputs.solids << [a_star_scale_up(grid.rect), default_color] + args.state.bullets.each { |bullet| move bullet, center_of(bullet[:target])} +** Processing line: ~ args.state.bullets.reject! { |b| b.intersect_rect? b[:target] }~ +- Inside source: true +*** True Line Result + args.state.bullets.reject! { |b| b.intersect_rect? b[:target] } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The vertical grid lines~ +** Processing line: ~ def center_of object~ - Inside source: true *** True Line Result - # The vertical grid lines -** Processing line: ~ for x in 0..grid.width~ + def center_of object +** Processing line: ~ object = object.clone~ - Inside source: true *** True Line Result - for x in 0..grid.width -** Processing line: ~ outputs.lines << a_star_vertical_line(x)~ + object = object.clone +** Processing line: ~ object[:x] += 0.5~ - Inside source: true *** True Line Result - outputs.lines << a_star_vertical_line(x) -** Processing line: ~ end~ + object[:x] += 0.5 +** Processing line: ~ object[:y] += 0.5~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + object[:y] += 0.5 +** Processing line: ~ object~ - Inside source: true *** True Line Result - -** Processing line: ~ # The horizontal grid lines~ + object +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The horizontal grid lines -** Processing line: ~ for y in 0..grid.height~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - for y in 0..grid.height -** Processing line: ~ outputs.lines << a_star_horizontal_line(y)~ + +** Processing line: ~ def render_a_star args~ - Inside source: true *** True Line Result - outputs.lines << a_star_horizontal_line(y) -** Processing line: ~ end~ + def render_a_star args +** Processing line: ~ args.state.a_star.path.map do |tile|~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.a_star.path.map do |tile| +** Processing line: ~ # Map each x, y coordinate to the center of the tile and scale up~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Map each x, y coordinate to the center of the tile and scale up +** Processing line: ~ [(tile.x + 0.5) * args.state.tile_size, (tile.y + 0.5) * args.state.tile_size]~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a vertical line for a column of the first grid~ + [(tile.x + 0.5) * args.state.tile_size, (tile.y + 0.5) * args.state.tile_size] +** Processing line: ~ end.inject do | point_a, point_b |~ - Inside source: true *** True Line Result - # Returns a vertical line for a column of the first grid -** Processing line: ~ def dijkstra_vertical_line column~ + end.inject do | point_a, point_b | +** Processing line: ~ # Render the line between each point~ - Inside source: true *** True Line Result - def dijkstra_vertical_line column -** Processing line: ~ dijkstra_scale_up([column, 0, column, grid.height])~ + # Render the line between each point +** Processing line: ~ args.outputs.lines << [point_a.x, point_a.y, point_b.x, point_b.y, a_star_color]~ - Inside source: true *** True Line Result - dijkstra_scale_up([column, 0, column, grid.height]) + args.outputs.lines << [point_a.x, point_a.y, point_b.x, point_b.y, a_star_color] +** Processing line: ~ point_b~ +- Inside source: true +*** True Line Result + point_b ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns a horizontal line for a column of the first grid~ +** Processing line: ~ # Moves object to target at speed~ - Inside source: true *** True Line Result - # Returns a horizontal line for a column of the first grid -** Processing line: ~ def dijkstra_horizontal_line row~ + # Moves object to target at speed +** Processing line: ~ def move object, target, speed = 1~ - Inside source: true *** True Line Result - def dijkstra_horizontal_line row -** Processing line: ~ dijkstra_scale_up([0, row, grid.width, row])~ + def move object, target, speed = 1 +** Processing line: ~ if target.is_a? Hash~ - Inside source: true *** True Line Result - dijkstra_scale_up([0, row, grid.width, row]) -** Processing line: ~ end~ + if target.is_a? Hash +** Processing line: ~ object[:x] += copy_sign(speed, target[:x] - object[:x])~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + object[:x] += copy_sign(speed, target[:x] - object[:x]) +** Processing line: ~ object[:y] += copy_sign(speed, target[:y] - object[:y])~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a vertical line for a column of the second grid~ + object[:y] += copy_sign(speed, target[:y] - object[:y]) +** Processing line: ~ else~ - Inside source: true *** True Line Result - # Returns a vertical line for a column of the second grid -** Processing line: ~ def greedy_vertical_line column~ + else +** Processing line: ~ object[:x] += copy_sign(speed, target.x - object[:x])~ - Inside source: true *** True Line Result - def greedy_vertical_line column -** Processing line: ~ dijkstra_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height])~ + object[:x] += copy_sign(speed, target.x - object[:x]) +** Processing line: ~ object[:y] += copy_sign(speed, target.y - object[:y])~ - Inside source: true *** True Line Result - dijkstra_scale_up([column + grid.width + 1, 0, column + grid.width + 1, grid.height]) + object[:y] += copy_sign(speed, target.y - object[:y]) ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a horizontal line for a column of the second grid~ + end +** Processing line: ~ #~ - Inside source: true *** True Line Result - # Returns a horizontal line for a column of the second grid -** Processing line: ~ def greedy_horizontal_line row~ + # +** Processing line: ~ #~ - Inside source: true *** True Line Result - def greedy_horizontal_line row -** Processing line: ~ dijkstra_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row])~ + # +** Processing line: ~ def distance_between a_x, a_y, b_x, b_y~ - Inside source: true *** True Line Result - dijkstra_scale_up([grid.width + 1, row, grid.width + grid.width + 1, row]) -** Processing line: ~ end~ + def distance_between a_x, a_y, b_x, b_y +** Processing line: ~ (((b_x - a_x) ** 2) + ((b_y - a_y) ** 2)) ** 0.5~ - Inside source: true *** True Line Result - end + (((b_x - a_x) ** 2) + ((b_y - a_y) ** 2)) ** 0.5 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns a vertical line for a column of the third grid~ +** Processing line: ~ def copy_sign value, sign~ - Inside source: true *** True Line Result - # Returns a vertical line for a column of the third grid -** Processing line: ~ def a_star_vertical_line column~ + def copy_sign value, sign +** Processing line: ~ return 0 if sign == 0~ - Inside source: true *** True Line Result - def a_star_vertical_line column -** Processing line: ~ dijkstra_scale_up([column + (grid.width * 2) + 2, 0, column + (grid.width * 2) + 2, grid.height])~ + return 0 if sign == 0 +** Processing line: ~ return value if sign > 0~ - Inside source: true *** True Line Result - dijkstra_scale_up([column + (grid.width * 2) + 2, 0, column + (grid.width * 2) + 2, grid.height]) -** Processing line: ~ end~ + return value if sign > 0 +** Processing line: ~ -value~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + -value +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns a horizontal line for a column of the third grid~ + end +** Processing line: ~ #~ - Inside source: true *** True Line Result - # Returns a horizontal line for a column of the third grid -** Processing line: ~ def a_star_horizontal_line row~ + # +** Processing line: ~ def spawn_tank args~ - Inside source: true *** True Line Result - def a_star_horizontal_line row -** Processing line: ~ dijkstra_scale_up([(grid.width * 2) + 2, row, (grid.width * 2) + grid.width + 2, row])~ + def spawn_tank args +** Processing line: ~ return unless args.state.tick_count.mod_zero? args.state.tank_spawn_period~ - Inside source: true *** True Line Result - dijkstra_scale_up([(grid.width * 2) + 2, row, (grid.width * 2) + grid.width + 2, row]) -** Processing line: ~ end~ + return unless args.state.tick_count.mod_zero? args.state.tank_spawn_period +** Processing line: ~ args.state.tanks << {~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.tanks << { +** Processing line: ~ x: args.state.grid_start.x,~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the star on the first grid~ + x: args.state.grid_start.x, +** Processing line: ~ y: args.state.grid_start.y,~ - Inside source: true *** True Line Result - # Renders the star on the first grid -** Processing line: ~ def render_dijkstra_star~ + y: args.state.grid_start.y, +** Processing line: ~ w: args.state.tile_size,~ - Inside source: true *** True Line Result - def render_dijkstra_star -** Processing line: ~ outputs.sprites << [dijkstra_scale_up(grid.star), 'star.png']~ + w: args.state.tile_size, +** Processing line: ~ h: args.state.tile_size,~ - Inside source: true *** True Line Result - outputs.sprites << [dijkstra_scale_up(grid.star), 'star.png'] -** Processing line: ~ end~ + h: args.state.tile_size, +** Processing line: ~ path: args.state.tank_sprite_path,~ - Inside source: true *** True Line Result - end + path: args.state.tank_sprite_path, +** Processing line: ~ a_star: args.state.a_star.path.clone~ +- Inside source: true +*** True Line Result + a_star: args.state.a_star.path.clone +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the star on the second grid~ +** Processing line: ~ def neighbors args, tile~ - Inside source: true *** True Line Result - # Renders the star on the second grid -** Processing line: ~ def render_greedy_star~ + def neighbors args, tile +** Processing line: ~ [[tile.x, tile.y - 1],~ - Inside source: true *** True Line Result - def render_greedy_star -** Processing line: ~ outputs.sprites << [greedy_scale_up(grid.star), 'star.png']~ + [[tile.x, tile.y - 1], +** Processing line: ~ [tile.x, tile.y + 1],~ - Inside source: true *** True Line Result - outputs.sprites << [greedy_scale_up(grid.star), 'star.png'] -** Processing line: ~ end~ + [tile.x, tile.y + 1], +** Processing line: ~ [tile.x + 1, tile.y],~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [tile.x + 1, tile.y], +** Processing line: ~ [tile.x - 1, tile.y]].reject do | neighbor |~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the star on the third grid~ + [tile.x - 1, tile.y]].reject do | neighbor | +** Processing line: ~ args.state.a_star.came_from.has_key?(neighbor) or~ - Inside source: true *** True Line Result - # Renders the star on the third grid -** Processing line: ~ def render_a_star_star~ + args.state.a_star.came_from.has_key?(neighbor) or +** Processing line: ~ tile_out_of_bounds?(args, neighbor) or~ - Inside source: true *** True Line Result - def render_a_star_star -** Processing line: ~ outputs.sprites << [a_star_scale_up(grid.star), 'star.png']~ + tile_out_of_bounds?(args, neighbor) or +** Processing line: ~ args.state.walls.has_key? neighbor~ - Inside source: true *** True Line Result - outputs.sprites << [a_star_scale_up(grid.star), 'star.png'] + args.state.walls.has_key? neighbor ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the target on the first grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Renders the target on the first grid -** Processing line: ~ def render_dijkstra_target~ + +** Processing line: ~ def tile_out_of_bounds? args, tile~ - Inside source: true *** True Line Result - def render_dijkstra_target -** Processing line: ~ outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png']~ + def tile_out_of_bounds? args, tile +** Processing line: ~ tile.x < 0 or tile.y < 0 or tile.x >= args.state.grid_size or tile.y >= args.state.grid_size~ - Inside source: true *** True Line Result - outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png'] -** Processing line: ~ end~ + tile.x < 0 or tile.y < 0 or tile.x >= args.state.grid_size or tile.y >= args.state.grid_size +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the target on the second grid~ -- Inside source: true -*** True Line Result - # Renders the target on the second grid -** Processing line: ~ def render_greedy_target~ +** Processing line: ~ def grid_color~ - Inside source: true *** True Line Result - def render_greedy_target -** Processing line: ~ outputs.sprites << [greedy_scale_up(grid.target), 'target.png']~ + def grid_color +** Processing line: ~ [133, 226, 144]~ - Inside source: true *** True Line Result - outputs.sprites << [greedy_scale_up(grid.target), 'target.png'] -** Processing line: ~ end~ + [133, 226, 144] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the target on the third grid~ -- Inside source: true -*** True Line Result - # Renders the target on the third grid -** Processing line: ~ def render_a_star_target~ +** Processing line: ~ def start_color~ - Inside source: true *** True Line Result - def render_a_star_target -** Processing line: ~ outputs.sprites << [a_star_scale_up(grid.target), 'target.png']~ + def start_color +** Processing line: ~ [226, 144, 133]~ - Inside source: true *** True Line Result - outputs.sprites << [a_star_scale_up(grid.target), 'target.png'] -** Processing line: ~ end~ + [226, 144, 133] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the walls on the first grid~ +** Processing line: ~ def goal_color~ - Inside source: true *** True Line Result - # Renders the walls on the first grid -** Processing line: ~ def render_dijkstra_walls~ + def goal_color +** Processing line: ~ [226, 133, 144]~ - Inside source: true *** True Line Result - def render_dijkstra_walls -** Processing line: ~ grid.walls.each_key do | wall |~ + [226, 133, 144] +** Processing line: ~ end~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ outputs.solids << [dijkstra_scale_up(wall), wall_color]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.solids << [dijkstra_scale_up(wall), wall_color] -** Processing line: ~ end~ + +** Processing line: ~ def wall_color~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def wall_color +** Processing line: ~ [133, 144, 226]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [133, 144, 226] +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the walls on the second grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Renders the walls on the second grid -** Processing line: ~ def render_greedy_walls~ + +** Processing line: ~ def a_star_color~ - Inside source: true *** True Line Result - def render_greedy_walls -** Processing line: ~ grid.walls.each_key do | wall |~ + def a_star_color +** Processing line: ~ [0, 0, 255]~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ outputs.solids << [greedy_scale_up(wall), wall_color]~ + [0, 0, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.solids << [greedy_scale_up(wall), wall_color] -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - end +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ # Renders the walls on the third grid~ -- Inside source: true +** Processing line: ~*** 3d - 3d Cube - main.rb~ +- Header detected. *** True Line Result - # Renders the walls on the third grid -** Processing line: ~ def render_a_star_walls~ -- Inside source: true + *** True Line Result - def render_a_star_walls -** Processing line: ~ grid.walls.each_key do | wall |~ +*** 3d - 3d Cube - 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_3d/01_3d_cube/app/main.rb~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ outputs.solids << [a_star_scale_up(wall), wall_color]~ + # ./samples/99_genre_3d/01_3d_cube/app/main.rb +** Processing line: ~ STARTX = 0.0~ - Inside source: true *** True Line Result - outputs.solids << [a_star_scale_up(wall), wall_color] -** Processing line: ~ end~ + STARTX = 0.0 +** Processing line: ~ STARTY = 0.0~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + STARTY = 0.0 +** Processing line: ~ ENDY = 20.0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + ENDY = 20.0 +** Processing line: ~ ENDX = 20.0~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the visited cells on the first grid~ + ENDX = 20.0 +** Processing line: ~ SPINPOINT = 10~ - Inside source: true *** True Line Result - # Renders the visited cells on the first grid -** Processing line: ~ def render_dijkstra_visited~ + SPINPOINT = 10 +** Processing line: ~ SPINDURATION = 400~ - Inside source: true *** True Line Result - def render_dijkstra_visited -** Processing line: ~ dijkstra.came_from.each_key do | visited_cell |~ + SPINDURATION = 400 +** Processing line: ~ POINTSIZE = 8~ - Inside source: true *** True Line Result - dijkstra.came_from.each_key do | visited_cell | -** Processing line: ~ outputs.solids << [dijkstra_scale_up(visited_cell), visited_color]~ + POINTSIZE = 8 +** Processing line: ~ BOXDEPTH = 40~ - Inside source: true *** True Line Result - outputs.solids << [dijkstra_scale_up(visited_cell), visited_color] -** Processing line: ~ end~ + BOXDEPTH = 40 +** Processing line: ~ YAW = 1~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + YAW = 1 +** Processing line: ~ DISTANCE = 10~ - Inside source: true *** True Line Result - end + DISTANCE = 10 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Renders the visited cells on the second grid~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - # Renders the visited cells on the second grid -** Processing line: ~ def render_greedy_visited~ + def tick args +** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - def render_greedy_visited -** Processing line: ~ greedy.came_from.each_key do | visited_cell |~ + args.outputs.background_color = [0, 0, 0] +** Processing line: ~ a = Math.sin(args.state.tick_count / SPINDURATION) * Math.tan(args.state.tick_count / SPINDURATION)~ - Inside source: true *** True Line Result - greedy.came_from.each_key do | visited_cell | -** Processing line: ~ outputs.solids << [greedy_scale_up(visited_cell), visited_color]~ + a = Math.sin(args.state.tick_count / SPINDURATION) * Math.tan(args.state.tick_count / SPINDURATION) +** Processing line: ~ s = Math.sin(a)~ - Inside source: true *** True Line Result - outputs.solids << [greedy_scale_up(visited_cell), visited_color] -** Processing line: ~ end~ + s = Math.sin(a) +** Processing line: ~ c = Math.cos(a)~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + c = Math.cos(a) +** Processing line: ~ x = STARTX~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + x = STARTX +** Processing line: ~ y = STARTY~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the visited cells on the third grid~ + y = STARTY +** Processing line: ~ offset_x = (1280 - (ENDX - STARTX)) / 2~ - Inside source: true *** True Line Result - # Renders the visited cells on the third grid -** Processing line: ~ def render_a_star_visited~ + offset_x = (1280 - (ENDX - STARTX)) / 2 +** Processing line: ~ offset_y = (360 - (ENDY - STARTY)) / 2~ - Inside source: true *** True Line Result - def render_a_star_visited -** Processing line: ~ a_star.came_from.each_key do | visited_cell |~ + offset_y = (360 - (ENDY - STARTY)) / 2 +** Processing line: ~~ - Inside source: true *** True Line Result - a_star.came_from.each_key do | visited_cell | -** Processing line: ~ outputs.solids << [a_star_scale_up(visited_cell), visited_color]~ + +** Processing line: ~ srand(1)~ - Inside source: true *** True Line Result - outputs.solids << [a_star_scale_up(visited_cell), visited_color] -** Processing line: ~ end~ + srand(1) +** Processing line: ~ while y < ENDY do~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + while y < ENDY do +** Processing line: ~ while x < ENDX do~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + while x < ENDX do +** Processing line: ~ if (y == STARTY ||~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the path found by the breadth first search on the first grid~ + if (y == STARTY || +** Processing line: ~ y == (ENDY / 0.5) * 2 ||~ - Inside source: true *** True Line Result - # Renders the path found by the breadth first search on the first grid -** Processing line: ~ def render_dijkstra_path~ + y == (ENDY / 0.5) * 2 || +** Processing line: ~ y == (ENDY / 0.5) * 2 + 0.5 ||~ - Inside source: true *** True Line Result - def render_dijkstra_path -** Processing line: ~ dijkstra.path.each do | path |~ + y == (ENDY / 0.5) * 2 + 0.5 || +** Processing line: ~ y == ENDY - 0.5 ||~ - Inside source: true *** True Line Result - dijkstra.path.each do | path | -** Processing line: ~ outputs.solids << [dijkstra_scale_up(path), path_color]~ + y == ENDY - 0.5 || +** Processing line: ~ x == STARTX ||~ - Inside source: true *** True Line Result - outputs.solids << [dijkstra_scale_up(path), path_color] -** Processing line: ~ end~ + x == STARTX || +** Processing line: ~ x == ENDX - 0.5)~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + x == ENDX - 0.5) +** Processing line: ~ z = rand(BOXDEPTH)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + z = rand(BOXDEPTH) +** Processing line: ~ z *= Math.sin(a / 2)~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the path found by the greedy search on the second grid~ + z *= Math.sin(a / 2) +** Processing line: ~ x -= SPINPOINT~ - Inside source: true *** True Line Result - # Renders the path found by the greedy search on the second grid -** Processing line: ~ def render_greedy_path~ + x -= SPINPOINT +** Processing line: ~ u = (x * c) - (z * s)~ - Inside source: true *** True Line Result - def render_greedy_path -** Processing line: ~ greedy.path.each do | path |~ + u = (x * c) - (z * s) +** Processing line: ~ v = (x * s) + (z * c)~ - Inside source: true *** True Line Result - greedy.path.each do | path | -** Processing line: ~ outputs.solids << [greedy_scale_up(path), path_color]~ + v = (x * s) + (z * c) +** Processing line: ~ k = DISTANCE.fdiv(100) + (v / 500 * YAW)~ - Inside source: true *** True Line Result - outputs.solids << [greedy_scale_up(path), path_color] -** Processing line: ~ end~ + k = DISTANCE.fdiv(100) + (v / 500 * YAW) +** Processing line: ~ u = u / k~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + u = u / k +** Processing line: ~ v = y / k~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + v = y / k +** Processing line: ~ w = POINTSIZE / 10 / k~ - Inside source: true *** True Line Result - -** Processing line: ~ # Renders the path found by the a_star search on the third grid~ + w = POINTSIZE / 10 / k +** Processing line: ~ args.outputs.sprites << { x: offset_x + u - w, y: offset_y + v - w, w: w, h: w, path: 'sprites/square-blue.png'}~ - Inside source: true *** True Line Result - # Renders the path found by the a_star search on the third grid -** Processing line: ~ def render_a_star_path~ + args.outputs.sprites << { x: offset_x + u - w, y: offset_y + v - w, w: w, h: w, path: 'sprites/square-blue.png'} +** Processing line: ~ x += SPINPOINT~ - Inside source: true *** True Line Result - def render_a_star_path -** Processing line: ~ a_star.path.each do | path |~ + x += SPINPOINT +** Processing line: ~ end~ - Inside source: true *** True Line Result - a_star.path.each do | path | -** Processing line: ~ outputs.solids << [a_star_scale_up(path), path_color]~ + end +** Processing line: ~ x += 0.5~ - Inside source: true *** True Line Result - outputs.solids << [a_star_scale_up(path), path_color] + x += 0.5 ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ y += 0.5~ +- Inside source: true +*** True Line Result + y += 0.5 +** Processing line: ~ x = STARTX~ +- Inside source: true +*** True Line Result + x = STARTX ** 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: ~ # Returns the rect for the path between two cells based on their relative positions~ +** Processing line: ~ $gtk.reset~ - Inside source: true *** True Line Result - # Returns the rect for the path between two cells based on their relative positions -** Processing line: ~ def get_path_between(cell_one, cell_two)~ + $gtk.reset +** Processing line: ~~ - Inside source: true *** True Line Result - def get_path_between(cell_one, cell_two) -** Processing line: ~ path = []~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - path = [] +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ # If cell one is above cell two~ +** Processing line: ~*** 3d - Wireframe - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** 3d - Wireframe - 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_3d/02_wireframe/app/main.rb~ - Inside source: true *** True Line Result - # If cell one is above cell two -** Processing line: ~ if cell_one.x == cell_two.x and cell_one.y > cell_two.y~ + # ./samples/99_genre_3d/02_wireframe/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - if cell_one.x == cell_two.x and cell_one.y > cell_two.y -** Processing line: ~ # Path starts from the center of cell two and moves upward to the center of cell one~ + def tick args +** Processing line: ~ args.state.model ||= Object3D.new('data/shuttle.off')~ - Inside source: true *** True Line Result - # Path starts from the center of cell two and moves upward to the center of cell one -** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4]~ + args.state.model ||= Object3D.new('data/shuttle.off') +** Processing line: ~ args.state.mtx ||= rotate3D(0, 0, 0)~ - Inside source: true *** True Line Result - path = [cell_two.x + 0.3, cell_two.y + 0.3, 0.4, 1.4] -** Processing line: ~ # If cell one is below cell two~ + args.state.mtx ||= rotate3D(0, 0, 0) +** Processing line: ~ args.state.inv_mtx ||= rotate3D(0, 0, 0)~ - Inside source: true *** True Line Result - # If cell one is below cell two -** Processing line: ~ elsif cell_one.x == cell_two.x and cell_one.y < cell_two.y~ + args.state.inv_mtx ||= rotate3D(0, 0, 0) +** Processing line: ~ delta_mtx = rotate3D(args.inputs.up_down * 0.01, input_roll(args) * 0.01, args.inputs.left_right * 0.01)~ - Inside source: true *** True Line Result - elsif cell_one.x == cell_two.x and cell_one.y < cell_two.y -** Processing line: ~ # Path starts from the center of cell one and moves upward to the center of cell two~ + delta_mtx = rotate3D(args.inputs.up_down * 0.01, input_roll(args) * 0.01, args.inputs.left_right * 0.01) +** Processing line: ~ args.outputs.lines << args.state.model.edges~ - Inside source: true *** True Line Result - # Path starts from the center of cell one and moves upward to the center of cell two -** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4]~ + args.outputs.lines << args.state.model.edges +** Processing line: ~ args.state.model.fast_3x3_transform! args.state.inv_mtx~ - Inside source: true *** True Line Result - path = [cell_one.x + 0.3, cell_one.y + 0.3, 0.4, 1.4] -** Processing line: ~ # If cell one is to the left of cell two~ + args.state.model.fast_3x3_transform! args.state.inv_mtx +** Processing line: ~ args.state.inv_mtx = mtx_mul(delta_mtx.transpose, args.state.inv_mtx)~ - Inside source: true *** True Line Result - # If cell one is to the left of cell two -** Processing line: ~ elsif cell_one.x > cell_two.x and cell_one.y == cell_two.y~ + args.state.inv_mtx = mtx_mul(delta_mtx.transpose, args.state.inv_mtx) +** Processing line: ~ args.state.mtx = mtx_mul(args.state.mtx, delta_mtx)~ - Inside source: true *** True Line Result - elsif cell_one.x > cell_two.x and cell_one.y == cell_two.y -** Processing line: ~ # Path starts from the center of cell two and moves rightward to the center of cell one~ + args.state.mtx = mtx_mul(args.state.mtx, delta_mtx) +** Processing line: ~ args.state.model.fast_3x3_transform! args.state.mtx~ - Inside source: true *** True Line Result - # Path starts from the center of cell two and moves rightward to the center of cell one -** Processing line: ~ path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4]~ + args.state.model.fast_3x3_transform! args.state.mtx +** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - path = [cell_two.x + 0.3, cell_two.y + 0.3, 1.4, 0.4] -** Processing line: ~ # If cell one is to the right of cell two~ + args.outputs.background_color = [0, 0, 0] +** Processing line: ~ args.outputs.debug << args.gtk.framerate_diagnostics_primitives~ - Inside source: true *** True Line Result - # If cell one is to the right of cell two -** Processing line: ~ elsif cell_one.x < cell_two.x and cell_one.y == cell_two.y~ + args.outputs.debug << args.gtk.framerate_diagnostics_primitives +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif cell_one.x < cell_two.x and cell_one.y == cell_two.y -** Processing line: ~ # Path starts from the center of cell one and moves rightward to the center of cell two~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Path starts from the center of cell one and moves rightward to the center of cell two -** Processing line: ~ path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4]~ + +** Processing line: ~ def input_roll args~ - Inside source: true *** True Line Result - path = [cell_one.x + 0.3, cell_one.y + 0.3, 1.4, 0.4] -** Processing line: ~ end~ + def input_roll args +** Processing line: ~ roll = 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + roll = 0 +** Processing line: ~ roll += 1 if args.inputs.keyboard.e~ - Inside source: true *** True Line Result - -** Processing line: ~ path~ + roll += 1 if args.inputs.keyboard.e +** Processing line: ~ roll -= 1 if args.inputs.keyboard.q~ - Inside source: true *** True Line Result - path -** Processing line: ~ end~ + roll -= 1 if args.inputs.keyboard.q +** Processing line: ~ roll~ - Inside source: true *** True Line Result - end + roll +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # In code, the cells are represented as 1x1 rectangles~ +** Processing line: ~ def rotate3D(theta_x = 0.1, theta_y = 0.1, theta_z = 0.1)~ - Inside source: true *** True Line Result - # In code, the cells are represented as 1x1 rectangles -** Processing line: ~ # When drawn, the cells are larger than 1x1 rectangles~ + def rotate3D(theta_x = 0.1, theta_y = 0.1, theta_z = 0.1) +** Processing line: ~ c_x, s_x = Math.cos(theta_x), Math.sin(theta_x)~ - Inside source: true *** True Line Result - # When drawn, the cells are larger than 1x1 rectangles -** Processing line: ~ # This method is used to scale up cells, and lines~ + c_x, s_x = Math.cos(theta_x), Math.sin(theta_x) +** Processing line: ~ c_y, s_y = Math.cos(theta_y), Math.sin(theta_y)~ - Inside source: true *** True Line Result - # This method is used to scale up cells, and lines -** Processing line: ~ # Objects are scaled up according to the grid.cell_size variable~ + c_y, s_y = Math.cos(theta_y), Math.sin(theta_y) +** Processing line: ~ c_z, s_z = Math.cos(theta_z), Math.sin(theta_z)~ - Inside source: true *** True Line Result - # Objects are scaled up according to the grid.cell_size variable -** Processing line: ~ # This allows for easy customization of the visual scale of the grid~ + c_z, s_z = Math.cos(theta_z), Math.sin(theta_z) +** Processing line: ~ rot_x = [[1, 0, 0], [0, c_x, -s_x], [0, s_x, c_x]]~ - Inside source: true *** True Line Result - # This allows for easy customization of the visual scale of the grid -** Processing line: ~ # This method scales up cells for the first grid~ + rot_x = [[1, 0, 0], [0, c_x, -s_x], [0, s_x, c_x]] +** Processing line: ~ rot_y = [[c_y, 0, s_y], [0, 1, 0], [-s_y, 0, c_y]]~ - Inside source: true *** True Line Result - # This method scales up cells for the first grid -** Processing line: ~ def dijkstra_scale_up(cell)~ + rot_y = [[c_y, 0, s_y], [0, 1, 0], [-s_y, 0, c_y]] +** Processing line: ~ rot_z = [[c_z, -s_z, 0], [s_z, c_z, 0], [0, 0, 1]]~ - Inside source: true *** True Line Result - def dijkstra_scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + rot_z = [[c_z, -s_z, 0], [s_z, c_z, 0], [0, 0, 1]] +** Processing line: ~ mtx_mul(mtx_mul(rot_x, rot_y), rot_z)~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + mtx_mul(mtx_mul(rot_x, rot_y), rot_z) +** Processing line: ~ end~ - Inside source: true *** True Line Result - cell = cell.clone + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If cell is just an x and y coordinate~ -- Inside source: true -*** True Line Result - # If cell is just an x and y coordinate -** Processing line: ~ if cell.size == 2~ -- Inside source: true -*** True Line Result - if cell.size == 2 -** Processing line: ~ # Add a width and height of 1~ +** Processing line: ~ def mtx_mul(a, b)~ - Inside source: true *** True Line Result - # Add a width and height of 1 -** Processing line: ~ cell << 1~ + def mtx_mul(a, b) +** Processing line: ~ is = (0...a.length)~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ cell << 1~ + is = (0...a.length) +** Processing line: ~ js = (0...b[0].length)~ - Inside source: true *** True Line Result - cell << 1 -** Processing line: ~ end~ + js = (0...b[0].length) +** Processing line: ~ ks = (0...b.length)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + ks = (0...b.length) +** Processing line: ~ is.map do |i|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Scale all the values up~ + is.map do |i| +** Processing line: ~ js.map do |j|~ - Inside source: true *** True Line Result - # Scale all the values up -** Processing line: ~ cell.map! { |value| value * grid.cell_size }~ + js.map do |j| +** Processing line: ~ ks.map do |k|~ - Inside source: true *** True Line Result - cell.map! { |value| value * grid.cell_size } -** Processing line: ~~ + ks.map do |k| +** Processing line: ~ a[i][k] * b[k][j]~ - Inside source: true *** True Line Result - -** Processing line: ~ # Returns the scaled up cell~ + a[i][k] * b[k][j] +** Processing line: ~ end.reduce(&:plus)~ - Inside source: true *** True Line Result - # Returns the scaled up cell -** Processing line: ~ cell~ + end.reduce(&:plus) +** Processing line: ~ end~ - Inside source: true *** True Line Result - cell + 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: ~ # Translates the given cell grid.width + 1 to the right and then scales up~ +** Processing line: ~ class Object3D~ - Inside source: true *** True Line Result - # Translates the given cell grid.width + 1 to the right and then scales up -** Processing line: ~ # Used to draw cells for the second grid~ + class Object3D +** Processing line: ~ attr_reader :vert_count, :face_count, :edge_count, :verts, :faces, :edges~ - Inside source: true *** True Line Result - # Used to draw cells for the second grid -** Processing line: ~ # This method does not work for lines,~ + attr_reader :vert_count, :face_count, :edge_count, :verts, :faces, :edges +** Processing line: ~~ - Inside source: true *** True Line Result - # This method does not work for lines, -** Processing line: ~ # so separate methods exist for the grid lines~ + +** Processing line: ~ def initialize(path)~ - Inside source: true *** True Line Result - # so separate methods exist for the grid lines -** Processing line: ~ def greedy_scale_up(cell)~ + def initialize(path) +** Processing line: ~ @vert_count = 0~ - Inside source: true *** True Line Result - def greedy_scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + @vert_count = 0 +** Processing line: ~ @face_count = 0~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + @face_count = 0 +** Processing line: ~ @edge_count = 0~ - Inside source: true *** True Line Result - cell = cell.clone -** Processing line: ~ # Translates the cell to the second grid equivalent~ + @edge_count = 0 +** Processing line: ~ @verts = []~ - Inside source: true *** True Line Result - # Translates the cell to the second grid equivalent -** Processing line: ~ cell.x += grid.width + 1~ + @verts = [] +** Processing line: ~ @faces = []~ - Inside source: true *** True Line Result - cell.x += grid.width + 1 -** Processing line: ~ # Proceeds as if scaling up for the first grid~ + @faces = [] +** Processing line: ~ @edges = []~ - Inside source: true *** True Line Result - # Proceeds as if scaling up for the first grid -** Processing line: ~ dijkstra_scale_up(cell)~ + @edges = [] +** Processing line: ~ _init_from_file path~ - Inside source: true *** True Line Result - dijkstra_scale_up(cell) + _init_from_file path ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83308,98 +90359,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Translates the given cell (grid.width + 1) * 2 to the right and then scales up~ +** Processing line: ~ def _init_from_file path~ - Inside source: true *** True Line Result - # Translates the given cell (grid.width + 1) * 2 to the right and then scales up -** Processing line: ~ # Used to draw cells for the third grid~ + def _init_from_file path +** Processing line: ~ file_lines = $gtk.read_file(path).split("\n")~ - Inside source: true *** True Line Result - # Used to draw cells for the third grid -** Processing line: ~ # This method does not work for lines,~ + file_lines = $gtk.read_file(path).split("\n") +** Processing line: ~ .reject { |line| line.start_with?('#') || line.split(' ').length == 0 } # Strip out simple comments and blank lines~ - Inside source: true *** True Line Result - # This method does not work for lines, -** Processing line: ~ # so separate methods exist for the grid lines~ + .reject { |line| line.start_with?('#') || line.split(' ').length == 0 } # Strip out simple comments and blank lines +** Processing line: ~ .map { |line| line.split('#')[0] } # Strip out end of line comments~ - Inside source: true *** True Line Result - # so separate methods exist for the grid lines -** Processing line: ~ def a_star_scale_up(cell)~ + .map { |line| line.split('#')[0] } # Strip out end of line comments +** Processing line: ~ .map { |line| line.split(' ') } # Tokenize by splitting on whitespace~ - Inside source: true *** True Line Result - def a_star_scale_up(cell) -** Processing line: ~ # Prevents the original value of cell from being edited~ + .map { |line| line.split(' ') } # Tokenize by splitting on whitespace +** Processing line: ~ raise "OFF file did not start with OFF." if file_lines.shift != ["OFF"] # OFF meshes are supposed to begin with "OFF" as the first line.~ - Inside source: true *** True Line Result - # Prevents the original value of cell from being edited -** Processing line: ~ cell = cell.clone~ + raise "OFF file did not start with OFF." if file_lines.shift != ["OFF"] # OFF meshes are supposed to begin with "OFF" as the first line. +** Processing line: ~ raise " line malformed" if file_lines[0].length != 3 # The second line needs to have 3 numbers. Raise an error if it doesn't.~ - Inside source: true *** True Line Result - cell = cell.clone -** Processing line: ~ # Translates the cell to the second grid equivalent~ + raise " line malformed" if file_lines[0].length != 3 # The second line needs to have 3 numbers. Raise an error if it doesn't. +** Processing line: ~ @vert_count, @face_count, @edge_count = file_lines.shift&.map(&:to_i) # Update the counts~ - Inside source: true *** True Line Result - # Translates the cell to the second grid equivalent -** Processing line: ~ cell.x += grid.width + 1~ + @vert_count, @face_count, @edge_count = file_lines.shift&.map(&:to_i) # Update the counts +** Processing line: ~ # Only the vertex and face counts need to be accurate. Raise an error if they are inaccurate.~ - Inside source: true *** True Line Result - cell.x += grid.width + 1 -** Processing line: ~ # Translates the cell to the third grid equivalent~ + # Only the vertex and face counts need to be accurate. Raise an error if they are inaccurate. +** Processing line: ~ raise "Incorrect number of vertices and/or faces (Parsed VFE header: #{@vert_count} #{@face_count} #{@edge_count})" if file_lines.length != @vert_count + @face_count~ - Inside source: true *** True Line Result - # Translates the cell to the third grid equivalent -** Processing line: ~ cell.x += grid.width + 1~ + raise "Incorrect number of vertices and/or faces (Parsed VFE header: #{@vert_count} #{@face_count} #{@edge_count})" if file_lines.length != @vert_count + @face_count +** Processing line: ~ # Grab all the lines describing vertices.~ - Inside source: true *** True Line Result - cell.x += grid.width + 1 -** Processing line: ~ # Proceeds as if scaling up for the first grid~ + # Grab all the lines describing vertices. +** Processing line: ~ vert_lines = file_lines[0, @vert_count]~ - Inside source: true *** True Line Result - # Proceeds as if scaling up for the first grid -** Processing line: ~ dijkstra_scale_up(cell)~ + vert_lines = file_lines[0, @vert_count] +** Processing line: ~ # Grab all the lines describing faces.~ - Inside source: true *** True Line Result - dijkstra_scale_up(cell) -** Processing line: ~ end~ + # Grab all the lines describing faces. +** Processing line: ~ face_lines = file_lines[@vert_count, @face_count]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + face_lines = file_lines[@vert_count, @face_count] +** Processing line: ~ # Create all the vertices~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the first grid~ + # Create all the vertices +** Processing line: ~ @verts = vert_lines.map_with_index { |line, id| Vertex.new(line, id) }~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the first grid -** Processing line: ~ def dijkstra_mouse_over_star?~ + @verts = vert_lines.map_with_index { |line, id| Vertex.new(line, id) } +** Processing line: ~ # Create all the faces~ - Inside source: true *** True Line Result - def dijkstra_mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.star))~ + # Create all the faces +** Processing line: ~ @faces = face_lines.map { |line| Face.new(line, @verts) }~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.star)) -** Processing line: ~ end~ + @faces = face_lines.map { |line| Face.new(line, @verts) } +** Processing line: ~ # Create all the edges~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Create all the edges +** Processing line: ~ @edges = @faces.flat_map(&:edges).uniq do |edge|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the star from the second grid~ + @edges = @faces.flat_map(&:edges).uniq do |edge| +** Processing line: ~ sorted = edge.sorted~ - Inside source: true *** True Line Result - # Signal that the user is going to be moving the star from the second grid -** Processing line: ~ def greedy_mouse_over_star?~ + sorted = edge.sorted +** Processing line: ~ [sorted.point_a, sorted.point_b]~ - Inside source: true *** True Line Result - def greedy_mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.star))~ + [sorted.point_a, sorted.point_b] +** Processing line: ~ end~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(greedy_scale_up(grid.star)) + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83408,150 +90459,122 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the star from the third grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the star from the third grid -** Processing line: ~ def a_star_mouse_over_star?~ +** Processing line: ~ def fast_3x3_transform! mtx~ - Inside source: true *** True Line Result - def a_star_mouse_over_star? -** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.star))~ + def fast_3x3_transform! mtx +** Processing line: ~ @verts.each { |vert| vert.fast_3x3_transform! mtx }~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(a_star_scale_up(grid.star)) + @verts.each { |vert| vert.fast_3x3_transform! mtx } ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Signal that the user is going to be moving the target from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the first grid -** Processing line: ~ def dijkstra_mouse_over_target?~ -- Inside source: true -*** True Line Result - def dijkstra_mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.target))~ -- Inside source: true -*** True Line Result - inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.target)) -** Processing line: ~ end~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the target from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the second grid -** Processing line: ~ def greedy_mouse_over_target?~ +** Processing line: ~ class Face~ - Inside source: true *** True Line Result - def greedy_mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.target))~ + class Face +** Processing line: ~~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(greedy_scale_up(grid.target)) -** Processing line: ~ end~ + +** Processing line: ~ attr_reader :verts, :edges~ - Inside source: true *** True Line Result - end + attr_reader :verts, :edges ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be moving the target from the third grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be moving the target from the third grid -** Processing line: ~ def a_star_mouse_over_target?~ +** Processing line: ~ def initialize(data, verts)~ - Inside source: true *** True Line Result - def a_star_mouse_over_target? -** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.target))~ + def initialize(data, verts) +** Processing line: ~ vert_count = data[0].to_i~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(a_star_scale_up(grid.target)) -** Processing line: ~ end~ + vert_count = data[0].to_i +** Processing line: ~ vert_ids = data[1, vert_count].map(&:to_i)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + vert_ids = data[1, vert_count].map(&:to_i) +** Processing line: ~ @verts = vert_ids.map { |i| verts[i] }~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be removing walls from the first grid~ + @verts = vert_ids.map { |i| verts[i] } +** Processing line: ~ @edges = []~ - Inside source: true *** True Line Result - # Signal that the user is going to be removing walls from the first grid -** Processing line: ~ def dijkstra_mouse_over_wall?~ + @edges = [] +** Processing line: ~ (0...vert_count).each { |i| @edges[i] = Edge.new(verts[vert_ids[i - 1]], verts[vert_ids[i]]) }~ - Inside source: true *** True Line Result - def dijkstra_mouse_over_wall? -** Processing line: ~ grid.walls.each_key do | wall |~ + (0...vert_count).each { |i| @edges[i] = Edge.new(verts[vert_ids[i - 1]], verts[vert_ids[i]]) } +** Processing line: ~ @edges.rotate! 1~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(dijkstra_scale_up(wall))~ + @edges.rotate! 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(dijkstra_scale_up(wall)) -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ false~ +** Processing line: ~ class Edge~ - Inside source: true *** True Line Result - false -** Processing line: ~ end~ + class Edge +** Processing line: ~ attr_reader :point_a, :point_b~ - Inside source: true *** True Line Result - end + attr_reader :point_a, :point_b ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls from the second grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing walls from the second grid -** Processing line: ~ def greedy_mouse_over_wall?~ +** Processing line: ~ def initialize(point_a, point_b)~ - Inside source: true *** True Line Result - def greedy_mouse_over_wall? -** Processing line: ~ grid.walls.each_key do | wall |~ + def initialize(point_a, point_b) +** Processing line: ~ @point_a = point_a~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(greedy_scale_up(wall))~ + @point_a = point_a +** Processing line: ~ @point_b = point_b~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(greedy_scale_up(wall)) -** Processing line: ~ end~ + @point_b = point_b +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ false~ +** Processing line: ~ def sorted~ - Inside source: true *** True Line Result - false + def sorted +** Processing line: ~ @point_a.id < @point_b.id ? self : Edge.new(@point_b, @point_a)~ +- Inside source: true +*** True Line Result + @point_a.id < @point_b.id ? self : Edge.new(@point_b, @point_a) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83560,34 +90583,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be removing walls from the third grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be removing walls from the third grid -** Processing line: ~ def a_star_mouse_over_wall?~ -- Inside source: true -*** True Line Result - def a_star_mouse_over_wall? -** Processing line: ~ grid.walls.each_key do | wall |~ +** Processing line: ~ def draw_override ffi~ - Inside source: true *** True Line Result - grid.walls.each_key do | wall | -** Processing line: ~ return true if inputs.mouse.point.inside_rect?(a_star_scale_up(wall))~ + def draw_override ffi +** Processing line: ~ ffi.draw_line(@point_a.render_x, @point_a.render_y, @point_b.render_x, @point_b.render_y, 255, 0, 0, 128)~ - Inside source: true *** True Line Result - return true if inputs.mouse.point.inside_rect?(a_star_scale_up(wall)) -** Processing line: ~ end~ + ffi.draw_line(@point_a.render_x, @point_a.render_y, @point_b.render_x, @point_b.render_y, 255, 0, 0, 128) +** Processing line: ~ ffi.draw_line(@point_a.render_x+1, @point_a.render_y, @point_b.render_x+1, @point_b.render_y, 255, 0, 0, 128)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + ffi.draw_line(@point_a.render_x+1, @point_a.render_y, @point_b.render_x+1, @point_b.render_y, 255, 0, 0, 128) +** Processing line: ~ ffi.draw_line(@point_a.render_x, @point_a.render_y+1, @point_b.render_x, @point_b.render_y+1, 255, 0, 0, 128)~ - Inside source: true *** True Line Result - -** Processing line: ~ false~ + ffi.draw_line(@point_a.render_x, @point_a.render_y+1, @point_b.render_x, @point_b.render_y+1, 255, 0, 0, 128) +** Processing line: ~ ffi.draw_line(@point_a.render_x+1, @point_a.render_y+1, @point_b.render_x+1, @point_b.render_y+1, 255, 0, 0, 128)~ - Inside source: true *** True Line Result - false + ffi.draw_line(@point_a.render_x+1, @point_a.render_y+1, @point_b.render_x+1, @point_b.render_y+1, 255, 0, 0, 128) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83596,58 +90611,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Signal that the user is going to be adding walls from the first grid~ -- Inside source: true -*** True Line Result - # Signal that the user is going to be adding walls from the first grid -** Processing line: ~ def dijkstra_mouse_over_grid?~ +** Processing line: ~ def primitive_marker~ - Inside source: true *** True Line Result - def dijkstra_mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.rect))~ + def primitive_marker +** Processing line: ~ :line~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(dijkstra_scale_up(grid.rect)) + :line ** 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: ~ # Signal that the user is going to be adding walls from the second grid~ +** Processing line: ~ class Vertex~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls from the second grid -** Processing line: ~ def greedy_mouse_over_grid?~ + class Vertex +** Processing line: ~ attr_accessor :x, :y, :z, :id~ - Inside source: true *** True Line Result - def greedy_mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(greedy_scale_up(grid.rect))~ + attr_accessor :x, :y, :z, :id +** Processing line: ~~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(greedy_scale_up(grid.rect)) -** Processing line: ~ end~ + +** Processing line: ~ def initialize(data, id)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def initialize(data, id) +** Processing line: ~ @x = data[0].to_f~ - Inside source: true *** True Line Result - -** Processing line: ~ # Signal that the user is going to be adding walls from the third grid~ + @x = data[0].to_f +** Processing line: ~ @y = data[1].to_f~ - Inside source: true *** True Line Result - # Signal that the user is going to be adding walls from the third grid -** Processing line: ~ def a_star_mouse_over_grid?~ + @y = data[1].to_f +** Processing line: ~ @z = data[2].to_f~ - Inside source: true *** True Line Result - def a_star_mouse_over_grid? -** Processing line: ~ inputs.mouse.point.inside_rect?(a_star_scale_up(grid.rect))~ + @z = data[2].to_f +** Processing line: ~ @id = id~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect?(a_star_scale_up(grid.rect)) + @id = id ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83656,50 +90671,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the first grid~ -- Inside source: true -*** True Line Result - # Moves the star to the cell closest to the mouse in the first grid -** Processing line: ~ # Only resets the search if the star changes position~ -- Inside source: true -*** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ +** Processing line: ~ def fast_3x3_transform! mtx~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def process_input_dijkstra_star~ + def fast_3x3_transform! mtx +** Processing line: ~ _x, _y, _z = @x, @y, @z~ - Inside source: true *** True Line Result - def process_input_dijkstra_star -** Processing line: ~ old_star = grid.star.clone~ + _x, _y, _z = @x, @y, @z +** Processing line: ~ @x = mtx[0][0] * _x + mtx[0][1] * _y + mtx[0][2] * _z~ - Inside source: true *** True Line Result - old_star = grid.star.clone -** Processing line: ~ unless dijkstra_cell_closest_to_mouse == grid.target~ + @x = mtx[0][0] * _x + mtx[0][1] * _y + mtx[0][2] * _z +** Processing line: ~ @y = mtx[1][0] * _x + mtx[1][1] * _y + mtx[1][2] * _z~ - Inside source: true *** True Line Result - unless dijkstra_cell_closest_to_mouse == grid.target -** Processing line: ~ grid.star = dijkstra_cell_closest_to_mouse~ + @y = mtx[1][0] * _x + mtx[1][1] * _y + mtx[1][2] * _z +** Processing line: ~ @z = mtx[2][0] * _x + mtx[2][1] * _y + mtx[2][2] * _z~ - Inside source: true *** True Line Result - grid.star = dijkstra_cell_closest_to_mouse -** Processing line: ~ end~ + @z = mtx[2][0] * _x + mtx[2][1] * _y + mtx[2][2] * _z +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_star == grid.star~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - unless old_star == grid.star -** Processing line: ~ reset_searches~ + +** Processing line: ~ def render_x~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + def render_x +** Processing line: ~ @x * (10 / (5 - @y)) * 170 + 640~ - Inside source: true *** True Line Result - end + @x * (10 / (5 - @y)) * 170 + 640 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83708,258 +90715,234 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the second grid~ +** Processing line: ~ def render_y~ - Inside source: true *** True Line Result - # Moves the star to the cell closest to the mouse in the second grid -** Processing line: ~ # Only resets the search if the star changes position~ + def render_y +** Processing line: ~ @z * (10 / (5 - @y)) * 170 + 360~ - Inside source: true *** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ + @z * (10 / (5 - @y)) * 170 + 360 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def process_input_greedy_star~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def process_input_greedy_star -** Processing line: ~ old_star = grid.star.clone~ -- Inside source: true + end +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - old_star = grid.star.clone -** Processing line: ~ unless greedy_cell_closest_to_mouse == grid.target~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - unless greedy_cell_closest_to_mouse == grid.target -** Processing line: ~ grid.star = greedy_cell_closest_to_mouse~ -- Inside source: true + +** Processing line: ~*** 3d - Wireframe - Data - what-is-this.txt~ +- Header detected. *** True Line Result - grid.star = greedy_cell_closest_to_mouse -** Processing line: ~ end~ -- Inside source: true + *** True Line Result - end -** Processing line: ~ unless old_star == grid.star~ -- Inside source: true +*** 3d - Wireframe - Data - what-is-this.txt +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - unless old_star == grid.star -** Processing line: ~ reset_searches~ -- Inside source: true + *** True Line Result - reset_searches -** Processing line: ~ end~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_3d/02_wireframe/data/what-is-this.txt~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # ./samples/99_genre_3d/02_wireframe/data/what-is-this.txt +** Processing line: ~ https://en.wikipedia.org/wiki/OFF_(file_format)~ - Inside source: true *** True Line Result - end + https://en.wikipedia.org/wiki/OFF_(file_format) +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. +*** True Line Result +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ # Moves the star to the cell closest to the mouse in the third grid~ -- Inside source: true -*** True Line Result - # Moves the star to the cell closest to the mouse in the third grid -** Processing line: ~ # Only resets the search if the star changes position~ -- Inside source: true -*** True Line Result - # Only resets the search if the star changes position -** Processing line: ~ # Called whenever the user is editing the star (puts mouse down on star)~ -- Inside source: true -*** True Line Result - # Called whenever the user is editing the star (puts mouse down on star) -** Processing line: ~ def process_input_a_star_star~ -- Inside source: true -*** True Line Result - def process_input_a_star_star -** Processing line: ~ old_star = grid.star.clone~ -- Inside source: true +** Processing line: ~*** Arcade - Bullet Hell - main.rb~ +- Header detected. *** True Line Result - old_star = grid.star.clone -** Processing line: ~ unless a_star_cell_closest_to_mouse == grid.target~ -- Inside source: true + *** True Line Result - unless a_star_cell_closest_to_mouse == grid.target -** Processing line: ~ grid.star = a_star_cell_closest_to_mouse~ -- Inside source: true +*** Arcade - Bullet Hell - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - grid.star = a_star_cell_closest_to_mouse -** Processing line: ~ end~ -- Inside source: true + *** True Line Result - end -** Processing line: ~ unless old_star == grid.star~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/bullet_hell/app/main.rb~ - Inside source: true *** True Line Result - unless old_star == grid.star -** Processing line: ~ reset_searches~ + # ./samples/99_genre_arcade/bullet_hell/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + def tick args +** Processing line: ~ args.state.base_columns ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.base_columns ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 } +** Processing line: ~ args.state.base_rows ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.base_rows ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 } +** Processing line: ~ args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the target to the grid closest to the mouse in the first grid~ + args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 } +** Processing line: ~ args.state.offset_rows = 5.map { 0 }~ - Inside source: true *** True Line Result - # Moves the target to the grid closest to the mouse in the first grid -** Processing line: ~ # Only reset_searchess the search if the target changes position~ + args.state.offset_rows = 5.map { 0 } +** Processing line: ~ args.state.columns = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }~ - Inside source: true *** True Line Result - # Only reset_searchess the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + args.state.columns = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] } +** Processing line: ~ args.state.rows = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def process_input_dijkstra_target~ + args.state.rows = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] } +** Processing line: ~ args.state.explosions ||= []~ - Inside source: true *** True Line Result - def process_input_dijkstra_target -** Processing line: ~ old_target = grid.target.clone~ + args.state.explosions ||= [] +** Processing line: ~ args.state.enemies ||= []~ - Inside source: true *** True Line Result - old_target = grid.target.clone -** Processing line: ~ unless dijkstra_cell_closest_to_mouse == grid.star~ + args.state.enemies ||= [] +** Processing line: ~ args.state.score ||= 0~ - Inside source: true *** True Line Result - unless dijkstra_cell_closest_to_mouse == grid.star -** Processing line: ~ grid.target = dijkstra_cell_closest_to_mouse~ + args.state.score ||= 0 +** Processing line: ~ args.state.wave ||= 0~ - Inside source: true *** True Line Result - grid.target = dijkstra_cell_closest_to_mouse -** Processing line: ~ end~ + args.state.wave ||= 0 +** Processing line: ~ if args.state.enemies.empty?~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_target == grid.target~ + if args.state.enemies.empty? +** Processing line: ~ args.state.wave += 1~ - Inside source: true *** True Line Result - unless old_target == grid.target -** Processing line: ~ reset_searches~ + args.state.wave += 1 +** Processing line: ~ args.state.wave_root = Math.sqrt(args.state.wave)~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + args.state.wave_root = Math.sqrt(args.state.wave) +** Processing line: ~ args.state.enemies = make_enemies~ - Inside source: true *** True Line Result - end + args.state.enemies = make_enemies ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ args.state.player ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}~ - Inside source: true *** True Line Result - -** Processing line: ~ # Moves the target to the cell closest to the mouse in the second grid~ + args.state.player ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true} +** Processing line: ~ args.state.enemy_bullets ||= []~ - Inside source: true *** True Line Result - # Moves the target to the cell closest to the mouse in the second grid -** Processing line: ~ # Only reset_searchess the search if the target changes position~ + args.state.enemy_bullets ||= [] +** Processing line: ~ args.state.player_bullets ||= []~ - Inside source: true *** True Line Result - # Only reset_searchess the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + args.state.player_bullets ||= [] +** Processing line: ~ args.state.lives ||= 3~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def process_input_greedy_target~ + args.state.lives ||= 3 +** Processing line: ~ args.state.missed_shots ||= 0~ - Inside source: true *** True Line Result - def process_input_greedy_target -** Processing line: ~ old_target = grid.target.clone~ + args.state.missed_shots ||= 0 +** Processing line: ~ args.state.fired_shots ||= 0~ - Inside source: true *** True Line Result - old_target = grid.target.clone -** Processing line: ~ unless greedy_cell_closest_to_mouse == grid.star~ + args.state.fired_shots ||= 0 +** Processing line: ~~ - Inside source: true *** True Line Result - unless greedy_cell_closest_to_mouse == grid.star -** Processing line: ~ grid.target = greedy_cell_closest_to_mouse~ + +** Processing line: ~ update_explosions args~ - Inside source: true *** True Line Result - grid.target = greedy_cell_closest_to_mouse -** Processing line: ~ end~ + update_explosions args +** Processing line: ~ update_enemy_positions args~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_target == grid.target~ + update_enemy_positions args +** Processing line: ~~ - Inside source: true *** True Line Result - unless old_target == grid.target -** Processing line: ~ reset_searches~ + +** Processing line: ~ if args.inputs.left && args.state.player[:x] > (300 + 5)~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + if args.inputs.left && args.state.player[:x] > (300 + 5) +** Processing line: ~ args.state.player[:x] -= 5~ - Inside source: true *** True Line Result - end + args.state.player[:x] -= 5 ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Moves the target to the cell closest to the mouse in the third grid~ +** Processing line: ~ if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)~ - Inside source: true *** True Line Result - # Moves the target to the cell closest to the mouse in the third grid -** Processing line: ~ # Only reset_searchess the search if the target changes position~ + if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5) +** Processing line: ~ args.state.player[:x] += 5~ - Inside source: true *** True Line Result - # Only reset_searchess the search if the target changes position -** Processing line: ~ # Called whenever the user is editing the target (puts mouse down on target)~ + args.state.player[:x] += 5 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Called whenever the user is editing the target (puts mouse down on target) -** Processing line: ~ def process_input_a_star_target~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def process_input_a_star_target -** Processing line: ~ old_target = grid.target.clone~ + +** Processing line: ~ args.state.enemy_bullets.each do |bullet|~ - Inside source: true *** True Line Result - old_target = grid.target.clone -** Processing line: ~ unless a_star_cell_closest_to_mouse == grid.star~ + args.state.enemy_bullets.each do |bullet| +** Processing line: ~ bullet[:x] += bullet[:dx]~ - Inside source: true *** True Line Result - unless a_star_cell_closest_to_mouse == grid.star -** Processing line: ~ grid.target = a_star_cell_closest_to_mouse~ + bullet[:x] += bullet[:dx] +** Processing line: ~ bullet[:y] += bullet[:dy]~ - Inside source: true *** True Line Result - grid.target = a_star_cell_closest_to_mouse -** Processing line: ~ end~ + bullet[:y] += bullet[:dy] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless old_target == grid.target~ + end +** Processing line: ~ args.state.player_bullets.each do |bullet|~ - Inside source: true *** True Line Result - unless old_target == grid.target -** Processing line: ~ reset_searches~ + args.state.player_bullets.each do |bullet| +** Processing line: ~ bullet[:x] += bullet[:dx]~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + bullet[:x] += bullet[:dx] +** Processing line: ~ bullet[:y] += bullet[:dy]~ - Inside source: true *** True Line Result - end + bullet[:y] += bullet[:dy] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -83968,46 +90951,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the first grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the first grid that are under the cursor -** Processing line: ~ def process_input_dijkstra_remove_wall~ -- Inside source: true -*** True Line Result - def process_input_dijkstra_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ -- Inside source: true -*** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ +** Processing line: ~ args.state.enemy_bullets = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + args.state.enemy_bullets = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) } +** Processing line: ~ args.state.player_bullets = args.state.player_bullets.find_all do |bullet|~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if dijkstra_mouse_over_grid?~ + args.state.player_bullets = args.state.player_bullets.find_all do |bullet| +** Processing line: ~ if bullet[:y].between?(-16, 736)~ - Inside source: true *** True Line Result - if dijkstra_mouse_over_grid? -** Processing line: ~ if grid.walls.has_key?(dijkstra_cell_closest_to_mouse)~ + if bullet[:y].between?(-16, 736) +** Processing line: ~ true~ - Inside source: true *** True Line Result - if grid.walls.has_key?(dijkstra_cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(dijkstra_cell_closest_to_mouse)~ + true +** Processing line: ~ else~ - Inside source: true *** True Line Result - grid.walls.delete(dijkstra_cell_closest_to_mouse) -** Processing line: ~ reset_searches~ + else +** Processing line: ~ args.state.missed_shots += 1~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + args.state.missed_shots += 1 +** Processing line: ~ false~ - Inside source: true *** True Line Result - end + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84020,46 +90991,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Removes walls in the second grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the second grid that are under the cursor -** Processing line: ~ def process_input_greedy_remove_wall~ -- Inside source: true -*** True Line Result - def process_input_greedy_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ +** Processing line: ~ args.state.enemies = args.state.enemies.reject do |enemy|~ - Inside source: true *** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ + args.state.enemies = args.state.enemies.reject do |enemy| +** Processing line: ~ if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2~ - Inside source: true *** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ + if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2 +** Processing line: ~ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ - Inside source: true *** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if greedy_mouse_over_grid?~ + args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} +** Processing line: ~ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ - Inside source: true *** True Line Result - if greedy_mouse_over_grid? -** Processing line: ~ if grid.walls.has_key?(greedy_cell_closest_to_mouse)~ + args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} +** Processing line: ~ args.state.player[:alive] = false~ - Inside source: true *** True Line Result - if grid.walls.has_key?(greedy_cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(greedy_cell_closest_to_mouse)~ + args.state.player[:alive] = false +** Processing line: ~ true~ - Inside source: true *** True Line Result - grid.walls.delete(greedy_cell_closest_to_mouse) -** Processing line: ~ reset_searches~ + true +** Processing line: ~ else~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + else +** Processing line: ~ false~ - Inside source: true *** True Line Result - end + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84068,50 +91031,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Removes walls in the third grid that are under the cursor~ -- Inside source: true -*** True Line Result - # Removes walls in the third grid that are under the cursor -** Processing line: ~ def process_input_a_star_remove_wall~ -- Inside source: true -*** True Line Result - def process_input_a_star_remove_wall -** Processing line: ~ # The mouse needs to be inside the grid, because we only want to remove walls~ -- Inside source: true -*** True Line Result - # The mouse needs to be inside the grid, because we only want to remove walls -** Processing line: ~ # the cursor is directly over~ -- Inside source: true -*** True Line Result - # the cursor is directly over -** Processing line: ~ # Recalculations should only occur when a wall is actually deleted~ -- Inside source: true -*** True Line Result - # Recalculations should only occur when a wall is actually deleted -** Processing line: ~ if a_star_mouse_over_grid?~ +** Processing line: ~ args.state.enemy_bullets.each do |bullet|~ - Inside source: true *** True Line Result - if a_star_mouse_over_grid? -** Processing line: ~ if grid.walls.has_key?(a_star_cell_closest_to_mouse)~ + args.state.enemy_bullets.each do |bullet| +** Processing line: ~ if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2~ - Inside source: true *** True Line Result - if grid.walls.has_key?(a_star_cell_closest_to_mouse) -** Processing line: ~ grid.walls.delete(a_star_cell_closest_to_mouse)~ + if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2 +** Processing line: ~ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ - Inside source: true *** True Line Result - grid.walls.delete(a_star_cell_closest_to_mouse) -** Processing line: ~ reset_searches~ + args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} +** Processing line: ~ args.state.player[:alive] = false~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + args.state.player[:alive] = false +** Processing line: ~ bullet[:despawn] = true~ - Inside source: true *** True Line Result - end + bullet[:despawn] = true ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84120,34 +91059,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ args.state.enemies = args.state.enemies.reject do |enemy|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Adds a wall in the first grid in the cell the mouse is over~ + args.state.enemies = args.state.enemies.reject do |enemy| +** Processing line: ~ args.state.player_bullets.any? do |bullet|~ - Inside source: true *** True Line Result - # Adds a wall in the first grid in the cell the mouse is over -** Processing line: ~ def process_input_dijkstra_add_wall~ + args.state.player_bullets.any? do |bullet| +** Processing line: ~ if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2~ - Inside source: true *** True Line Result - def process_input_dijkstra_add_wall -** Processing line: ~ if dijkstra_mouse_over_grid?~ + if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2 +** Processing line: ~ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ - Inside source: true *** True Line Result - if dijkstra_mouse_over_grid? -** Processing line: ~ unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse)~ + args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} +** Processing line: ~ bullet[:despawn] = true~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse) -** Processing line: ~ grid.walls[dijkstra_cell_closest_to_mouse] = true~ + bullet[:despawn] = true +** Processing line: ~ args.state.score += 1000 * args.state.wave~ - Inside source: true *** True Line Result - grid.walls[dijkstra_cell_closest_to_mouse] = true -** Processing line: ~ reset_searches~ + args.state.score += 1000 * args.state.wave +** Processing line: ~ true~ - Inside source: true *** True Line Result - reset_searches + true +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ false~ +- Inside source: true +*** True Line Result + false ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84164,74 +91111,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Adds a wall in the second grid in the cell the mouse is over~ +** Processing line: ~ args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }~ - Inside source: true *** True Line Result - # Adds a wall in the second grid in the cell the mouse is over -** Processing line: ~ def process_input_greedy_add_wall~ + args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] } +** Processing line: ~ args.state.enemy_bullets = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }~ - Inside source: true *** True Line Result - def process_input_greedy_add_wall -** Processing line: ~ if greedy_mouse_over_grid?~ + args.state.enemy_bullets = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] } +** Processing line: ~~ - Inside source: true *** True Line Result - if greedy_mouse_over_grid? -** Processing line: ~ unless grid.walls.has_key?(greedy_cell_closest_to_mouse)~ + +** Processing line: ~ args.state.player[:cooldown] -= 1~ - Inside source: true *** True Line Result - unless grid.walls.has_key?(greedy_cell_closest_to_mouse) -** Processing line: ~ grid.walls[greedy_cell_closest_to_mouse] = true~ + args.state.player[:cooldown] -= 1 +** Processing line: ~ if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]~ - Inside source: true *** True Line Result - grid.walls[greedy_cell_closest_to_mouse] = true -** Processing line: ~ reset_searches~ + if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive] +** Processing line: ~ args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite +** Processing line: ~ args.state.fired_shots += 1~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.fired_shots += 1 +** Processing line: ~ args.state.player[:cooldown] = 10 + 20 / args.state.wave~ - Inside source: true *** True Line Result - end + args.state.player[:cooldown] = 10 + 20 / args.state.wave ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Adds a wall in the third grid in the cell the mouse is over~ -- Inside source: true -*** True Line Result - # Adds a wall in the third grid in the cell the mouse is over -** Processing line: ~ def process_input_a_star_add_wall~ -- Inside source: true -*** True Line Result - def process_input_a_star_add_wall -** Processing line: ~ if a_star_mouse_over_grid?~ -- Inside source: true -*** True Line Result - if a_star_mouse_over_grid? -** Processing line: ~ unless grid.walls.has_key?(a_star_cell_closest_to_mouse)~ -- Inside source: true -*** True Line Result - unless grid.walls.has_key?(a_star_cell_closest_to_mouse) -** Processing line: ~ grid.walls[a_star_cell_closest_to_mouse] = true~ +** Processing line: ~ args.state.enemies.each do |enemy|~ - Inside source: true *** True Line Result - grid.walls[a_star_cell_closest_to_mouse] = true -** Processing line: ~ reset_searches~ + args.state.enemies.each do |enemy| +** Processing line: ~ if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal~ - Inside source: true *** True Line Result - reset_searches -** Processing line: ~ end~ + if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal +** Processing line: ~ args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite~ - Inside source: true *** True Line Result - end + args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84244,430 +91171,434 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ -- Inside source: true -*** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ +** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse helps with this~ + args.outputs.background_color = [0, 0, 0] +** Processing line: ~ args.outputs.primitives << args.state.enemies.map do |enemy|~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse helps with this -** Processing line: ~ def dijkstra_cell_closest_to_mouse~ + args.outputs.primitives << args.state.enemies.map do |enemy| +** Processing line: ~ [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite~ - Inside source: true *** True Line Result - def dijkstra_cell_closest_to_mouse -** Processing line: ~ # Closest cell to the mouse in the first grid~ + [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Closest cell to the mouse in the first grid -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + end +** Processing line: ~ args.outputs.primitives << args.state.player if args.state.player[:alive]~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + args.outputs.primitives << args.state.player if args.state.player[:alive] +** Processing line: ~ args.outputs.primitives << args.state.explosions~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Bound x and y to the grid~ + args.outputs.primitives << args.state.explosions +** Processing line: ~ args.outputs.primitives << args.state.player_bullets~ - Inside source: true *** True Line Result - # Bound x and y to the grid -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + args.outputs.primitives << args.state.player_bullets +** Processing line: ~ args.outputs.primitives << args.state.enemy_bullets~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + args.outputs.primitives << args.state.enemy_bullets +** Processing line: ~ accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots +** Processing line: ~ args.outputs.primitives << [~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + args.outputs.primitives << [ +** Processing line: ~ [0, 0, 300, 720, 96, 0, 0].solid,~ - Inside source: true *** True Line Result - [x, y] -** Processing line: ~ end~ + [0, 0, 300, 720, 96, 0, 0].solid, +** Processing line: ~ [1280 - 300, 0, 300, 720, 96, 0, 0].solid,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [1280 - 300, 0, 300, 720, 96, 0, 0].solid, +** Processing line: ~ [1280 - 290, 60, "Wave #{args.state.wave}", 255, 255, 255].label,~ - Inside source: true *** True Line Result - -** Processing line: ~ # When the user grabs the star and puts their cursor to the far right~ + [1280 - 290, 60, "Wave #{args.state.wave}", 255, 255, 255].label, +** Processing line: ~ [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,~ - Inside source: true *** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ + [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label, +** Processing line: ~ [1280 - 290, 20, "Score #{(args.state.score * accuracy).floor}", 255, 255, 255].label,~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse in the second grid helps with this~ + [1280 - 290, 20, "Score #{(args.state.score * accuracy).floor}", 255, 255, 255].label, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse in the second grid helps with this -** Processing line: ~ def greedy_cell_closest_to_mouse~ + ] +** Processing line: ~ args.outputs.primitives << args.state.lives.times.map do |n|~ - Inside source: true *** True Line Result - def greedy_cell_closest_to_mouse -** Processing line: ~ # Closest cell grid to the mouse in the second~ + args.outputs.primitives << args.state.lives.times.map do |n| +** Processing line: ~ [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite~ - Inside source: true *** True Line Result - # Closest cell grid to the mouse in the second -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + end +** Processing line: ~ #args.outputs.debug << args.gtk.framerate_diagnostics_primitives~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Translate the cell to the first grid~ + #args.outputs.debug << args.gtk.framerate_diagnostics_primitives +** Processing line: ~~ - Inside source: true *** True Line Result - # Translate the cell to the first grid -** Processing line: ~ x -= grid.width + 1~ + +** Processing line: ~ if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }~ - Inside source: true *** True Line Result - x -= grid.width + 1 -** Processing line: ~ # Bound x and y to the first grid~ + if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal } +** Processing line: ~ args.state.player[:alive] = true~ - Inside source: true *** True Line Result - # Bound x and y to the first grid -** Processing line: ~ x = 0 if x < 0~ + args.state.player[:alive] = true +** Processing line: ~ args.state.player[:x] = 624~ - Inside source: true *** True Line Result - x = 0 if x < 0 -** Processing line: ~ y = 0 if y < 0~ + args.state.player[:x] = 624 +** Processing line: ~ args.state.player[:y] = 80~ - Inside source: true *** True Line Result - y = 0 if y < 0 -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + args.state.player[:y] = 80 +** Processing line: ~ args.state.lives -= 1~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + args.state.lives -= 1 +** Processing line: ~ if args.state.lives == -1~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + if args.state.lives == -1 +** Processing line: ~ args.state.clear!~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + args.state.clear! +** Processing line: ~ end~ - Inside source: true *** True Line Result - [x, y] + 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: ~ # When the user grabs the star and puts their cursor to the far right~ +** Processing line: ~ def make_enemies~ - Inside source: true *** True Line Result - # When the user grabs the star and puts their cursor to the far right -** Processing line: ~ # and moves up and down, the star is supposed to move along the grid as well~ + def make_enemies +** Processing line: ~ enemies = []~ - Inside source: true *** True Line Result - # and moves up and down, the star is supposed to move along the grid as well -** Processing line: ~ # Finding the cell closest to the mouse in the third grid helps with this~ + enemies = [] +** Processing line: ~ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~ - Inside source: true *** True Line Result - # Finding the cell closest to the mouse in the third grid helps with this -** Processing line: ~ def a_star_cell_closest_to_mouse~ + enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} } +** Processing line: ~ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~ - Inside source: true *** True Line Result - def a_star_cell_closest_to_mouse -** Processing line: ~ # Closest cell grid to the mouse in the second~ + enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} } +** Processing line: ~ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~ - Inside source: true *** True Line Result - # Closest cell grid to the mouse in the second -** Processing line: ~ x = (inputs.mouse.point.x / grid.cell_size).to_i~ + enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} } +** Processing line: ~ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~ - Inside source: true *** True Line Result - x = (inputs.mouse.point.x / grid.cell_size).to_i -** Processing line: ~ y = (inputs.mouse.point.y / grid.cell_size).to_i~ + enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} } +** Processing line: ~ enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }~ - Inside source: true *** True Line Result - y = (inputs.mouse.point.y / grid.cell_size).to_i -** Processing line: ~ # Translate the cell to the first grid~ + enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} } +** Processing line: ~ enemies~ - Inside source: true *** True Line Result - # Translate the cell to the first grid -** Processing line: ~ x -= (grid.width + 1) * 2~ + enemies +** Processing line: ~ end~ - Inside source: true *** True Line Result - x -= (grid.width + 1) * 2 -** Processing line: ~ # Bound x and y to the first grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Bound x and y to the first grid -** Processing line: ~ x = 0 if x < 0~ + +** Processing line: ~ def update_explosions args~ - Inside source: true *** True Line Result - x = 0 if x < 0 -** Processing line: ~ y = 0 if y < 0~ + def update_explosions args +** Processing line: ~ args.state.explosions.each do |explosion|~ - Inside source: true *** True Line Result - y = 0 if y < 0 -** Processing line: ~ x = grid.width - 1 if x > grid.width - 1~ + args.state.explosions.each do |explosion| +** Processing line: ~ explosion[:age] += 0.5~ - Inside source: true *** True Line Result - x = grid.width - 1 if x > grid.width - 1 -** Processing line: ~ y = grid.height - 1 if y > grid.height - 1~ + explosion[:age] += 0.5 +** Processing line: ~ explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"~ - Inside source: true *** True Line Result - y = grid.height - 1 if y > grid.height - 1 -** Processing line: ~ # Return closest cell~ + explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png" +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Return closest cell -** Processing line: ~ [x, y]~ + end +** Processing line: ~ args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }~ - Inside source: true *** True Line Result - [x, y] -** Processing line: ~ end~ + args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def reset_searches~ +** Processing line: ~ def update_enemy_positions args~ - Inside source: true *** True Line Result - def reset_searches -** Processing line: ~ # Reset the searches~ + def update_enemy_positions args +** Processing line: ~ args.state.enemies.each do |enemy|~ - Inside source: true *** True Line Result - # Reset the searches -** Processing line: ~ dijkstra.came_from = {}~ + args.state.enemies.each do |enemy| +** Processing line: ~ if enemy[:move_state] == :normal~ - Inside source: true *** True Line Result - dijkstra.came_from = {} -** Processing line: ~ dijkstra.cost_so_far = {}~ + if enemy[:move_state] == :normal +** Processing line: ~ enemy[:x] = args.state.columns[enemy[:col]]~ - Inside source: true *** True Line Result - dijkstra.cost_so_far = {} -** Processing line: ~ dijkstra.frontier = []~ + enemy[:x] = args.state.columns[enemy[:col]] +** Processing line: ~ enemy[:y] = args.state.rows[enemy[:row]]~ - Inside source: true *** True Line Result - dijkstra.frontier = [] -** Processing line: ~ dijkstra.path = []~ + enemy[:y] = args.state.rows[enemy[:row]] +** Processing line: ~ enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]~ - Inside source: true *** True Line Result - dijkstra.path = [] -** Processing line: ~~ + enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive] +** Processing line: ~ elsif enemy[:move_state] == :dive~ - Inside source: true *** True Line Result - -** Processing line: ~ greedy.came_from = {}~ + elsif enemy[:move_state] == :dive +** Processing line: ~ enemy[:target_x] ||= args.state.player[:x]~ - Inside source: true *** True Line Result - greedy.came_from = {} -** Processing line: ~ greedy.frontier = []~ + enemy[:target_x] ||= args.state.player[:x] +** Processing line: ~ enemy[:target_y] ||= args.state.player[:y]~ - Inside source: true *** True Line Result - greedy.frontier = [] -** Processing line: ~ greedy.path = []~ + enemy[:target_y] ||= args.state.player[:y] +** Processing line: ~ dx = enemy[:target_x] - enemy[:x]~ - Inside source: true *** True Line Result - greedy.path = [] -** Processing line: ~ a_star.came_from = {}~ + dx = enemy[:target_x] - enemy[:x] +** Processing line: ~ dy = enemy[:target_y] - enemy[:y]~ - Inside source: true *** True Line Result - a_star.came_from = {} -** Processing line: ~ a_star.frontier = []~ + dy = enemy[:target_y] - enemy[:y] +** Processing line: ~ vel = Math.sqrt(dx * dx + dy * dy)~ - Inside source: true *** True Line Result - a_star.frontier = [] -** Processing line: ~ a_star.path = []~ + vel = Math.sqrt(dx * dx + dy * dy) +** Processing line: ~ speed_limit = 2 + args.state.wave_root~ - Inside source: true *** True Line Result - a_star.path = [] -** Processing line: ~ end~ + speed_limit = 2 + args.state.wave_root +** Processing line: ~ if vel > speed_limit~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if vel > speed_limit +** Processing line: ~ dx /= vel / speed_limit~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_searches~ + dx /= vel / speed_limit +** Processing line: ~ dy /= vel / speed_limit~ - Inside source: true *** True Line Result - def calc_searches -** Processing line: ~ calc_dijkstra~ + dy /= vel / speed_limit +** Processing line: ~ end~ - Inside source: true *** True Line Result - calc_dijkstra -** Processing line: ~ calc_greedy~ + end +** Processing line: ~ if vel < 1 || !args.state.player[:alive]~ - Inside source: true *** True Line Result - calc_greedy -** Processing line: ~ calc_a_star~ + if vel < 1 || !args.state.player[:alive] +** Processing line: ~ enemy[:move_state] = :retreat~ - Inside source: true *** True Line Result - calc_a_star -** Processing line: ~ # Move the searches forward to the current step~ + enemy[:move_state] = :retreat +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Move the searches forward to the current step -** Processing line: ~ # state.current_step.times { move_searches_one_step_forward }~ + end +** Processing line: ~ enemy[:x] += dx~ - Inside source: true *** True Line Result - # state.current_step.times { move_searches_one_step_forward } -** Processing line: ~ end~ + enemy[:x] += dx +** Processing line: ~ enemy[:y] += dy~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + enemy[:y] += dy +** Processing line: ~ elsif enemy[:move_state] == :retreat~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_dijkstra~ + elsif enemy[:move_state] == :retreat +** Processing line: ~ enemy[:target_x] = args.state.columns[enemy[:col]]~ - Inside source: true *** True Line Result - def calc_dijkstra -** Processing line: ~ # Sets up the search to begin from the star~ + enemy[:target_x] = args.state.columns[enemy[:col]] +** Processing line: ~ enemy[:target_y] = args.state.rows[enemy[:row]]~ - Inside source: true *** True Line Result - # Sets up the search to begin from the star -** Processing line: ~ dijkstra.frontier << grid.star~ + enemy[:target_y] = args.state.rows[enemy[:row]] +** Processing line: ~ dx = enemy[:target_x] - enemy[:x]~ - Inside source: true *** True Line Result - dijkstra.frontier << grid.star -** Processing line: ~ dijkstra.came_from[grid.star] = nil~ + dx = enemy[:target_x] - enemy[:x] +** Processing line: ~ dy = enemy[:target_y] - enemy[:y]~ - Inside source: true *** True Line Result - dijkstra.came_from[grid.star] = nil -** Processing line: ~ dijkstra.cost_so_far[grid.star] = 0~ + dy = enemy[:target_y] - enemy[:y] +** Processing line: ~ vel = Math.sqrt(dx * dx + dy * dy)~ - Inside source: true *** True Line Result - dijkstra.cost_so_far[grid.star] = 0 -** Processing line: ~~ + vel = Math.sqrt(dx * dx + dy * dy) +** Processing line: ~ speed_limit = 2 + args.state.wave_root~ - Inside source: true *** True Line Result - -** Processing line: ~ # Until the target is found or there are no more cells to explore from~ + speed_limit = 2 + args.state.wave_root +** Processing line: ~ if vel > speed_limit~ - Inside source: true *** True Line Result - # Until the target is found or there are no more cells to explore from -** Processing line: ~ until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty?~ + if vel > speed_limit +** Processing line: ~ dx /= vel / speed_limit~ - Inside source: true *** True Line Result - until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty? -** Processing line: ~ # Take the next frontier cell. The first element is the cell, the second is the priority.~ + dx /= vel / speed_limit +** Processing line: ~ dy /= vel / speed_limit~ - Inside source: true *** True Line Result - # Take the next frontier cell. The first element is the cell, the second is the priority. -** Processing line: ~ new_frontier = dijkstra.frontier.shift#[0]~ + dy /= vel / speed_limit +** Processing line: ~ elsif vel < 1~ - Inside source: true *** True Line Result - new_frontier = dijkstra.frontier.shift#[0] -** Processing line: ~ # For each of its neighbors~ + elsif vel < 1 +** Processing line: ~ enemy[:move_state] = :normal~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ + enemy[:move_state] = :normal +** Processing line: ~ enemy[:target_x] = nil~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do | neighbor | -** Processing line: ~ # That have not been visited and are not walls~ + enemy[:target_x] = nil +** Processing line: ~ enemy[:target_y] = nil~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ + enemy[:target_y] = nil +** Processing line: ~ end~ - Inside source: true *** True Line Result - unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited~ + end +** Processing line: ~ enemy[:x] += dx~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited -** Processing line: ~ dijkstra.frontier << neighbor~ + enemy[:x] += dx +** Processing line: ~ enemy[:y] += dy~ - Inside source: true *** True Line Result - dijkstra.frontier << neighbor -** Processing line: ~ dijkstra.came_from[neighbor] = new_frontier~ + enemy[:y] += dy +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra.came_from[neighbor] = new_frontier -** Processing line: ~ dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1 -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. +*** True Line Result +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ -- Inside source: true +** Processing line: ~*** Arcade - Dueling Starships - main.rb~ +- Header detected. *** True Line Result - # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line -** Processing line: ~ # Comment this line and let a path generate to see the difference~ -- Inside source: true + *** True Line Result - # Comment this line and let a path generate to see the difference -** Processing line: ~ dijkstra.frontier = dijkstra.frontier.sort_by {| cell | proximity_to_star(cell) }~ -- Inside source: true +*** Arcade - Dueling Starships - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - dijkstra.frontier = dijkstra.frontier.sort_by {| cell | proximity_to_star(cell) } -** Processing line: ~ dijkstra.frontier = dijkstra.frontier.sort_by {| cell | dijkstra.cost_so_far[cell] }~ + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/dueling_starships/app/main.rb~ - Inside source: true *** True Line Result - dijkstra.frontier = dijkstra.frontier.sort_by {| cell | dijkstra.cost_so_far[cell] } -** Processing line: ~ end~ + # ./samples/99_genre_arcade/dueling_starships/app/main.rb +** Processing line: ~ class DuelingSpaceships~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + class DuelingSpaceships +** Processing line: ~ attr_accessor :state, :inputs, :outputs, :grid~ - Inside source: true *** True Line Result - + attr_accessor :state, :inputs, :outputs, :grid ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the search found the target~ +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - # If the search found the target -** Processing line: ~ if dijkstra.came_from.has_key?(grid.target)~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - if dijkstra.came_from.has_key?(grid.target) -** Processing line: ~ # Calculate the path between the target and star~ + defaults +** Processing line: ~ render~ - Inside source: true *** True Line Result - # Calculate the path between the target and star -** Processing line: ~ dijkstra_calc_path~ + render +** Processing line: ~ calc~ - Inside source: true *** True Line Result - dijkstra_calc_path -** Processing line: ~ end~ + calc +** Processing line: ~ input~ - Inside source: true *** True Line Result - end + input ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84676,130 +91607,142 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc_greedy~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - def calc_greedy -** Processing line: ~ # Sets up the search to begin from the star~ + def defaults +** Processing line: ~ outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - # Sets up the search to begin from the star -** Processing line: ~ greedy.frontier << grid.star~ + outputs.background_color = [0, 0, 0] +** Processing line: ~ state.ship_blue ||= new_blue_ship~ - Inside source: true *** True Line Result - greedy.frontier << grid.star -** Processing line: ~ greedy.came_from[grid.star] = nil~ + state.ship_blue ||= new_blue_ship +** Processing line: ~ state.ship_red ||= new_red_ship~ - Inside source: true *** True Line Result - greedy.came_from[grid.star] = nil -** Processing line: ~~ + state.ship_red ||= new_red_ship +** Processing line: ~ state.flames ||= []~ - Inside source: true *** True Line Result - -** Processing line: ~ # Until the target is found or there are no more cells to explore from~ + state.flames ||= [] +** Processing line: ~ state.bullets ||= []~ - Inside source: true *** True Line Result - # Until the target is found or there are no more cells to explore from -** Processing line: ~ until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty?~ + state.bullets ||= [] +** Processing line: ~ state.ship_blue_score ||= 0~ - Inside source: true *** True Line Result - until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty? -** Processing line: ~ # Take the next frontier cell~ + state.ship_blue_score ||= 0 +** Processing line: ~ state.ship_red_score ||= 0~ - Inside source: true *** True Line Result - # Take the next frontier cell -** Processing line: ~ new_frontier = greedy.frontier.shift~ + state.ship_red_score ||= 0 +** Processing line: ~ state.stars ||= 100.map do~ - Inside source: true *** True Line Result - new_frontier = greedy.frontier.shift -** Processing line: ~ # For each of its neighbors~ + state.stars ||= 100.map do +** Processing line: ~ [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),~ - Inside source: true *** True Line Result - # For each of its neighbors -** Processing line: ~ adjacent_neighbors(new_frontier).each do | neighbor |~ + [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio), +** Processing line: ~ grid.h_half.randomize(:sign, :ratio)),~ - Inside source: true *** True Line Result - adjacent_neighbors(new_frontier).each do | neighbor | -** Processing line: ~ # That have not been visited and are not walls~ + grid.h_half.randomize(:sign, :ratio)), +** Processing line: ~ 128 + 128.randomize(:ratio), 255, 255]~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ + 128 + 128.randomize(:ratio), 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited -** Processing line: ~ greedy.frontier << neighbor~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - greedy.frontier << neighbor -** Processing line: ~ greedy.came_from[neighbor] = new_frontier~ + +** Processing line: ~ def default_ship x, y, angle, sprite_path, bullet_sprite_path, color~ - Inside source: true *** True Line Result - greedy.came_from[neighbor] = new_frontier -** Processing line: ~ end~ + def default_ship x, y, angle, sprite_path, bullet_sprite_path, color +** Processing line: ~ state.new_entity(:ship,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.new_entity(:ship, +** Processing line: ~ { x: x,~ - Inside source: true *** True Line Result - end -** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ + { x: x, +** Processing line: ~ y: y,~ - Inside source: true *** True Line Result - # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line -** Processing line: ~ # Comment this line and let a path generate to see the difference~ + y: y, +** Processing line: ~ dy: 0,~ - Inside source: true *** True Line Result - # Comment this line and let a path generate to see the difference -** Processing line: ~ greedy.frontier = greedy.frontier.sort_by {| cell | proximity_to_star(cell) }~ + dy: 0, +** Processing line: ~ dx: 0,~ - Inside source: true *** True Line Result - greedy.frontier = greedy.frontier.sort_by {| cell | proximity_to_star(cell) } -** Processing line: ~ # Sort the frontier so cells that are close to the target are then prioritized~ + dx: 0, +** Processing line: ~ damage: 0,~ - Inside source: true *** True Line Result - # Sort the frontier so cells that are close to the target are then prioritized -** Processing line: ~ greedy.frontier = greedy.frontier.sort_by {| cell | greedy_heuristic(cell) }~ + damage: 0, +** Processing line: ~ dead: false,~ - Inside source: true *** True Line Result - greedy.frontier = greedy.frontier.sort_by {| cell | greedy_heuristic(cell) } -** Processing line: ~ end~ + dead: false, +** Processing line: ~ angle: angle,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + angle: angle, +** Processing line: ~ max_alpha: 255,~ - Inside source: true *** True Line Result - -** Processing line: ~~ + max_alpha: 255, +** Processing line: ~ sprite_path: sprite_path,~ - Inside source: true *** True Line Result - -** Processing line: ~ # If the search found the target~ + sprite_path: sprite_path, +** Processing line: ~ bullet_sprite_path: bullet_sprite_path,~ - Inside source: true *** True Line Result - # If the search found the target -** Processing line: ~ if greedy.came_from.has_key?(grid.target)~ + bullet_sprite_path: bullet_sprite_path, +** Processing line: ~ color: color })~ - Inside source: true *** True Line Result - if greedy.came_from.has_key?(grid.target) -** Processing line: ~ # Calculate the path between the target and star~ + color: color }) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Calculate the path between the target and star -** Processing line: ~ greedy_calc_path~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - greedy_calc_path -** Processing line: ~ end~ + +** Processing line: ~ def new_red_ship~ - Inside source: true *** True Line Result - end + def new_red_ship +** Processing line: ~ default_ship(400, 250.randomize(:sign, :ratio),~ +- Inside source: true +*** True Line Result + default_ship(400, 250.randomize(:sign, :ratio), +** Processing line: ~ 180, 'sprites/ship_red.png', 'sprites/red_bullet.png',~ +- Inside source: true +*** True Line Result + 180, 'sprites/ship_red.png', 'sprites/red_bullet.png', +** Processing line: ~ [255, 90, 90])~ +- Inside source: true +*** True Line Result + [255, 90, 90]) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84808,138 +91751,158 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc_a_star~ +** Processing line: ~ def new_blue_ship~ - Inside source: true *** True Line Result - def calc_a_star -** Processing line: ~ # Setup the search to start from the star~ + def new_blue_ship +** Processing line: ~ default_ship(-400, 250.randomize(:sign, :ratio),~ - Inside source: true *** True Line Result - # Setup the search to start from the star -** Processing line: ~ a_star.came_from[grid.star] = nil~ + default_ship(-400, 250.randomize(:sign, :ratio), +** Processing line: ~ 0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',~ - Inside source: true *** True Line Result - a_star.came_from[grid.star] = nil -** Processing line: ~ a_star.cost_so_far[grid.star] = 0~ + 0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png', +** Processing line: ~ [110, 140, 255])~ - Inside source: true *** True Line Result - a_star.cost_so_far[grid.star] = 0 -** Processing line: ~ a_star.frontier << grid.star~ + [110, 140, 255]) +** Processing line: ~ end~ - Inside source: true *** True Line Result - a_star.frontier << grid.star + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Until there are no more cells to explore from or the search has found the target~ +** Processing line: ~ def render~ - Inside source: true *** True Line Result - # Until there are no more cells to explore from or the search has found the target -** Processing line: ~ until a_star.frontier.empty? or a_star.came_from.has_key?(grid.target)~ + def render +** Processing line: ~ render_instructions~ - Inside source: true *** True Line Result - until a_star.frontier.empty? or a_star.came_from.has_key?(grid.target) -** Processing line: ~ # Get the next cell to expand from~ + render_instructions +** Processing line: ~ render_score~ - Inside source: true *** True Line Result - # Get the next cell to expand from -** Processing line: ~ current_frontier = a_star.frontier.shift~ + render_score +** Processing line: ~ render_universe~ - Inside source: true *** True Line Result - current_frontier = a_star.frontier.shift + render_universe +** Processing line: ~ render_flames~ +- Inside source: true +*** True Line Result + render_flames +** Processing line: ~ render_ships~ +- Inside source: true +*** True Line Result + render_ships +** Processing line: ~ render_bullets~ +- Inside source: true +*** True Line Result + render_bullets +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # For each of that cells neighbors~ +** Processing line: ~ def render_ships~ - Inside source: true *** True Line Result - # For each of that cells neighbors -** Processing line: ~ adjacent_neighbors(current_frontier).each do | neighbor |~ + def render_ships +** Processing line: ~ update_ship_outputs(state.ship_blue)~ - Inside source: true *** True Line Result - adjacent_neighbors(current_frontier).each do | neighbor | -** Processing line: ~ # That have not been visited and are not walls~ + update_ship_outputs(state.ship_blue) +** Processing line: ~ update_ship_outputs(state.ship_red)~ - Inside source: true *** True Line Result - # That have not been visited and are not walls -** Processing line: ~ unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)~ + update_ship_outputs(state.ship_red) +** Processing line: ~ outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]~ - Inside source: true *** True Line Result - unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) -** Processing line: ~ # Add them to the frontier and mark them as visited~ + outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite] +** Processing line: ~ outputs.labels << [state.ship_blue.label, state.ship_red.label]~ - Inside source: true *** True Line Result - # Add them to the frontier and mark them as visited -** Processing line: ~ a_star.frontier << neighbor~ + outputs.labels << [state.ship_blue.label, state.ship_red.label] +** Processing line: ~ end~ - Inside source: true *** True Line Result - a_star.frontier << neighbor -** Processing line: ~ a_star.came_from[neighbor] = current_frontier~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - a_star.came_from[neighbor] = current_frontier -** Processing line: ~ a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1~ + +** Processing line: ~ def render_instructions~ - Inside source: true *** True Line Result - a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1 -** Processing line: ~ end~ + def render_instructions +** Processing line: ~ return if state.ship_blue.dx > 0 || state.ship_blue.dy > 0 ||~ +- Inside source: true +*** True Line Result + return if state.ship_blue.dx > 0 || state.ship_blue.dy > 0 || +** Processing line: ~ state.ship_red.dx > 0 || state.ship_red.dy > 0 ||~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.ship_red.dx > 0 || state.ship_red.dy > 0 || +** Processing line: ~ state.flames.length > 0~ - Inside source: true *** True Line Result - end + state.flames.length > 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line~ +** Processing line: ~ outputs.labels << [grid.left.shift_right(30),~ - Inside source: true *** True Line Result - # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line -** Processing line: ~ # Comment this line and let a path generate to see the difference~ + outputs.labels << [grid.left.shift_right(30), +** Processing line: ~ grid.bottom.shift_up(30),~ - Inside source: true *** True Line Result - # Comment this line and let a path generate to see the difference -** Processing line: ~ a_star.frontier = a_star.frontier.sort_by {| cell | proximity_to_star(cell) }~ + grid.bottom.shift_up(30), +** Processing line: ~ "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",~ - Inside source: true *** True Line Result - a_star.frontier = a_star.frontier.sort_by {| cell | proximity_to_star(cell) } -** Processing line: ~ a_star.frontier = a_star.frontier.sort_by {| cell | a_star.cost_so_far[cell] + greedy_heuristic(cell) }~ + "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.", +** Processing line: ~ 0, 0, 255, 255, 255]~ - Inside source: true *** True Line Result - a_star.frontier = a_star.frontier.sort_by {| cell | a_star.cost_so_far[cell] + greedy_heuristic(cell) } -** Processing line: ~ end~ + 0, 0, 255, 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the search found the target~ +** Processing line: ~ def calc~ - Inside source: true *** True Line Result - # If the search found the target -** Processing line: ~ if a_star.came_from.has_key?(grid.target)~ + def calc +** Processing line: ~ calc_thrusts~ - Inside source: true *** True Line Result - if a_star.came_from.has_key?(grid.target) -** Processing line: ~ # Calculate the path between the target and star~ + calc_thrusts +** Processing line: ~ calc_ships~ - Inside source: true *** True Line Result - # Calculate the path between the target and star -** Processing line: ~ a_star_calc_path~ + calc_ships +** Processing line: ~ calc_bullets~ - Inside source: true *** True Line Result - a_star_calc_path -** Processing line: ~ end~ + calc_bullets +** Processing line: ~ calc_winner~ - Inside source: true *** True Line Result - end + calc_winner ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -84948,70 +91911,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path between the target and star for the breadth first search~ -- Inside source: true -*** True Line Result - # Calculates the path between the target and star for the breadth first search -** Processing line: ~ # Only called when the breadth first search finds the target~ -- Inside source: true -*** True Line Result - # Only called when the breadth first search finds the target -** Processing line: ~ def dijkstra_calc_path~ +** Processing line: ~ def input~ - Inside source: true *** True Line Result - def dijkstra_calc_path -** Processing line: ~ # Start from the target~ + def input +** Processing line: ~ input_accelerate~ - Inside source: true *** True Line Result - # Start from the target -** Processing line: ~ endpoint = grid.target~ + input_accelerate +** Processing line: ~ input_turn~ - Inside source: true *** True Line Result - endpoint = grid.target -** Processing line: ~ # And the cell it came from~ + input_turn +** Processing line: ~ input_bullets_and_mines~ - Inside source: true *** True Line Result - # And the cell it came from -** Processing line: ~ next_endpoint = dijkstra.came_from[endpoint]~ + input_bullets_and_mines +** Processing line: ~ end~ - Inside source: true *** True Line Result - next_endpoint = dijkstra.came_from[endpoint] -** Processing line: ~ while endpoint and next_endpoint~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between these two cells and store it~ + +** Processing line: ~ def render_score~ - Inside source: true *** True Line Result - # Draw a path between these two cells and store it -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + def render_score +** Processing line: ~ outputs.labels << [grid.left.shift_right(80),~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ dijkstra.path << path~ + outputs.labels << [grid.left.shift_right(80), +** Processing line: ~ grid.top.shift_down(40),~ - Inside source: true *** True Line Result - dijkstra.path << path -** Processing line: ~ # And get the next pair of cells~ + grid.top.shift_down(40), +** Processing line: ~ state.ship_blue_score, 30, 1, state.ship_blue.color]~ - Inside source: true *** True Line Result - # And get the next pair of cells -** Processing line: ~ endpoint = next_endpoint~ + state.ship_blue_score, 30, 1, state.ship_blue.color] +** Processing line: ~~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = dijkstra.came_from[endpoint]~ + +** Processing line: ~ outputs.labels << [grid.right.shift_left(80),~ - Inside source: true *** True Line Result - next_endpoint = dijkstra.came_from[endpoint] -** Processing line: ~ # Continue till there are no more cells~ + outputs.labels << [grid.right.shift_left(80), +** Processing line: ~ grid.top.shift_down(40),~ - Inside source: true *** True Line Result - # Continue till there are no more cells -** Processing line: ~ end~ + grid.top.shift_down(40), +** Processing line: ~ state.ship_red_score, 30, 1, state.ship_red.color]~ - Inside source: true *** True Line Result - end + state.ship_red_score, 30, 1, state.ship_red.color] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85020,22 +91975,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns one-dimensional absolute distance between cell and target~ +** Processing line: ~ def render_universe~ - Inside source: true *** True Line Result - # Returns one-dimensional absolute distance between cell and target -** Processing line: ~ # Returns a number to compare distances between cells and the target~ + def render_universe +** Processing line: ~ return if outputs.static_solids.any?~ - Inside source: true *** True Line Result - # Returns a number to compare distances between cells and the target -** Processing line: ~ def greedy_heuristic(cell)~ + return if outputs.static_solids.any? +** Processing line: ~ outputs.static_solids << grid.rect~ - Inside source: true *** True Line Result - def greedy_heuristic(cell) -** Processing line: ~ (grid.target.x - cell.x).abs + (grid.target.y - cell.y).abs~ + outputs.static_solids << grid.rect +** Processing line: ~ outputs.static_solids << state.stars~ - Inside source: true *** True Line Result - (grid.target.x - cell.x).abs + (grid.target.y - cell.y).abs + outputs.static_solids << state.stars ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85044,70 +91999,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path between the target and star for the greedy search~ +** Processing line: ~ def apply_round_finished_alpha entity~ - Inside source: true *** True Line Result - # Calculates the path between the target and star for the greedy search -** Processing line: ~ # Only called when the greedy search finds the target~ + def apply_round_finished_alpha entity +** Processing line: ~ return entity unless state.round_finished_debounce~ - Inside source: true *** True Line Result - # Only called when the greedy search finds the target -** Processing line: ~ def greedy_calc_path~ + return entity unless state.round_finished_debounce +** Processing line: ~ entity.a *= state.round_finished_debounce.percentage_of(2.seconds)~ - Inside source: true *** True Line Result - def greedy_calc_path -** Processing line: ~ # Start from the target~ + entity.a *= state.round_finished_debounce.percentage_of(2.seconds) +** Processing line: ~ return entity~ - Inside source: true *** True Line Result - # Start from the target -** Processing line: ~ endpoint = grid.target~ + return entity +** Processing line: ~ end~ - Inside source: true *** True Line Result - endpoint = grid.target -** Processing line: ~ # And the cell it came from~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # And the cell it came from -** Processing line: ~ next_endpoint = greedy.came_from[endpoint]~ + +** Processing line: ~ def update_ship_outputs ship, sprite_size = 66~ - Inside source: true *** True Line Result - next_endpoint = greedy.came_from[endpoint] -** Processing line: ~ while endpoint and next_endpoint~ + def update_ship_outputs ship, sprite_size = 66 +** Processing line: ~ ship.sprite =~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between these two cells and store it~ + ship.sprite = +** Processing line: ~ apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),~ - Inside source: true *** True Line Result - # Draw a path between these two cells and store it -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y), +** Processing line: ~ ship.sprite_path,~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ greedy.path << path~ + ship.sprite_path, +** Processing line: ~ ship.angle,~ - Inside source: true *** True Line Result - greedy.path << path -** Processing line: ~ # And get the next pair of cells~ + ship.angle, +** Processing line: ~ ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite~ - Inside source: true *** True Line Result - # And get the next pair of cells -** Processing line: ~ endpoint = next_endpoint~ + ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite +** Processing line: ~ ship.label =~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = greedy.came_from[endpoint]~ + ship.label = +** Processing line: ~ apply_round_finished_alpha [ship.x,~ - Inside source: true *** True Line Result - next_endpoint = greedy.came_from[endpoint] -** Processing line: ~ # Continue till there are no more cells~ + apply_round_finished_alpha [ship.x, +** Processing line: ~ ship.y + 100,~ - Inside source: true *** True Line Result - # Continue till there are no more cells -** Processing line: ~ end~ + ship.y + 100, +** Processing line: ~ "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label~ - Inside source: true *** True Line Result - end + "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85116,74 +92071,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the path between the target and star for the a_star search~ +** Processing line: ~ def render_flames sprite_size = 6~ - Inside source: true *** True Line Result - # Calculates the path between the target and star for the a_star search -** Processing line: ~ # Only called when the a_star search finds the target~ + def render_flames sprite_size = 6 +** Processing line: ~ outputs.sprites << state.flames.map do |p|~ - Inside source: true *** True Line Result - # Only called when the a_star search finds the target -** Processing line: ~ def a_star_calc_path~ + outputs.sprites << state.flames.map do |p| +** Processing line: ~ apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),~ - Inside source: true *** True Line Result - def a_star_calc_path -** Processing line: ~ # Start from the target~ + apply_round_finished_alpha [sprite_size.to_square(p.x, p.y), +** Processing line: ~ 'sprites/flame.png', 0,~ - Inside source: true *** True Line Result - # Start from the target -** Processing line: ~ endpoint = grid.target~ + 'sprites/flame.png', 0, +** Processing line: ~ p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite~ - Inside source: true *** True Line Result - endpoint = grid.target -** Processing line: ~ # And the cell it came from~ + p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - # And the cell it came from -** Processing line: ~ next_endpoint = a_star.came_from[endpoint]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - next_endpoint = a_star.came_from[endpoint] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ while endpoint and next_endpoint~ +** Processing line: ~ def render_bullets sprite_size = 10~ - Inside source: true *** True Line Result - while endpoint and next_endpoint -** Processing line: ~ # Draw a path between these two cells and store it~ + def render_bullets sprite_size = 10 +** Processing line: ~ outputs.sprites << state.bullets.map do |b|~ - Inside source: true *** True Line Result - # Draw a path between these two cells and store it -** Processing line: ~ path = get_path_between(endpoint, next_endpoint)~ + outputs.sprites << state.bullets.map do |b| +** Processing line: ~ apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),~ - Inside source: true *** True Line Result - path = get_path_between(endpoint, next_endpoint) -** Processing line: ~ a_star.path << path~ + apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y), +** Processing line: ~ b.owner.bullet_sprite_path,~ - Inside source: true *** True Line Result - a_star.path << path -** Processing line: ~ # And get the next pair of cells~ + b.owner.bullet_sprite_path, +** Processing line: ~ 0, b.max_alpha].sprite~ - Inside source: true *** True Line Result - # And get the next pair of cells -** Processing line: ~ endpoint = next_endpoint~ + 0, b.max_alpha].sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - endpoint = next_endpoint -** Processing line: ~ next_endpoint = a_star.came_from[endpoint]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - next_endpoint = a_star.came_from[endpoint] -** Processing line: ~ # Continue till there are no more cells~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Continue till there are no more cells -** Processing line: ~ end~ + +** Processing line: ~ def wrap_location! location~ - Inside source: true *** True Line Result - end + def wrap_location! location +** Processing line: ~ location.x = grid.left if location.x > grid.right~ +- Inside source: true +*** True Line Result + location.x = grid.left if location.x > grid.right +** Processing line: ~ location.x = grid.right if location.x < grid.left~ +- Inside source: true +*** True Line Result + location.x = grid.right if location.x < grid.left +** Processing line: ~ location.y = grid.top if location.y < grid.bottom~ +- Inside source: true +*** True Line Result + location.y = grid.top if location.y < grid.bottom +** Processing line: ~ location.y = grid.bottom if location.y > grid.top~ +- Inside source: true +*** True Line Result + location.y = grid.bottom if location.y > grid.top +** Processing line: ~ location~ +- Inside source: true +*** True Line Result + location ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85192,58 +92167,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns a list of adjacent cells~ +** Processing line: ~ def calc_thrusts~ - Inside source: true *** True Line Result - # Returns a list of adjacent cells -** Processing line: ~ # Used to determine what the next cells to be added to the frontier are~ + def calc_thrusts +** Processing line: ~ state.flames =~ - Inside source: true *** True Line Result - # Used to determine what the next cells to be added to the frontier are -** Processing line: ~ def adjacent_neighbors(cell)~ + state.flames = +** Processing line: ~ state.flames~ - Inside source: true *** True Line Result - def adjacent_neighbors(cell) -** Processing line: ~ neighbors = []~ + state.flames +** Processing line: ~ .reject(&:old?)~ - Inside source: true *** True Line Result - neighbors = [] -** Processing line: ~~ + .reject(&:old?) +** Processing line: ~ .map do |p|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Gets all the valid neighbors into the array~ + .map do |p| +** Processing line: ~ p.speed *= 0.9~ - Inside source: true *** True Line Result - # Gets all the valid neighbors into the array -** Processing line: ~ # From southern neighbor, clockwise~ + p.speed *= 0.9 +** Processing line: ~ p.y += p.angle.vector_y(p.speed)~ - Inside source: true *** True Line Result - # From southern neighbor, clockwise -** Processing line: ~ neighbors << [cell.x , cell.y - 1] unless cell.y == 0~ + p.y += p.angle.vector_y(p.speed) +** Processing line: ~ p.x += p.angle.vector_x(p.speed)~ - Inside source: true *** True Line Result - neighbors << [cell.x , cell.y - 1] unless cell.y == 0 -** Processing line: ~ neighbors << [cell.x - 1, cell.y ] unless cell.x == 0~ + p.x += p.angle.vector_x(p.speed) +** Processing line: ~ wrap_location! p~ - Inside source: true *** True Line Result - neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 -** Processing line: ~ neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1~ + wrap_location! p +** Processing line: ~ end~ - Inside source: true *** True Line Result - neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 -** Processing line: ~ neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ neighbors~ +** Processing line: ~ def all_ships~ - Inside source: true *** True Line Result - neighbors + def all_ships +** Processing line: ~ [state.ship_blue, state.ship_red]~ +- Inside source: true +*** True Line Result + [state.ship_blue, state.ship_red] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85252,62 +92231,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Finds the vertical and horizontal distance of a cell from the star~ +** Processing line: ~ def alive_ships~ - Inside source: true *** True Line Result - # Finds the vertical and horizontal distance of a cell from the star -** Processing line: ~ # and returns the larger value~ + def alive_ships +** Processing line: ~ all_ships.reject { |s| s.dead }~ - Inside source: true *** True Line Result - # and returns the larger value -** Processing line: ~ # This method is used to have a zigzag pattern in the rendered path~ + all_ships.reject { |s| s.dead } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # This method is used to have a zigzag pattern in the rendered path -** Processing line: ~ # A cell that is [5, 5] from the star,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # A cell that is [5, 5] from the star, -** Processing line: ~ # is explored before over a cell that is [0, 7] away.~ + +** Processing line: ~ def calc_bullet bullet~ - Inside source: true *** True Line Result - # is explored before over a cell that is [0, 7] away. -** Processing line: ~ # So, if possible, the search tries to go diagonal (zigzag) first~ + def calc_bullet bullet +** Processing line: ~ bullet.y += bullet.angle.vector_y(bullet.speed)~ - Inside source: true *** True Line Result - # So, if possible, the search tries to go diagonal (zigzag) first -** Processing line: ~ def proximity_to_star(cell)~ + bullet.y += bullet.angle.vector_y(bullet.speed) +** Processing line: ~ bullet.x += bullet.angle.vector_x(bullet.speed)~ - Inside source: true *** True Line Result - def proximity_to_star(cell) -** Processing line: ~ distance_x = (grid.star.x - cell.x).abs~ + bullet.x += bullet.angle.vector_x(bullet.speed) +** Processing line: ~ wrap_location! bullet~ - Inside source: true *** True Line Result - distance_x = (grid.star.x - cell.x).abs -** Processing line: ~ distance_y = (grid.star.y - cell.y).abs~ + wrap_location! bullet +** Processing line: ~ explode_bullet! bullet if bullet.old?~ - Inside source: true *** True Line Result - distance_y = (grid.star.y - cell.y).abs -** Processing line: ~~ + explode_bullet! bullet if bullet.old? +** Processing line: ~ return if bullet.exploded~ - Inside source: true *** True Line Result - -** Processing line: ~ if distance_x > distance_y~ + return if bullet.exploded +** Processing line: ~ return if state.round_finished~ - Inside source: true *** True Line Result - if distance_x > distance_y -** Processing line: ~ return distance_x~ + return if state.round_finished +** Processing line: ~ alive_ships.each do |s|~ - Inside source: true *** True Line Result - return distance_x -** Processing line: ~ else~ + alive_ships.each do |s| +** Processing line: ~ if s != bullet.owner &&~ - Inside source: true *** True Line Result - else -** Processing line: ~ return distance_y~ + if s != bullet.owner && +** Processing line: ~ s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))~ - Inside source: true *** True Line Result - return distance_y + s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y)) +** Processing line: ~ explode_bullet! bullet, 10, 5, 30~ +- Inside source: true +*** True Line Result + explode_bullet! bullet, 10, 5, 30 +** Processing line: ~ s.damage += 1~ +- Inside source: true +*** True Line Result + s.damage += 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85320,18 +92311,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Methods that allow code to be more concise. Subdivides args.state, which is where all variables are stored.~ +** Processing line: ~ def calc_bullets~ - Inside source: true *** True Line Result - # Methods that allow code to be more concise. Subdivides args.state, which is where all variables are stored. -** Processing line: ~ def grid~ + def calc_bullets +** Processing line: ~ state.bullets.each { |b| calc_bullet b }~ - Inside source: true *** True Line Result - def grid -** Processing line: ~ state.grid~ + state.bullets.each { |b| calc_bullet b } +** Processing line: ~ state.bullets.reject! { |b| b.exploded }~ - Inside source: true *** True Line Result - state.grid + state.bullets.reject! { |b| b.exploded } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85340,46 +92331,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def dijkstra~ +** Processing line: ~ def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255~ - Inside source: true *** True Line Result - def dijkstra -** Processing line: ~ state.dijkstra~ + def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255 +** Processing line: ~ flame_count.times do~ - Inside source: true *** True Line Result - state.dijkstra -** Processing line: ~ end~ + flame_count.times do +** Processing line: ~ state.flames << state.new_entity(type,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.flames << state.new_entity(type, +** Processing line: ~ { angle: 360.randomize(:ratio),~ - Inside source: true *** True Line Result - -** Processing line: ~ def greedy~ + { angle: 360.randomize(:ratio), +** Processing line: ~ speed: max_speed.randomize(:ratio),~ - Inside source: true *** True Line Result - def greedy -** Processing line: ~ state.greedy~ + speed: max_speed.randomize(:ratio), +** Processing line: ~ lifetime: lifetime,~ - Inside source: true *** True Line Result - state.greedy -** Processing line: ~ end~ + lifetime: lifetime, +** Processing line: ~ x: entity.x,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + x: entity.x, +** Processing line: ~ y: entity.y,~ - Inside source: true *** True Line Result - -** Processing line: ~ def a_star~ + y: entity.y, +** Processing line: ~ max_alpha: max_alpha })~ - Inside source: true *** True Line Result - def a_star -** Processing line: ~ state.a_star~ + max_alpha: max_alpha }) +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.a_star + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85388,34 +92379,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Descriptive aliases for colors~ +** Processing line: ~ def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10~ - Inside source: true *** True Line Result - # Descriptive aliases for colors -** Processing line: ~ def default_color~ + def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10 +** Processing line: ~ bullet.exploded = true~ - Inside source: true *** True Line Result - def default_color -** Processing line: ~ [221, 212, 213] # Light Brown~ + bullet.exploded = true +** Processing line: ~ create_explosion! :bullet_explosion,~ - Inside source: true *** True Line Result - [221, 212, 213] # Light Brown -** Processing line: ~ end~ + create_explosion! :bullet_explosion, +** Processing line: ~ bullet,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + bullet, +** Processing line: ~ flame_override,~ - Inside source: true *** True Line Result - -** Processing line: ~ def wall_color~ + flame_override, +** Processing line: ~ max_speed,~ - Inside source: true *** True Line Result - def wall_color -** Processing line: ~ [134, 134, 120] # Camo Green~ + max_speed, +** Processing line: ~ lifetime,~ - Inside source: true *** True Line Result - [134, 134, 120] # Camo Green + lifetime, +** Processing line: ~ bullet.max_alpha~ +- Inside source: true +*** True Line Result + bullet.max_alpha ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85424,14 +92419,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def visited_color~ +** Processing line: ~ def calc_ship ship~ - Inside source: true *** True Line Result - def visited_color -** Processing line: ~ [204, 191, 179] # Dark Brown~ + def calc_ship ship +** Processing line: ~ ship.x += ship.dx~ - Inside source: true *** True Line Result - [204, 191, 179] # Dark Brown + ship.x += ship.dx +** Processing line: ~ ship.y += ship.dy~ +- Inside source: true +*** True Line Result + ship.y += ship.dy +** Processing line: ~ wrap_location! ship~ +- Inside source: true +*** True Line Result + wrap_location! ship ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85440,82 +92443,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def path_color~ -- Inside source: true -*** True Line Result - def path_color -** Processing line: ~ [231, 230, 228] # Pastel White~ +** Processing line: ~ def calc_ships~ - Inside source: true *** True Line Result - [231, 230, 228] # Pastel White -** Processing line: ~ end~ + def calc_ships +** Processing line: ~ all_ships.each { |s| calc_ship s }~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + all_ships.each { |s| calc_ship s } +** Processing line: ~ return if all_ships.any? { |s| s.dead }~ - Inside source: true *** True Line Result - -** Processing line: ~ def button_color~ + return if all_ships.any? { |s| s.dead } +** Processing line: ~ return if state.round_finished~ - Inside source: true *** True Line Result - def button_color -** Processing line: ~ [190, 190, 190] # Gray~ + return if state.round_finished +** Processing line: ~ return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)~ - Inside source: true *** True Line Result - [190, 190, 190] # Gray -** Processing line: ~ end~ + return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite) +** Processing line: ~ state.ship_blue.damage = 5~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + state.ship_blue.damage = 5 +** Processing line: ~ state.ship_red.damage = 5~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.ship_red.damage = 5 +** Processing line: ~ end~ - Inside source: true *** True Line Result - + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Method that is called by DragonRuby periodically~ -- Inside source: true -*** True Line Result - # Method that is called by DragonRuby periodically -** Processing line: ~ # Used for updating animations and calculations~ +** Processing line: ~ def create_thruster_flames! ship~ - Inside source: true *** True Line Result - # Used for updating animations and calculations -** Processing line: ~ def tick args~ + def create_thruster_flames! ship +** Processing line: ~ state.flames << state.new_entity(:ship_thruster,~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~~ + state.flames << state.new_entity(:ship_thruster, +** Processing line: ~ { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),~ - Inside source: true *** True Line Result - -** Processing line: ~ # Pressing r will reset the application~ + { angle: ship.angle + 180 + 60.randomize(:sign, :ratio), +** Processing line: ~ speed: 5.randomize(:ratio),~ - Inside source: true *** True Line Result - # Pressing r will reset the application -** Processing line: ~ if args.inputs.keyboard.key_down.r~ + speed: 5.randomize(:ratio), +** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_down.r -** Processing line: ~ args.gtk.reset~ + max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), +** Processing line: ~ lifetime: 30,~ - Inside source: true *** True Line Result - args.gtk.reset -** Processing line: ~ reset~ + lifetime: 30, +** Processing line: ~ x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),~ - Inside source: true *** True Line Result - reset -** Processing line: ~ return~ + x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio), +** Processing line: ~ y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })~ - Inside source: true *** True Line Result - return + y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) }) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85524,394 +92519,370 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -- Inside source: true -*** True Line Result - # Every tick, new args are passed, and the Breadth First Search tick is called -** Processing line: ~ $a_star_algorithm ||= A_Star_Algorithm.new(args)~ +** Processing line: ~ def input_accelerate_ship should_move_ship, ship~ - Inside source: true *** True Line Result - $a_star_algorithm ||= A_Star_Algorithm.new(args) -** Processing line: ~ $a_star_algorithm.args = args~ + def input_accelerate_ship should_move_ship, ship +** Processing line: ~ return if ship.dead~ - Inside source: true *** True Line Result - $a_star_algorithm.args = args -** Processing line: ~ $a_star_algorithm.tick~ + return if ship.dead +** Processing line: ~~ - Inside source: true *** True Line Result - $a_star_algorithm.tick -** Processing line: ~ end~ + +** Processing line: ~ should_move_ship &&= (ship.dx + ship.dy).abs < 5~ - Inside source: true *** True Line Result - end + should_move_ship &&= (ship.dx + ship.dy).abs < 5 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ if should_move_ship~ - Inside source: true *** True Line Result - -** Processing line: ~ def reset~ + if should_move_ship +** Processing line: ~ create_thruster_flames! ship~ - Inside source: true *** True Line Result - def reset -** Processing line: ~ $a_star_algorithm = nil~ + create_thruster_flames! ship +** Processing line: ~ ship.dx += ship.angle.vector_x 0.050~ - Inside source: true *** True Line Result - $a_star_algorithm = nil -** Processing line: ~ end~ + ship.dx += ship.angle.vector_x 0.050 +** Processing line: ~ ship.dy += ship.angle.vector_y 0.050~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + ship.dy += ship.angle.vector_y 0.050 +** Processing line: ~ else~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + else +** Processing line: ~ ship.dx *= 0.99~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + ship.dx *= 0.99 +** Processing line: ~ ship.dy *= 0.99~ +- Inside source: true *** True Line Result - -** Processing line: ~*** Path Finding Algorithms - Tower Defense - main.rb~ -- Header detected. + ship.dy *= 0.99 +** Processing line: ~ end~ +- Inside source: true *** True Line Result - + end +** Processing line: ~ end~ +- Inside source: true *** True Line Result -*** Path Finding Algorithms - Tower Defense - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ def input_accelerate~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/13_path_finding_algorithms/09_tower_defense/app/main.rb~ + def input_accelerate +** Processing line: ~ input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue~ - Inside source: true *** True Line Result - # ./samples/13_path_finding_algorithms/09_tower_defense/app/main.rb -** Processing line: ~ # An example of some major components in a tower defence game~ + input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue +** Processing line: ~ input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red~ - Inside source: true *** True Line Result - # An example of some major components in a tower defence game -** Processing line: ~ # The pathing of the tanks is determined by A* algorithm -- try editing the walls~ + input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The pathing of the tanks is determined by A* algorithm -- try editing the walls + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The turrets shoot bullets at the closest tank. The bullets are heat-seeking~ +** Processing line: ~ def input_turn_ship direction, ship~ - Inside source: true *** True Line Result - # The turrets shoot bullets at the closest tank. The bullets are heat-seeking -** Processing line: ~~ + def input_turn_ship direction, ship +** Processing line: ~ ship.angle -= 3 * direction~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + ship.angle -= 3 * direction +** Processing line: ~ end~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $gtk.reset if args.inputs.keyboard.key_down.r~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - $gtk.reset if args.inputs.keyboard.key_down.r -** Processing line: ~ defaults args~ + +** Processing line: ~ def input_turn~ - Inside source: true *** True Line Result - defaults args -** Processing line: ~ render args~ + def input_turn +** Processing line: ~ input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue~ - Inside source: true *** True Line Result - render args -** Processing line: ~ calc args~ + input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue +** Processing line: ~ input_turn_ship inputs.controller_two.left_right, state.ship_red~ - Inside source: true *** True Line Result - calc args -** Processing line: ~ end~ + input_turn_ship inputs.controller_two.left_right, state.ship_red +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults args~ +** Processing line: ~ def input_bullet create_bullet, ship~ - Inside source: true *** True Line Result - def defaults args -** Processing line: ~ args.outputs.background_color = wall_color~ + def input_bullet create_bullet, ship +** Processing line: ~ return unless create_bullet~ - Inside source: true *** True Line Result - args.outputs.background_color = wall_color -** Processing line: ~ args.state.grid_size = 5~ + return unless create_bullet +** Processing line: ~ return if ship.dead~ - Inside source: true *** True Line Result - args.state.grid_size = 5 -** Processing line: ~ args.state.tile_size = 50~ + return if ship.dead +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.tile_size = 50 -** Processing line: ~ args.state.grid_start ||= [0, 0]~ + +** Processing line: ~ state.bullets << state.new_entity(:ship_bullet,~ - Inside source: true *** True Line Result - args.state.grid_start ||= [0, 0] -** Processing line: ~ args.state.grid_goal ||= [4, 4]~ + state.bullets << state.new_entity(:ship_bullet, +** Processing line: ~ { owner: ship,~ - Inside source: true *** True Line Result - args.state.grid_goal ||= [4, 4] -** Processing line: ~~ + { owner: ship, +** Processing line: ~ angle: ship.angle,~ - Inside source: true *** True Line Result - -** Processing line: ~ # Try editing these walls to see the path change!~ + angle: ship.angle, +** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ - Inside source: true *** True Line Result - # Try editing these walls to see the path change! -** Processing line: ~ args.state.walls ||= {~ + max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), +** Processing line: ~ speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),~ - Inside source: true *** True Line Result - args.state.walls ||= { -** Processing line: ~ [0, 4] => true,~ + speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y), +** Processing line: ~ lifetime: 120,~ - Inside source: true *** True Line Result - [0, 4] => true, -** Processing line: ~ [1, 3] => true,~ + lifetime: 120, +** Processing line: ~ sprite_size: 10,~ - Inside source: true *** True Line Result - [1, 3] => true, -** Processing line: ~ [3, 1] => true,~ + sprite_size: 10, +** Processing line: ~ x: ship.x + ship.angle.vector_x * 32,~ - Inside source: true *** True Line Result - [3, 1] => true, -** Processing line: ~ # [4, 0] => true,~ + x: ship.x + ship.angle.vector_x * 32, +** Processing line: ~ y: ship.y + ship.angle.vector_y * 32 })~ - Inside source: true *** True Line Result - # [4, 0] => true, -** Processing line: ~ }~ + y: ship.y + ship.angle.vector_y * 32 }) +** Processing line: ~ end~ - Inside source: true *** True Line Result - } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.a_star.frontier ||= []~ +** Processing line: ~ def input_mine create_mine, ship~ - Inside source: true *** True Line Result - args.state.a_star.frontier ||= [] -** Processing line: ~ args.state.a_star.came_from ||= {}~ + def input_mine create_mine, ship +** Processing line: ~ return unless create_mine~ - Inside source: true *** True Line Result - args.state.a_star.came_from ||= {} -** Processing line: ~ args.state.a_star.path ||= []~ + return unless create_mine +** Processing line: ~ return if ship.dead~ - Inside source: true *** True Line Result - args.state.a_star.path ||= [] + return if ship.dead ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.tanks ||= []~ -- Inside source: true -*** True Line Result - args.state.tanks ||= [] -** Processing line: ~ args.state.tank_spawn_period ||= 60~ -- Inside source: true -*** True Line Result - args.state.tank_spawn_period ||= 60 -** Processing line: ~ args.state.tank_sprite_path ||= 'sprites/circle/white.png'~ +** Processing line: ~ state.bullets << state.new_entity(:ship_bullet,~ - Inside source: true *** True Line Result - args.state.tank_sprite_path ||= 'sprites/circle/white.png' -** Processing line: ~ args.state.tank_speed ||= 1~ + state.bullets << state.new_entity(:ship_bullet, +** Processing line: ~ { owner: ship,~ - Inside source: true *** True Line Result - args.state.tank_speed ||= 1 -** Processing line: ~~ + { owner: ship, +** Processing line: ~ angle: 360.randomize(:sign, :ratio),~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.turret_shoot_period = 10~ + angle: 360.randomize(:sign, :ratio), +** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ - Inside source: true *** True Line Result - args.state.turret_shoot_period = 10 -** Processing line: ~ # Turrets can be entered as [x, y] but are immediately mapped to hashes~ + max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), +** Processing line: ~ speed: 0.02,~ - Inside source: true *** True Line Result - # Turrets can be entered as [x, y] but are immediately mapped to hashes -** Processing line: ~ # Walls are also added where the turrets are to prevent tanks from pathing over them~ + speed: 0.02, +** Processing line: ~ sprite_size: 10,~ - Inside source: true *** True Line Result - # Walls are also added where the turrets are to prevent tanks from pathing over them -** Processing line: ~ args.state.turrets ||= [~ + sprite_size: 10, +** Processing line: ~ lifetime: 600,~ - Inside source: true *** True Line Result - args.state.turrets ||= [ -** Processing line: ~ [2, 2]~ + lifetime: 600, +** Processing line: ~ x: ship.x + ship.angle.vector_x * -50,~ - Inside source: true *** True Line Result - [2, 2] -** Processing line: ~ ].each { |turret| args.state.walls[turret] = true}.map do |x, y|~ + x: ship.x + ship.angle.vector_x * -50, +** Processing line: ~ y: ship.y + ship.angle.vector_y * -50 })~ - Inside source: true *** True Line Result - ].each { |turret| args.state.walls[turret] = true}.map do |x, y| -** Processing line: ~ {~ + y: ship.y + ship.angle.vector_y * -50 }) +** Processing line: ~ end~ - Inside source: true *** True Line Result - { -** Processing line: ~ x: x * args.state.tile_size,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x: x * args.state.tile_size, -** Processing line: ~ y: y * args.state.tile_size,~ + +** Processing line: ~ def input_bullets_and_mines~ - Inside source: true *** True Line Result - y: y * args.state.tile_size, -** Processing line: ~ w: args.state.tile_size,~ + def input_bullets_and_mines +** Processing line: ~ return if state.bullets.length > 100~ - Inside source: true *** True Line Result - w: args.state.tile_size, -** Processing line: ~ h: args.state.tile_size,~ + return if state.bullets.length > 100 +** Processing line: ~~ - Inside source: true *** True Line Result - h: args.state.tile_size, -** Processing line: ~ path: 'sprites/circle/gray.png',~ + +** Processing line: ~ [~ - Inside source: true *** True Line Result - path: 'sprites/circle/gray.png', -** Processing line: ~ range: 100~ + [ +** Processing line: ~ [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,~ - Inside source: true *** True Line Result - range: 100 -** Processing line: ~ }~ + [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space, +** Processing line: ~ inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + inputs.controller_one.key_down.b || inputs.keyboard.key_down.down, +** Processing line: ~ state.ship_blue],~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.ship_blue], +** Processing line: ~ [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.bullet_size ||= 25~ + [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red] +** Processing line: ~ ].each do |a_held, b_down, ship|~ - Inside source: true *** True Line Result - args.state.bullet_size ||= 25 -** Processing line: ~ args.state.bullets ||= []~ + ].each do |a_held, b_down, ship| +** Processing line: ~ input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)~ - Inside source: true *** True Line Result - args.state.bullets ||= [] -** Processing line: ~ args.state.bullet_path ||= 'sprites/circle/orange.png'~ + input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship) +** Processing line: ~ input_mine(b_down, ship)~ - Inside source: true *** True Line Result - args.state.bullet_path ||= 'sprites/circle/orange.png' -** Processing line: ~ #~ + input_mine(b_down, ship) +** Processing line: ~ end~ - Inside source: true *** True Line Result - # -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render args~ -- Inside source: true -*** True Line Result - def render args -** Processing line: ~ render_grid args~ +** Processing line: ~ def calc_kill_ships~ - Inside source: true *** True Line Result - render_grid args -** Processing line: ~ render_a_star args~ + def calc_kill_ships +** Processing line: ~ alive_ships.find_all { |s| s.damage >= 5 }.each do |s|~ - Inside source: true *** True Line Result - render_a_star args -** Processing line: ~ args.outputs.sprites << args.state.tanks~ + alive_ships.find_all { |s| s.damage >= 5 }.each do |s| +** Processing line: ~ s.dead = true~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.tanks -** Processing line: ~ args.outputs.sprites << args.state.turrets~ + s.dead = true +** Processing line: ~ create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.turrets -** Processing line: ~ args.outputs.sprites << args.state.bullets~ + create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.bullets -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_grid args~ +** Processing line: ~ def calc_score~ - Inside source: true *** True Line Result - def render_grid args -** Processing line: ~ # Draw a square the size and color of the grid~ + def calc_score +** Processing line: ~ return if state.round_finished~ - Inside source: true *** True Line Result - # Draw a square the size and color of the grid -** Processing line: ~ args.outputs.solids << [~ + return if state.round_finished +** Processing line: ~ return if alive_ships.length > 1~ - Inside source: true *** True Line Result - args.outputs.solids << [ -** Processing line: ~ 0,~ + return if alive_ships.length > 1 +** Processing line: ~~ - Inside source: true *** True Line Result - 0, -** Processing line: ~ 0,~ + +** Processing line: ~ if alive_ships.first == state.ship_red~ - Inside source: true *** True Line Result - 0, -** Processing line: ~ args.state.grid_size * args.state.tile_size,~ + if alive_ships.first == state.ship_red +** Processing line: ~ state.ship_red_score += 1~ - Inside source: true *** True Line Result - args.state.grid_size * args.state.tile_size, -** Processing line: ~ args.state.grid_size * args.state.tile_size,~ + state.ship_red_score += 1 +** Processing line: ~ elsif alive_ships.first == state.ship_blue~ - Inside source: true *** True Line Result - args.state.grid_size * args.state.tile_size, -** Processing line: ~ grid_color~ + elsif alive_ships.first == state.ship_blue +** Processing line: ~ state.ship_blue_score += 1~ - Inside source: true *** True Line Result - grid_color -** Processing line: ~ ]~ + state.ship_blue_score += 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - ] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Draw lines across the grid to show tiles~ -- Inside source: true -*** True Line Result - # Draw lines across the grid to show tiles -** Processing line: ~ (args.state.grid_size + 1).times do | value |~ -- Inside source: true -*** True Line Result - (args.state.grid_size + 1).times do | value | -** Processing line: ~ render_horizontal_line(args, value)~ -- Inside source: true -*** True Line Result - render_horizontal_line(args, value) -** Processing line: ~ render_vertical_line(args, value)~ +** Processing line: ~ state.round_finished = true~ - Inside source: true *** True Line Result - render_vertical_line(args, value) + state.round_finished = true ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -85920,134 +92891,138 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Render special tiles~ +** Processing line: ~ def calc_reset_ships~ - Inside source: true *** True Line Result - # Render special tiles -** Processing line: ~ render_tile(args, args.state.grid_start, start_color)~ + def calc_reset_ships +** Processing line: ~ return unless state.round_finished~ - Inside source: true *** True Line Result - render_tile(args, args.state.grid_start, start_color) -** Processing line: ~ render_tile(args, args.state.grid_goal, goal_color)~ + return unless state.round_finished +** Processing line: ~ state.round_finished_debounce ||= 2.seconds~ - Inside source: true *** True Line Result - render_tile(args, args.state.grid_goal, goal_color) -** Processing line: ~ args.state.walls.keys.each { |wall| render_tile(args, wall, wall_color) }~ + state.round_finished_debounce ||= 2.seconds +** Processing line: ~ state.round_finished_debounce -= 1~ - Inside source: true *** True Line Result - args.state.walls.keys.each { |wall| render_tile(args, wall, wall_color) } -** Processing line: ~ end~ + state.round_finished_debounce -= 1 +** Processing line: ~ return if state.round_finished_debounce > 0~ - Inside source: true *** True Line Result - end + return if state.round_finished_debounce > 0 +** Processing line: ~ start_new_round!~ +- Inside source: true +*** True Line Result + start_new_round! +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_vertical_line args, x~ +** Processing line: ~ def start_new_round!~ - Inside source: true *** True Line Result - def render_vertical_line args, x -** Processing line: ~ args.outputs.lines << [~ + def start_new_round! +** Processing line: ~ state.ship_blue = new_blue_ship~ - Inside source: true *** True Line Result - args.outputs.lines << [ -** Processing line: ~ x * args.state.tile_size,~ + state.ship_blue = new_blue_ship +** Processing line: ~ state.ship_red = new_red_ship~ - Inside source: true *** True Line Result - x * args.state.tile_size, -** Processing line: ~ 0,~ + state.ship_red = new_red_ship +** Processing line: ~ state.round_finished = false~ - Inside source: true *** True Line Result - 0, -** Processing line: ~ x * args.state.tile_size,~ + state.round_finished = false +** Processing line: ~ state.round_finished_debounce = nil~ - Inside source: true *** True Line Result - x * args.state.tile_size, -** Processing line: ~ args.state.tile_size * args.state.grid_size,~ + state.round_finished_debounce = nil +** Processing line: ~ state.flames.clear~ - Inside source: true *** True Line Result - args.state.tile_size * args.state.grid_size, -** Processing line: ~ ]~ + state.flames.clear +** Processing line: ~ state.bullets.clear~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + state.bullets.clear +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_horizontal_line args, y~ +** Processing line: ~ def calc_winner~ - Inside source: true *** True Line Result - def render_horizontal_line args, y -** Processing line: ~ args.outputs.lines << [~ + def calc_winner +** Processing line: ~ calc_kill_ships~ - Inside source: true *** True Line Result - args.outputs.lines << [ -** Processing line: ~ 0,~ + calc_kill_ships +** Processing line: ~ calc_score~ - Inside source: true *** True Line Result - 0, -** Processing line: ~ y * args.state.tile_size,~ + calc_score +** Processing line: ~ calc_reset_ships~ - Inside source: true *** True Line Result - y * args.state.tile_size, -** Processing line: ~ args.state.tile_size * args.state.grid_size,~ + calc_reset_ships +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.tile_size * args.state.grid_size, -** Processing line: ~ y * args.state.tile_size,~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - y * args.state.tile_size, -** Processing line: ~ ]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + +** Processing line: ~ $dueling_spaceship = DuelingSpaceships.new~ - Inside source: true *** True Line Result - end + $dueling_spaceship = DuelingSpaceships.new ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_tile args, tile, color~ -- Inside source: true -*** True Line Result - def render_tile args, tile, color -** Processing line: ~ args.outputs.solids << [~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - args.outputs.solids << [ -** Processing line: ~ tile.x * args.state.tile_size,~ + def tick args +** Processing line: ~ args.grid.origin_center!~ - Inside source: true *** True Line Result - tile.x * args.state.tile_size, -** Processing line: ~ tile.y * args.state.tile_size,~ + args.grid.origin_center! +** Processing line: ~ $dueling_spaceship.inputs = args.inputs~ - Inside source: true *** True Line Result - tile.y * args.state.tile_size, -** Processing line: ~ args.state.tile_size,~ + $dueling_spaceship.inputs = args.inputs +** Processing line: ~ $dueling_spaceship.outputs = args.outputs~ - Inside source: true *** True Line Result - args.state.tile_size, -** Processing line: ~ args.state.tile_size,~ + $dueling_spaceship.outputs = args.outputs +** Processing line: ~ $dueling_spaceship.state = args.state~ - Inside source: true *** True Line Result - args.state.tile_size, -** Processing line: ~ color~ + $dueling_spaceship.state = args.state +** Processing line: ~ $dueling_spaceship.grid = args.grid~ - Inside source: true *** True Line Result - color -** Processing line: ~ ]~ + $dueling_spaceship.grid = args.grid +** Processing line: ~ $dueling_spaceship.tick~ - Inside source: true *** True Line Result - ] + $dueling_spaceship.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -86056,102 +93031,102 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc args~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - def calc args -** Processing line: ~ calc_a_star args~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - calc_a_star args -** Processing line: ~ calc_tanks args~ -- Inside source: true + +** Processing line: ~*** arcade/flappy dragon/credits.txt~ +- Header detected. *** True Line Result - calc_tanks args -** Processing line: ~ calc_turrets args~ -- Inside source: true + *** True Line Result - calc_turrets args -** Processing line: ~ calc_bullets args~ -- Inside source: true +*** arcade/flappy dragon/credits.txt +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - calc_bullets args -** Processing line: ~ end~ -- Inside source: true + *** True Line Result - end -** Processing line: ~~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_a_star args~ + # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt +** Processing line: ~ code: Amir Rajan, https://twitter.com/amirrajan~ - Inside source: true *** True Line Result - def calc_a_star args -** Processing line: ~ # Only does this one time~ + code: Amir Rajan, https://twitter.com/amirrajan +** Processing line: ~ graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel~ - Inside source: true *** True Line Result - # Only does this one time -** Processing line: ~ return unless args.state.a_star.path.empty?~ + graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel +** Processing line: ~~ - Inside source: true *** True Line Result - return unless args.state.a_star.path.empty? + ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Start the search from the grid start~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - # Start the search from the grid start -** Processing line: ~ args.state.a_star.frontier << args.state.grid_start~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - args.state.a_star.frontier << args.state.grid_start -** Processing line: ~ args.state.a_star.came_from[args.state.grid_start] = nil~ -- Inside source: true + +** Processing line: ~*** arcade/flappy dragon/main.rb~ +- Header detected. *** True Line Result - args.state.a_star.came_from[args.state.grid_start] = nil -** Processing line: ~~ -- Inside source: true + +*** True Line Result +*** arcade/flappy dragon/main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result -** Processing line: ~ # Until a path to the goal has been found or there are no more tiles to explore~ +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/flappy_dragon/app/main.rb~ - Inside source: true *** True Line Result - # Until a path to the goal has been found or there are no more tiles to explore -** Processing line: ~ until (args.state.a_star.came_from.has_key?(args.state.grid_goal)|| args.state.a_star.frontier.empty?)~ + # ./samples/99_genre_arcade/flappy_dragon/app/main.rb +** Processing line: ~ class FlappyDragon~ - Inside source: true *** True Line Result - until (args.state.a_star.came_from.has_key?(args.state.grid_goal)|| args.state.a_star.frontier.empty?) -** Processing line: ~ # For the first tile in the frontier~ + class FlappyDragon +** Processing line: ~ attr_accessor :grid, :inputs, :state, :outputs~ - Inside source: true *** True Line Result - # For the first tile in the frontier -** Processing line: ~ tile_to_expand_from = args.state.a_star.frontier.shift~ + attr_accessor :grid, :inputs, :state, :outputs +** Processing line: ~~ - Inside source: true *** True Line Result - tile_to_expand_from = args.state.a_star.frontier.shift -** Processing line: ~ # Add each of its neighbors to the frontier~ + +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - # Add each of its neighbors to the frontier -** Processing line: ~ neighbors(args, tile_to_expand_from).each do | tile |~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - neighbors(args, tile_to_expand_from).each do | tile | -** Processing line: ~ args.state.a_star.frontier << tile~ + defaults +** Processing line: ~ render~ - Inside source: true *** True Line Result - args.state.a_star.frontier << tile -** Processing line: ~ args.state.a_star.came_from[tile] = tile_to_expand_from~ + render +** Processing line: ~ calc~ - Inside source: true *** True Line Result - args.state.a_star.came_from[tile] = tile_to_expand_from -** Processing line: ~ end~ + calc +** Processing line: ~ process_inputs~ - Inside source: true *** True Line Result - end + process_inputs ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -86160,1058 +93135,994 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Stop calculating a path if the goal was never reached~ -- Inside source: true -*** True Line Result - # Stop calculating a path if the goal was never reached -** Processing line: ~ return unless args.state.a_star.came_from.has_key? args.state.grid_goal~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - return unless args.state.a_star.came_from.has_key? args.state.grid_goal -** Processing line: ~~ + def defaults +** Processing line: ~ state.flap_power = 11~ - Inside source: true *** True Line Result - -** Processing line: ~ # Fill path by tracing back from the goal~ + state.flap_power = 11 +** Processing line: ~ state.gravity = 0.9~ - Inside source: true *** True Line Result - # Fill path by tracing back from the goal -** Processing line: ~ current_cell = args.state.grid_goal~ + state.gravity = 0.9 +** Processing line: ~ state.ceiling = 600~ - Inside source: true *** True Line Result - current_cell = args.state.grid_goal -** Processing line: ~ while current_cell~ + state.ceiling = 600 +** Processing line: ~ state.ceiling_flap_power = 6~ - Inside source: true *** True Line Result - while current_cell -** Processing line: ~ args.state.a_star.path.unshift current_cell~ + state.ceiling_flap_power = 6 +** Processing line: ~ state.wall_countdown_length = 100~ - Inside source: true *** True Line Result - args.state.a_star.path.unshift current_cell -** Processing line: ~ current_cell = args.state.a_star.came_from[current_cell]~ + state.wall_countdown_length = 100 +** Processing line: ~ state.wall_gap_size = 100~ - Inside source: true *** True Line Result - current_cell = args.state.a_star.came_from[current_cell] -** Processing line: ~ end~ + state.wall_gap_size = 100 +** Processing line: ~ state.wall_countdown ||= 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.wall_countdown ||= 0 +** Processing line: ~ state.hi_score ||= 0~ - Inside source: true *** True Line Result - -** Processing line: ~ puts "The path has been calculated"~ + state.hi_score ||= 0 +** Processing line: ~ state.score ||= 0~ - Inside source: true *** True Line Result - puts "The path has been calculated" -** Processing line: ~ puts args.state.a_star.path~ + state.score ||= 0 +** Processing line: ~ state.walls ||= []~ - Inside source: true *** True Line Result - puts args.state.a_star.path -** Processing line: ~ end~ + state.walls ||= [] +** Processing line: ~ state.x ||= 50~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.x ||= 50 +** Processing line: ~ state.y ||= 500~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_tanks args~ + state.y ||= 500 +** Processing line: ~ state.dy ||= 0~ - Inside source: true *** True Line Result - def calc_tanks args -** Processing line: ~ spawn_tank args~ + state.dy ||= 0 +** Processing line: ~ state.scene ||= :menu~ - Inside source: true *** True Line Result - spawn_tank args -** Processing line: ~ move_tanks args~ + state.scene ||= :menu +** Processing line: ~ state.scene_at ||= 0~ - Inside source: true *** True Line Result - move_tanks args -** Processing line: ~ end~ + state.scene_at ||= 0 +** Processing line: ~ state.difficulty ||= :normal~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.difficulty ||= :normal +** Processing line: ~ state.new_difficulty ||= :normal~ - Inside source: true *** True Line Result - -** Processing line: ~ def move_tanks args~ + state.new_difficulty ||= :normal +** Processing line: ~ state.countdown ||= 4.seconds~ - Inside source: true *** True Line Result - def move_tanks args -** Processing line: ~ # Remove tanks that have reached the end of their path~ + state.countdown ||= 4.seconds +** Processing line: ~ state.flash_at ||= 0~ - Inside source: true *** True Line Result - # Remove tanks that have reached the end of their path -** Processing line: ~ args.state.tanks.reject! { |tank| tank[:a_star].empty? }~ + state.flash_at ||= 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.tanks.reject! { |tank| tank[:a_star].empty? } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Tanks have an array that has each tile it has to go to in order from a* path~ -- Inside source: true -*** True Line Result - # Tanks have an array that has each tile it has to go to in order from a* path -** Processing line: ~ args.state.tanks.each do | tank |~ +** Processing line: ~ def render~ - Inside source: true *** True Line Result - args.state.tanks.each do | tank | -** Processing line: ~ destination = tank[:a_star][0]~ + def render +** Processing line: ~ outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1~ - Inside source: true *** True Line Result - destination = tank[:a_star][0] -** Processing line: ~ # Move the tank towards the destination~ + outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1 +** Processing line: ~ render_score~ - Inside source: true *** True Line Result - # Move the tank towards the destination -** Processing line: ~ tank[:x] += copy_sign(args.state.tank_speed, ((destination.x * args.state.tile_size) - tank[:x]))~ + render_score +** Processing line: ~ render_menu~ - Inside source: true *** True Line Result - tank[:x] += copy_sign(args.state.tank_speed, ((destination.x * args.state.tile_size) - tank[:x])) -** Processing line: ~ tank[:y] += copy_sign(args.state.tank_speed, ((destination.y * args.state.tile_size) - tank[:y]))~ + render_menu +** Processing line: ~ render_game~ - Inside source: true *** True Line Result - tank[:y] += copy_sign(args.state.tank_speed, ((destination.y * args.state.tile_size) - tank[:y])) -** Processing line: ~ # If the tank has reached its destination~ + render_game +** Processing line: ~ end~ - Inside source: true *** True Line Result - # If the tank has reached its destination -** Processing line: ~ if (destination.x * args.state.tile_size) == tank[:x] and~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if (destination.x * args.state.tile_size) == tank[:x] and -** Processing line: ~ (destination.y * args.state.tile_size) == tank[:y]~ + +** Processing line: ~ def render_score~ - Inside source: true *** True Line Result - (destination.y * args.state.tile_size) == tank[:y] -** Processing line: ~ # Set the destination to the next point in the path~ + def render_score +** Processing line: ~ outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label~ - Inside source: true *** True Line Result - # Set the destination to the next point in the path -** Processing line: ~ tank[:a_star].shift~ + outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label +** Processing line: ~ outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label~ - Inside source: true *** True Line Result - tank[:a_star].shift -** Processing line: ~ end~ + outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label +** Processing line: ~ outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label~ - Inside source: true *** True Line Result - end + outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_turrets args~ -- Inside source: true -*** True Line Result - def calc_turrets args -** Processing line: ~ return unless args.state.tick_count.mod_zero? args.state.turret_shoot_period~ +** Processing line: ~ def render_menu~ - Inside source: true *** True Line Result - return unless args.state.tick_count.mod_zero? args.state.turret_shoot_period -** Processing line: ~ args.state.turrets.each do | turret |~ + def render_menu +** Processing line: ~ return unless state.scene == :menu~ - Inside source: true *** True Line Result - args.state.turrets.each do | turret | -** Processing line: ~ # Finds the closest tank~ + return unless state.scene == :menu +** Processing line: ~ render_overlay~ - Inside source: true *** True Line Result - # Finds the closest tank -** Processing line: ~ target = nil~ + render_overlay +** Processing line: ~~ - Inside source: true *** True Line Result - target = nil -** Processing line: ~ shortest_distance = turret[:range] + 1~ + +** Processing line: ~ outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - shortest_distance = turret[:range] + 1 -** Processing line: ~ args.state.tanks.each do | tank |~ + outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255] +** Processing line: ~ outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - args.state.tanks.each do | tank | -** Processing line: ~ distance = distance_between(turret[:x], turret[:y], tank[:x], tank[:y])~ + outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255] +** Processing line: ~ outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255]~ - Inside source: true *** True Line Result - distance = distance_between(turret[:x], turret[:y], tank[:x], tank[:y]) -** Processing line: ~ if distance < shortest_distance~ + outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255] +** Processing line: ~ outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255]~ - Inside source: true *** True Line Result - if distance < shortest_distance -** Processing line: ~ target = tank~ + outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255] +** Processing line: ~ outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]~ - Inside source: true *** True Line Result - target = tank -** Processing line: ~ shortest_distance = distance~ + outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255] +** Processing line: ~ outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - shortest_distance = distance -** Processing line: ~ end~ + outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255] +** Processing line: ~ outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255] +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ # If there is a tank in range, fires a bullet~ + +** Processing line: ~ outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255]~ - Inside source: true *** True Line Result - # If there is a tank in range, fires a bullet -** Processing line: ~ if target~ + outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255] +** Processing line: ~ outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255]~ - Inside source: true *** True Line Result - if target -** Processing line: ~ args.state.bullets << {~ + outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255] +** Processing line: ~ outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255]~ - Inside source: true *** True Line Result - args.state.bullets << { -** Processing line: ~ x: turret[:x],~ + outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255] +** Processing line: ~ outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255]~ - Inside source: true *** True Line Result - x: turret[:x], -** Processing line: ~ y: turret[:y],~ + outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - y: turret[:y], -** Processing line: ~ w: args.state.bullet_size,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - w: args.state.bullet_size, -** Processing line: ~ h: args.state.bullet_size,~ + +** Processing line: ~ def render_overlay~ - Inside source: true *** True Line Result - h: args.state.bullet_size, -** Processing line: ~ path: args.state.bullet_path,~ + def render_overlay +** Processing line: ~ outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid~ - Inside source: true *** True Line Result - path: args.state.bullet_path, -** Processing line: ~ # Note that this makes it heat-seeking, because target is passed by reference~ + outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Note that this makes it heat-seeking, because target is passed by reference -** Processing line: ~ # Could do target.clone to make the bullet go to where the tank initially was~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Could do target.clone to make the bullet go to where the tank initially was -** Processing line: ~ target: target~ + +** Processing line: ~ def render_game~ - Inside source: true *** True Line Result - target: target -** Processing line: ~ }~ + def render_game +** Processing line: ~ render_game_over~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + render_game_over +** Processing line: ~ render_background~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + render_background +** Processing line: ~ render_walls~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + render_walls +** Processing line: ~ render_dragon~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render_dragon +** Processing line: ~ render_flash~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_bullets args~ + render_flash +** Processing line: ~ end~ - Inside source: true *** True Line Result - def calc_bullets args -** Processing line: ~ # Bullets aim for the center of their targets~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Bullets aim for the center of their targets -** Processing line: ~ args.state.bullets.each { |bullet| move bullet, center_of(bullet[:target])}~ + +** Processing line: ~ def render_game_over~ - Inside source: true *** True Line Result - args.state.bullets.each { |bullet| move bullet, center_of(bullet[:target])} -** Processing line: ~ args.state.bullets.reject! { |b| b.intersect_rect? b[:target] }~ + def render_game_over +** Processing line: ~ return unless state.scene == :game~ - Inside source: true *** True Line Result - args.state.bullets.reject! { |b| b.intersect_rect? b[:target] } -** Processing line: ~ end~ + return unless state.scene == :game +** Processing line: ~ outputs.labels << [638, 358, score_text, 20, 1]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + outputs.labels << [638, 358, score_text, 20, 1] +** Processing line: ~ outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - -** Processing line: ~ def center_of object~ + outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255] +** Processing line: ~ outputs.labels << [638, 428, countdown_text, 20, 1]~ - Inside source: true *** True Line Result - def center_of object -** Processing line: ~ object = object.clone~ + outputs.labels << [638, 428, countdown_text, 20, 1] +** Processing line: ~ outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]~ - Inside source: true *** True Line Result - object = object.clone -** Processing line: ~ object[:x] += 0.5~ + outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - object[:x] += 0.5 -** Processing line: ~ object[:y] += 0.5~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - object[:y] += 0.5 -** Processing line: ~ object~ + +** Processing line: ~ def render_background~ - Inside source: true *** True Line Result - object -** Processing line: ~ end~ + def render_background +** Processing line: ~ outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~ - Inside source: true *** True Line Result - end + outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png'] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_a_star args~ +** Processing line: ~ scroll_point_at = state.tick_count~ - Inside source: true *** True Line Result - def render_a_star args -** Processing line: ~ args.state.a_star.path.map do |tile|~ + scroll_point_at = state.tick_count +** Processing line: ~ scroll_point_at = state.scene_at if state.scene == :menu~ - Inside source: true *** True Line Result - args.state.a_star.path.map do |tile| -** Processing line: ~ # Map each x, y coordinate to the center of the tile and scale up~ + scroll_point_at = state.scene_at if state.scene == :menu +** Processing line: ~ scroll_point_at = state.death_at if state.countdown > 0~ - Inside source: true *** True Line Result - # Map each x, y coordinate to the center of the tile and scale up -** Processing line: ~ [(tile.x + 0.5) * args.state.tile_size, (tile.y + 0.5) * args.state.tile_size]~ + scroll_point_at = state.death_at if state.countdown > 0 +** Processing line: ~ scroll_point_at ||= 0~ - Inside source: true *** True Line Result - [(tile.x + 0.5) * args.state.tile_size, (tile.y + 0.5) * args.state.tile_size] -** Processing line: ~ end.inject do | point_a, point_b |~ + scroll_point_at ||= 0 +** Processing line: ~~ - Inside source: true *** True Line Result - end.inject do | point_a, point_b | -** Processing line: ~ # Render the line between each point~ + +** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png', 0.25)~ - Inside source: true *** True Line Result - # Render the line between each point -** Processing line: ~ args.outputs.lines << [point_a.x, point_a.y, point_b.x, point_b.y, a_star_color]~ + outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png', 0.25) +** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)~ - Inside source: true *** True Line Result - args.outputs.lines << [point_a.x, point_a.y, point_b.x, point_b.y, a_star_color] -** Processing line: ~ point_b~ + outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50) +** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80)~ - Inside source: true *** True Line Result - point_b + outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80) ** 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: ~ # Moves object to target at speed~ +** Processing line: ~ def render_walls~ - Inside source: true *** True Line Result - # Moves object to target at speed -** Processing line: ~ def move object, target, speed = 1~ + def render_walls +** Processing line: ~ state.walls.each do |w|~ - Inside source: true *** True Line Result - def move object, target, speed = 1 -** Processing line: ~ if target.is_a? Hash~ + state.walls.each do |w| +** Processing line: ~ w.sprites = [~ - Inside source: true *** True Line Result - if target.is_a? Hash -** Processing line: ~ object[:x] += copy_sign(speed, target[:x] - object[:x])~ + w.sprites = [ +** Processing line: ~ [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],~ - Inside source: true *** True Line Result - object[:x] += copy_sign(speed, target[:x] - object[:x]) -** Processing line: ~ object[:y] += copy_sign(speed, target[:y] - object[:y])~ + [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180], +** Processing line: ~ [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0]~ - Inside source: true *** True Line Result - object[:y] += copy_sign(speed, target[:y] - object[:y]) -** Processing line: ~ else~ + [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0] +** Processing line: ~ ]~ - Inside source: true *** True Line Result - else -** Processing line: ~ object[:x] += copy_sign(speed, target.x - object[:x])~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - object[:x] += copy_sign(speed, target.x - object[:x]) -** Processing line: ~ object[:y] += copy_sign(speed, target.y - object[:y])~ + end +** Processing line: ~ outputs.sprites << state.walls.map(&:sprites)~ - Inside source: true *** True Line Result - object[:y] += copy_sign(speed, target.y - object[:y]) + outputs.sprites << state.walls.map(&:sprites) ** 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: ~ def distance_between a_x, a_y, b_x, b_y~ +** Processing line: ~~ - Inside source: true *** True Line Result - def distance_between a_x, a_y, b_x, b_y -** Processing line: ~ (((b_x - a_x) ** 2) + ((b_y - a_y) ** 2)) ** 0.5~ + +** Processing line: ~ def render_dragon~ - Inside source: true *** True Line Result - (((b_x - a_x) ** 2) + ((b_y - a_y) ** 2)) ** 0.5 -** Processing line: ~ end~ + def render_dragon +** Processing line: ~ state.show_death = true if state.countdown == 3.seconds~ - Inside source: true *** True Line Result - end + state.show_death = true if state.countdown == 3.seconds ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def copy_sign value, sign~ +** Processing line: ~ render_debug_hitbox false~ - Inside source: true *** True Line Result - def copy_sign value, sign -** Processing line: ~ return 0 if sign == 0~ + render_debug_hitbox false +** Processing line: ~~ - Inside source: true *** True Line Result - return 0 if sign == 0 -** Processing line: ~ return value if sign > 0~ + +** Processing line: ~ if state.show_death == false || !state.death_at~ - Inside source: true *** True Line Result - return value if sign > 0 -** Processing line: ~ -value~ + if state.show_death == false || !state.death_at +** Processing line: ~ animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at~ - Inside source: true *** True Line Result - -value -** Processing line: ~ end~ + animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at +** Processing line: ~ sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"~ - Inside source: true *** True Line Result - end -** Processing line: ~ #~ + sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png" +** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ - Inside source: true *** True Line Result - # -** Processing line: ~ def spawn_tank args~ + state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] +** Processing line: ~ else~ - Inside source: true *** True Line Result - def spawn_tank args -** Processing line: ~ return unless args.state.tick_count.mod_zero? args.state.tank_spawn_period~ + else +** Processing line: ~ sprite_name = "sprites/dragon_die.png"~ - Inside source: true *** True Line Result - return unless args.state.tick_count.mod_zero? args.state.tank_spawn_period -** Processing line: ~ args.state.tanks << {~ + sprite_name = "sprites/dragon_die.png" +** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ - Inside source: true *** True Line Result - args.state.tanks << { -** Processing line: ~ x: args.state.grid_start.x,~ + state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] +** Processing line: ~ sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds~ - Inside source: true *** True Line Result - x: args.state.grid_start.x, -** Processing line: ~ y: args.state.grid_start.y,~ + sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds +** Processing line: ~ state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1~ - Inside source: true *** True Line Result - y: args.state.grid_start.y, -** Processing line: ~ w: args.state.tile_size,~ + state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1 +** Processing line: ~ state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction~ - Inside source: true *** True Line Result - w: args.state.tile_size, -** Processing line: ~ h: args.state.tile_size,~ + state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction +** Processing line: ~ state.dragon_sprite.y += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)~ - Inside source: true *** True Line Result - h: args.state.tile_size, -** Processing line: ~ path: args.state.tank_sprite_path,~ + state.dragon_sprite.y += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6) +** Processing line: ~ end~ - Inside source: true *** True Line Result - path: args.state.tank_sprite_path, -** Processing line: ~ a_star: args.state.a_star.path.clone~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - a_star: args.state.a_star.path.clone -** Processing line: ~ }~ + +** Processing line: ~ outputs.sprites << state.dragon_sprite~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + outputs.sprites << state.dragon_sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def neighbors args, tile~ +** Processing line: ~ def render_debug_hitbox show~ - Inside source: true *** True Line Result - def neighbors args, tile -** Processing line: ~ [[tile.x, tile.y - 1],~ + def render_debug_hitbox show +** Processing line: ~ return unless show~ - Inside source: true *** True Line Result - [[tile.x, tile.y - 1], -** Processing line: ~ [tile.x, tile.y + 1],~ + return unless show +** Processing line: ~ outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite~ - Inside source: true *** True Line Result - [tile.x, tile.y + 1], -** Processing line: ~ [tile.x + 1, tile.y],~ + outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite +** Processing line: ~ outputs.borders << state.walls.flat_map do |w|~ - Inside source: true *** True Line Result - [tile.x + 1, tile.y], -** Processing line: ~ [tile.x - 1, tile.y]].reject do | neighbor |~ + outputs.borders << state.walls.flat_map do |w| +** Processing line: ~ w.sprites.map { |s| [s.rect, 255, 0, 0] }~ - Inside source: true *** True Line Result - [tile.x - 1, tile.y]].reject do | neighbor | -** Processing line: ~ args.state.a_star.came_from.has_key?(neighbor) or~ + w.sprites.map { |s| [s.rect, 255, 0, 0] } +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.a_star.came_from.has_key?(neighbor) or -** Processing line: ~ tile_out_of_bounds?(args, neighbor) or~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - tile_out_of_bounds?(args, neighbor) or -** Processing line: ~ args.state.walls.has_key? neighbor~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.walls.has_key? neighbor -** Processing line: ~ end~ + +** Processing line: ~ def render_flash~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def render_flash +** Processing line: ~ return unless state.flash_at~ - Inside source: true *** True Line Result - end + return unless state.flash_at ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tile_out_of_bounds? args, tile~ +** Processing line: ~ outputs.primitives << [grid.rect,~ - Inside source: true *** True Line Result - def tile_out_of_bounds? args, tile -** Processing line: ~ tile.x < 0 or tile.y < 0 or tile.x >= args.state.grid_size or tile.y >= args.state.grid_size~ + outputs.primitives << [grid.rect, +** Processing line: ~ white,~ - Inside source: true *** True Line Result - tile.x < 0 or tile.y < 0 or tile.x >= args.state.grid_size or tile.y >= args.state.grid_size -** Processing line: ~ end~ + white, +** Processing line: ~ 255 * state.flash_at.ease(20, :flip)].solid~ - Inside source: true *** True Line Result - end + 255 * state.flash_at.ease(20, :flip)].solid ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def grid_color~ -- Inside source: true -*** True Line Result - def grid_color -** Processing line: ~ [133, 226, 144]~ +** Processing line: ~ state.flash_at = 0 if state.flash_at.elapsed_time > 20~ - Inside source: true *** True Line Result - [133, 226, 144] -** Processing line: ~ end~ + state.flash_at = 0 if state.flash_at.elapsed_time > 20 +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def start_color~ +** Processing line: ~ def calc~ - Inside source: true *** True Line Result - def start_color -** Processing line: ~ [226, 144, 133]~ + def calc +** Processing line: ~ return unless state.scene == :game~ - Inside source: true *** True Line Result - [226, 144, 133] -** Processing line: ~ end~ + return unless state.scene == :game +** Processing line: ~ reset_game if state.countdown == 1~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + reset_game if state.countdown == 1 +** Processing line: ~ state.countdown -= 1 and return if state.countdown > 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def goal_color~ + state.countdown -= 1 and return if state.countdown > 0 +** Processing line: ~ calc_walls~ - Inside source: true *** True Line Result - def goal_color -** Processing line: ~ [226, 133, 144]~ + calc_walls +** Processing line: ~ calc_flap~ - Inside source: true *** True Line Result - [226, 133, 144] -** Processing line: ~ end~ + calc_flap +** Processing line: ~ calc_game_over~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + calc_game_over +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def wall_color~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def wall_color -** Processing line: ~ [133, 144, 226]~ + +** Processing line: ~ def calc_walls~ - Inside source: true *** True Line Result - [133, 144, 226] -** Processing line: ~ end~ + def calc_walls +** Processing line: ~ state.walls.each { |w| w.x -= 8 }~ - Inside source: true *** True Line Result - end + state.walls.each { |w| w.x -= 8 } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def a_star_color~ +** Processing line: ~ walls_count_before_removal = state.walls.length~ - Inside source: true *** True Line Result - def a_star_color -** Processing line: ~ [0, 0, 255]~ + walls_count_before_removal = state.walls.length +** Processing line: ~~ - Inside source: true *** True Line Result - [0, 0, 255] -** Processing line: ~ end~ + +** Processing line: ~ state.walls.reject! { |w| w.x < -100 }~ - Inside source: true *** True Line Result - end + state.walls.reject! { |w| w.x < -100 } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ state.score += 1 if state.walls.count < walls_count_before_removal~ +- Inside source: true *** True Line Result -#+end_src + state.score += 1 if state.walls.count < walls_count_before_removal ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** 3d - 3d Cube - main.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ state.wall_countdown -= 1 and return if state.wall_countdown > 0~ +- Inside source: true *** True Line Result -*** 3d - 3d Cube - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + state.wall_countdown -= 1 and return if state.wall_countdown > 0 +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ state.walls << state.new_entity(:wall) do |w|~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_3d/01_3d_cube/app/main.rb~ + state.walls << state.new_entity(:wall) do |w| +** Processing line: ~ w.x = grid.right~ - Inside source: true *** True Line Result - # ./samples/99_genre_3d/01_3d_cube/app/main.rb -** Processing line: ~ STARTX = 0.0~ + w.x = grid.right +** Processing line: ~ w.opening = grid.top~ - Inside source: true *** True Line Result - STARTX = 0.0 -** Processing line: ~ STARTY = 0.0~ + w.opening = grid.top +** Processing line: ~ .randomize(:ratio)~ - Inside source: true *** True Line Result - STARTY = 0.0 -** Processing line: ~ ENDY = 20.0~ + .randomize(:ratio) +** Processing line: ~ .greater(200)~ - Inside source: true *** True Line Result - ENDY = 20.0 -** Processing line: ~ ENDX = 20.0~ + .greater(200) +** Processing line: ~ .lesser(520)~ - Inside source: true *** True Line Result - ENDX = 20.0 -** Processing line: ~ SPINPOINT = 10~ + .lesser(520) +** Processing line: ~ w.bottom_height = w.opening - state.wall_gap_size~ - Inside source: true *** True Line Result - SPINPOINT = 10 -** Processing line: ~ SPINDURATION = 400~ + w.bottom_height = w.opening - state.wall_gap_size +** Processing line: ~ w.top_y = w.opening + state.wall_gap_size~ - Inside source: true *** True Line Result - SPINDURATION = 400 -** Processing line: ~ POINTSIZE = 8~ + w.top_y = w.opening + state.wall_gap_size +** Processing line: ~ end~ - Inside source: true *** True Line Result - POINTSIZE = 8 -** Processing line: ~ BOXDEPTH = 40~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - BOXDEPTH = 40 -** Processing line: ~ YAW = 1~ + +** Processing line: ~ state.wall_countdown = state.wall_countdown_length~ - Inside source: true *** True Line Result - YAW = 1 -** Processing line: ~ DISTANCE = 10~ + state.wall_countdown = state.wall_countdown_length +** Processing line: ~ end~ - Inside source: true *** True Line Result - DISTANCE = 10 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ -- Inside source: true -*** True Line Result - def tick args -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ +** Processing line: ~ def calc_flap~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ a = Math.sin(args.state.tick_count / SPINDURATION) * Math.tan(args.state.tick_count / SPINDURATION)~ + def calc_flap +** Processing line: ~ state.y += state.dy~ - Inside source: true *** True Line Result - a = Math.sin(args.state.tick_count / SPINDURATION) * Math.tan(args.state.tick_count / SPINDURATION) -** Processing line: ~ s = Math.sin(a)~ + state.y += state.dy +** Processing line: ~ state.dy = state.dy.lesser state.flap_power~ - Inside source: true *** True Line Result - s = Math.sin(a) -** Processing line: ~ c = Math.cos(a)~ + state.dy = state.dy.lesser state.flap_power +** Processing line: ~ state.dy -= state.gravity~ - Inside source: true *** True Line Result - c = Math.cos(a) -** Processing line: ~ x = STARTX~ + state.dy -= state.gravity +** Processing line: ~ return if state.y < state.ceiling~ - Inside source: true *** True Line Result - x = STARTX -** Processing line: ~ y = STARTY~ + return if state.y < state.ceiling +** Processing line: ~ state.y = state.ceiling~ - Inside source: true *** True Line Result - y = STARTY -** Processing line: ~ offset_x = (1280 - (ENDX - STARTX)) / 2~ + state.y = state.ceiling +** Processing line: ~ state.dy = state.dy.lesser state.ceiling_flap_power~ - Inside source: true *** True Line Result - offset_x = (1280 - (ENDX - STARTX)) / 2 -** Processing line: ~ offset_y = (360 - (ENDY - STARTY)) / 2~ + state.dy = state.dy.lesser state.ceiling_flap_power +** Processing line: ~ end~ - Inside source: true *** True Line Result - offset_y = (360 - (ENDY - STARTY)) / 2 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ srand(1)~ -- Inside source: true -*** True Line Result - srand(1) -** Processing line: ~ while y < ENDY do~ +** Processing line: ~ def calc_game_over~ - Inside source: true *** True Line Result - while y < ENDY do -** Processing line: ~ while x < ENDX do~ + def calc_game_over +** Processing line: ~ return unless game_over?~ - Inside source: true *** True Line Result - while x < ENDX do -** Processing line: ~ if (y == STARTY ||~ + return unless game_over? +** Processing line: ~~ - Inside source: true *** True Line Result - if (y == STARTY || -** Processing line: ~ y == (ENDY / 0.5) * 2 ||~ + +** Processing line: ~ state.death_at = state.tick_count~ - Inside source: true *** True Line Result - y == (ENDY / 0.5) * 2 || -** Processing line: ~ y == (ENDY / 0.5) * 2 + 0.5 ||~ + state.death_at = state.tick_count +** Processing line: ~ state.death_from = state.walls.first~ - Inside source: true *** True Line Result - y == (ENDY / 0.5) * 2 + 0.5 || -** Processing line: ~ y == ENDY - 0.5 ||~ + state.death_from = state.walls.first +** Processing line: ~ state.death_fall_direction = -1~ - Inside source: true *** True Line Result - y == ENDY - 0.5 || -** Processing line: ~ x == STARTX ||~ + state.death_fall_direction = -1 +** Processing line: ~ state.death_fall_direction = 1 if state.x > state.death_from.x~ - Inside source: true *** True Line Result - x == STARTX || -** Processing line: ~ x == ENDX - 0.5)~ + state.death_fall_direction = 1 if state.x > state.death_from.x +** Processing line: ~ outputs.sounds << "sounds/hit-sound.wav"~ - Inside source: true *** True Line Result - x == ENDX - 0.5) -** Processing line: ~ z = rand(BOXDEPTH)~ + outputs.sounds << "sounds/hit-sound.wav" +** Processing line: ~ begin_countdown~ - Inside source: true *** True Line Result - z = rand(BOXDEPTH) -** Processing line: ~ z *= Math.sin(a / 2)~ + begin_countdown +** Processing line: ~ end~ - Inside source: true *** True Line Result - z *= Math.sin(a / 2) -** Processing line: ~ x -= SPINPOINT~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x -= SPINPOINT -** Processing line: ~ u = (x * c) - (z * s)~ + +** Processing line: ~ def process_inputs~ - Inside source: true *** True Line Result - u = (x * c) - (z * s) -** Processing line: ~ v = (x * s) + (z * c)~ + def process_inputs +** Processing line: ~ process_inputs_menu~ - Inside source: true *** True Line Result - v = (x * s) + (z * c) -** Processing line: ~ k = DISTANCE.fdiv(100) + (v / 500 * YAW)~ + process_inputs_menu +** Processing line: ~ process_inputs_game~ - Inside source: true *** True Line Result - k = DISTANCE.fdiv(100) + (v / 500 * YAW) -** Processing line: ~ u = u / k~ + process_inputs_game +** Processing line: ~ end~ - Inside source: true *** True Line Result - u = u / k -** Processing line: ~ v = y / k~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - v = y / k -** Processing line: ~ w = POINTSIZE / 10 / k~ + +** Processing line: ~ def process_inputs_menu~ - Inside source: true *** True Line Result - w = POINTSIZE / 10 / k -** Processing line: ~ args.outputs.sprites << { x: offset_x + u - w, y: offset_y + v - w, w: w, h: w, path: 'sprites/square-blue.png'}~ + def process_inputs_menu +** Processing line: ~ return unless state.scene == :menu~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: offset_x + u - w, y: offset_y + v - w, w: w, h: w, path: 'sprites/square-blue.png'} -** Processing line: ~ x += SPINPOINT~ + return unless state.scene == :menu +** Processing line: ~~ - Inside source: true *** True Line Result - x += SPINPOINT -** Processing line: ~ end~ + +** Processing line: ~ changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select~ - Inside source: true *** True Line Result - end -** Processing line: ~ x += 0.5~ + changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select +** Processing line: ~ if inputs.mouse.click~ - Inside source: true *** True Line Result - x += 0.5 -** Processing line: ~ end~ + if inputs.mouse.click +** Processing line: ~ p = inputs.mouse.click.point~ - Inside source: true *** True Line Result - end -** Processing line: ~ y += 0.5~ + p = inputs.mouse.click.point +** Processing line: ~ if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)~ - Inside source: true *** True Line Result - y += 0.5 -** Processing line: ~ x = STARTX~ + if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800) +** Processing line: ~ changediff = true~ - Inside source: true *** True Line Result - x = STARTX -** Processing line: ~ end~ + changediff = true +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ $gtk.reset~ +** Processing line: ~ if changediff~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~~ + if changediff +** Processing line: ~ case state.new_difficulty~ - 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: ~*** 3d - Wireframe - main.rb~ -- Header detected. + case state.new_difficulty +** Processing line: ~ when :easy~ +- Inside source: true *** True Line Result - + when :easy +** Processing line: ~ state.new_difficulty = :normal~ +- Inside source: true *** True Line Result -*** 3d - Wireframe - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + state.new_difficulty = :normal +** Processing line: ~ when :normal~ +- Inside source: true *** True Line Result - + when :normal +** Processing line: ~ state.new_difficulty = :hard~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_3d/02_wireframe/app/main.rb~ + state.new_difficulty = :hard +** Processing line: ~ when :hard~ - Inside source: true *** True Line Result - # ./samples/99_genre_3d/02_wireframe/app/main.rb -** Processing line: ~ def tick args~ + when :hard +** Processing line: ~ state.new_difficulty = :flappy~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.state.model ||= Object3D.new('data/shuttle.off')~ + state.new_difficulty = :flappy +** Processing line: ~ when :flappy~ - Inside source: true *** True Line Result - args.state.model ||= Object3D.new('data/shuttle.off') -** Processing line: ~ args.state.mtx ||= rotate3D(0, 0, 0)~ + when :flappy +** Processing line: ~ state.new_difficulty = :easy~ - Inside source: true *** True Line Result - args.state.mtx ||= rotate3D(0, 0, 0) -** Processing line: ~ args.state.inv_mtx ||= rotate3D(0, 0, 0)~ + state.new_difficulty = :easy +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.inv_mtx ||= rotate3D(0, 0, 0) -** Processing line: ~ delta_mtx = rotate3D(args.inputs.up_down * 0.01, input_roll(args) * 0.01, args.inputs.left_right * 0.01)~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - delta_mtx = rotate3D(args.inputs.up_down * 0.01, input_roll(args) * 0.01, args.inputs.left_right * 0.01) -** Processing line: ~ args.outputs.lines << args.state.model.edges~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.outputs.lines << args.state.model.edges -** Processing line: ~ args.state.model.fast_3x3_transform! args.state.inv_mtx~ + +** Processing line: ~ if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a~ - Inside source: true *** True Line Result - args.state.model.fast_3x3_transform! args.state.inv_mtx -** Processing line: ~ args.state.inv_mtx = mtx_mul(delta_mtx.transpose, args.state.inv_mtx)~ + if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a +** Processing line: ~ state.difficulty = state.new_difficulty~ - Inside source: true *** True Line Result - args.state.inv_mtx = mtx_mul(delta_mtx.transpose, args.state.inv_mtx) -** Processing line: ~ args.state.mtx = mtx_mul(args.state.mtx, delta_mtx)~ + state.difficulty = state.new_difficulty +** Processing line: ~ change_to_scene :game~ - Inside source: true *** True Line Result - args.state.mtx = mtx_mul(args.state.mtx, delta_mtx) -** Processing line: ~ args.state.model.fast_3x3_transform! args.state.mtx~ + change_to_scene :game +** Processing line: ~ reset_game false~ - Inside source: true *** True Line Result - args.state.model.fast_3x3_transform! args.state.mtx -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + reset_game false +** Processing line: ~ state.hi_score = 0~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.debug << args.gtk.framerate_diagnostics_primitives~ + state.hi_score = 0 +** Processing line: ~ begin_countdown~ - Inside source: true *** True Line Result - args.outputs.debug << args.gtk.framerate_diagnostics_primitives -** Processing line: ~ end~ + begin_countdown +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input_roll args~ -- Inside source: true -*** True Line Result - def input_roll args -** Processing line: ~ roll = 0~ +** Processing line: ~ if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b~ - Inside source: true *** True Line Result - roll = 0 -** Processing line: ~ roll += 1 if args.inputs.keyboard.e~ + if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b +** Processing line: ~ state.new_difficulty = state.difficulty~ - Inside source: true *** True Line Result - roll += 1 if args.inputs.keyboard.e -** Processing line: ~ roll -= 1 if args.inputs.keyboard.q~ + state.new_difficulty = state.difficulty +** Processing line: ~ change_to_scene :game~ - Inside source: true *** True Line Result - roll -= 1 if args.inputs.keyboard.q -** Processing line: ~ roll~ + change_to_scene :game +** Processing line: ~ end~ - Inside source: true *** True Line Result - roll -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def rotate3D(theta_x = 0.1, theta_y = 0.1, theta_z = 0.1)~ -- Inside source: true -*** True Line Result - def rotate3D(theta_x = 0.1, theta_y = 0.1, theta_z = 0.1) -** Processing line: ~ c_x, s_x = Math.cos(theta_x), Math.sin(theta_x)~ +** Processing line: ~ def process_inputs_game~ - Inside source: true *** True Line Result - c_x, s_x = Math.cos(theta_x), Math.sin(theta_x) -** Processing line: ~ c_y, s_y = Math.cos(theta_y), Math.sin(theta_y)~ + def process_inputs_game +** Processing line: ~ return unless state.scene == :game~ - Inside source: true *** True Line Result - c_y, s_y = Math.cos(theta_y), Math.sin(theta_y) -** Processing line: ~ c_z, s_z = Math.cos(theta_z), Math.sin(theta_z)~ + return unless state.scene == :game +** Processing line: ~~ - Inside source: true *** True Line Result - c_z, s_z = Math.cos(theta_z), Math.sin(theta_z) -** Processing line: ~ rot_x = [[1, 0, 0], [0, c_x, -s_x], [0, s_x, c_x]]~ + +** Processing line: ~ clicked_menu = false~ - Inside source: true *** True Line Result - rot_x = [[1, 0, 0], [0, c_x, -s_x], [0, s_x, c_x]] -** Processing line: ~ rot_y = [[c_y, 0, s_y], [0, 1, 0], [-s_y, 0, c_y]]~ + clicked_menu = false +** Processing line: ~ if inputs.mouse.click~ - Inside source: true *** True Line Result - rot_y = [[c_y, 0, s_y], [0, 1, 0], [-s_y, 0, c_y]] -** Processing line: ~ rot_z = [[c_z, -s_z, 0], [s_z, c_z, 0], [0, 0, 1]]~ + if inputs.mouse.click +** Processing line: ~ p = inputs.mouse.click.point~ - Inside source: true *** True Line Result - rot_z = [[c_z, -s_z, 0], [s_z, c_z, 0], [0, 0, 1]] -** Processing line: ~ mtx_mul(mtx_mul(rot_x, rot_y), rot_z)~ + p = inputs.mouse.click.point +** Processing line: ~ clicked_menu = (p.y >= 620) && (p.x < 275)~ - Inside source: true *** True Line Result - mtx_mul(mtx_mul(rot_x, rot_y), rot_z) -** Processing line: ~ end~ + clicked_menu = (p.y >= 620) && (p.x < 275) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def mtx_mul(a, b)~ -- Inside source: true -*** True Line Result - def mtx_mul(a, b) -** Processing line: ~ is = (0...a.length)~ -- Inside source: true -*** True Line Result - is = (0...a.length) -** Processing line: ~ js = (0...b[0].length)~ +** Processing line: ~ if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start~ - Inside source: true *** True Line Result - js = (0...b[0].length) -** Processing line: ~ ks = (0...b.length)~ + if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start +** Processing line: ~ change_to_scene :menu~ - Inside source: true *** True Line Result - ks = (0...b.length) -** Processing line: ~ is.map do |i|~ + change_to_scene :menu +** Processing line: ~ elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0~ - Inside source: true *** True Line Result - is.map do |i| -** Processing line: ~ js.map do |j|~ + elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0 +** Processing line: ~ state.dy = 0~ - Inside source: true *** True Line Result - js.map do |j| -** Processing line: ~ ks.map do |k|~ + state.dy = 0 +** Processing line: ~ state.dy += state.flap_power~ - Inside source: true *** True Line Result - ks.map do |k| -** Processing line: ~ a[i][k] * b[k][j]~ + state.dy += state.flap_power +** Processing line: ~ state.flapped_at = state.tick_count~ - Inside source: true *** True Line Result - a[i][k] * b[k][j] -** Processing line: ~ end.reduce(&:plus)~ + state.flapped_at = state.tick_count +** Processing line: ~ outputs.sounds << "sounds/fly-sound.wav"~ - Inside source: true *** True Line Result - end.reduce(&:plus) + outputs.sounds << "sounds/fly-sound.wav" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87220,58 +94131,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ class Object3D~ -- Inside source: true -*** True Line Result - class Object3D -** Processing line: ~ attr_reader :vert_count, :face_count, :edge_count, :verts, :faces, :edges~ -- Inside source: true -*** True Line Result - attr_reader :vert_count, :face_count, :edge_count, :verts, :faces, :edges -** Processing line: ~~ +** Processing line: ~ def scrolling_background at, path, rate, y = 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize(path)~ + def scrolling_background at, path, rate, y = 0 +** Processing line: ~ [~ - Inside source: true *** True Line Result - def initialize(path) -** Processing line: ~ @vert_count = 0~ + [ +** Processing line: ~ [ 0 - at.*(rate) % 1440, y, 1440, 720, path],~ - Inside source: true *** True Line Result - @vert_count = 0 -** Processing line: ~ @face_count = 0~ + [ 0 - at.*(rate) % 1440, y, 1440, 720, path], +** Processing line: ~ [1440 - at.*(rate) % 1440, y, 1440, 720, path]~ - Inside source: true *** True Line Result - @face_count = 0 -** Processing line: ~ @edge_count = 0~ + [1440 - at.*(rate) % 1440, y, 1440, 720, path] +** Processing line: ~ ]~ - Inside source: true *** True Line Result - @edge_count = 0 -** Processing line: ~ @verts = []~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - @verts = [] -** Processing line: ~ @faces = []~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - @faces = [] -** Processing line: ~ @edges = []~ + +** Processing line: ~ def white~ - Inside source: true *** True Line Result - @edges = [] -** Processing line: ~ _init_from_file path~ + def white +** Processing line: ~ [255, 255, 255]~ - Inside source: true *** True Line Result - _init_from_file path + [255, 255, 255] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87280,98 +94179,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def _init_from_file path~ +** Processing line: ~ def large_white_typeset~ - Inside source: true *** True Line Result - def _init_from_file path -** Processing line: ~ file_lines = $gtk.read_file(path).split("\n")~ + def large_white_typeset +** Processing line: ~ [5, 0, 255, 255, 255]~ - Inside source: true *** True Line Result - file_lines = $gtk.read_file(path).split("\n") -** Processing line: ~ .reject { |line| line.start_with?('#') || line.split(' ').length == 0 } # Strip out simple comments and blank lines~ + [5, 0, 255, 255, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - .reject { |line| line.start_with?('#') || line.split(' ').length == 0 } # Strip out simple comments and blank lines -** Processing line: ~ .map { |line| line.split('#')[0] } # Strip out end of line comments~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - .map { |line| line.split('#')[0] } # Strip out end of line comments -** Processing line: ~ .map { |line| line.split(' ') } # Tokenize by splitting on whitespace~ + +** Processing line: ~ def at_beginning?~ - Inside source: true *** True Line Result - .map { |line| line.split(' ') } # Tokenize by splitting on whitespace -** Processing line: ~ raise "OFF file did not start with OFF." if file_lines.shift != ["OFF"] # OFF meshes are supposed to begin with "OFF" as the first line.~ + def at_beginning? +** Processing line: ~ state.walls.count == 0~ - Inside source: true *** True Line Result - raise "OFF file did not start with OFF." if file_lines.shift != ["OFF"] # OFF meshes are supposed to begin with "OFF" as the first line. -** Processing line: ~ raise " line malformed" if file_lines[0].length != 3 # The second line needs to have 3 numbers. Raise an error if it doesn't.~ + state.walls.count == 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - raise " line malformed" if file_lines[0].length != 3 # The second line needs to have 3 numbers. Raise an error if it doesn't. -** Processing line: ~ @vert_count, @face_count, @edge_count = file_lines.shift&.map(&:to_i) # Update the counts~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - @vert_count, @face_count, @edge_count = file_lines.shift&.map(&:to_i) # Update the counts -** Processing line: ~ # Only the vertex and face counts need to be accurate. Raise an error if they are inaccurate.~ + +** Processing line: ~ def dragon_collision_box~ - Inside source: true *** True Line Result - # Only the vertex and face counts need to be accurate. Raise an error if they are inaccurate. -** Processing line: ~ raise "Incorrect number of vertices and/or faces (Parsed VFE header: #{@vert_count} #{@face_count} #{@edge_count})" if file_lines.length != @vert_count + @face_count~ + def dragon_collision_box +** Processing line: ~ state.dragon_sprite~ - Inside source: true *** True Line Result - raise "Incorrect number of vertices and/or faces (Parsed VFE header: #{@vert_count} #{@face_count} #{@edge_count})" if file_lines.length != @vert_count + @face_count -** Processing line: ~ # Grab all the lines describing vertices.~ + state.dragon_sprite +** Processing line: ~ .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~ - Inside source: true *** True Line Result - # Grab all the lines describing vertices. -** Processing line: ~ vert_lines = file_lines[0, @vert_count]~ + .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5) +** Processing line: ~ .rect_shift_right(10)~ - Inside source: true *** True Line Result - vert_lines = file_lines[0, @vert_count] -** Processing line: ~ # Grab all the lines describing faces.~ + .rect_shift_right(10) +** Processing line: ~ .rect_shift_up(state.dy * 2)~ - Inside source: true *** True Line Result - # Grab all the lines describing faces. -** Processing line: ~ face_lines = file_lines[@vert_count, @face_count]~ + .rect_shift_up(state.dy * 2) +** Processing line: ~ end~ - Inside source: true *** True Line Result - face_lines = file_lines[@vert_count, @face_count] -** Processing line: ~ # Create all the vertices~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Create all the vertices -** Processing line: ~ @verts = vert_lines.map_with_index { |line, id| Vertex.new(line, id) }~ + +** Processing line: ~ def game_over?~ - Inside source: true *** True Line Result - @verts = vert_lines.map_with_index { |line, id| Vertex.new(line, id) } -** Processing line: ~ # Create all the faces~ + def game_over? +** Processing line: ~ return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?~ - Inside source: true *** True Line Result - # Create all the faces -** Processing line: ~ @faces = face_lines.map { |line| Face.new(line, @verts) }~ + return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning? +** Processing line: ~~ - Inside source: true *** True Line Result - @faces = face_lines.map { |line| Face.new(line, @verts) } -** Processing line: ~ # Create all the edges~ + +** Processing line: ~ state.walls~ - Inside source: true *** True Line Result - # Create all the edges -** Processing line: ~ @edges = @faces.flat_map(&:edges).uniq do |edge|~ + state.walls +** Processing line: ~ .flat_map { |w| w.sprites }~ - Inside source: true *** True Line Result - @edges = @faces.flat_map(&:edges).uniq do |edge| -** Processing line: ~ sorted = edge.sorted~ + .flat_map { |w| w.sprites } +** Processing line: ~ .any? do |s|~ - Inside source: true *** True Line Result - sorted = edge.sorted -** Processing line: ~ [sorted.point_a, sorted.point_b]~ + .any? do |s| +** Processing line: ~ s.intersect_rect?(dragon_collision_box)~ - Inside source: true *** True Line Result - [sorted.point_a, sorted.point_b] -** Processing line: ~ end~ + s.intersect_rect?(dragon_collision_box) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87380,106 +94279,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def fast_3x3_transform! mtx~ -- Inside source: true -*** True Line Result - def fast_3x3_transform! mtx -** Processing line: ~ @verts.each { |vert| vert.fast_3x3_transform! mtx }~ -- Inside source: true -*** True Line Result - @verts.each { |vert| vert.fast_3x3_transform! mtx } -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~ end~ +** Processing line: ~ def collision_forgiveness~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def collision_forgiveness +** Processing line: ~ case state.difficulty~ - Inside source: true *** True Line Result - -** Processing line: ~ class Face~ + case state.difficulty +** Processing line: ~ when :easy~ - Inside source: true *** True Line Result - class Face -** Processing line: ~~ + when :easy +** Processing line: ~ 0.9~ - Inside source: true *** True Line Result - -** Processing line: ~ attr_reader :verts, :edges~ + 0.9 +** Processing line: ~ when :normal~ - Inside source: true *** True Line Result - attr_reader :verts, :edges -** Processing line: ~~ + when :normal +** Processing line: ~ 0.7~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize(data, verts)~ + 0.7 +** Processing line: ~ when :hard~ - Inside source: true *** True Line Result - def initialize(data, verts) -** Processing line: ~ vert_count = data[0].to_i~ + when :hard +** Processing line: ~ 0.5~ - Inside source: true *** True Line Result - vert_count = data[0].to_i -** Processing line: ~ vert_ids = data[1, vert_count].map(&:to_i)~ + 0.5 +** Processing line: ~ when :flappy~ - Inside source: true *** True Line Result - vert_ids = data[1, vert_count].map(&:to_i) -** Processing line: ~ @verts = vert_ids.map { |i| verts[i] }~ + when :flappy +** Processing line: ~ 0.3~ - Inside source: true *** True Line Result - @verts = vert_ids.map { |i| verts[i] } -** Processing line: ~ @edges = []~ + 0.3 +** Processing line: ~ else~ - Inside source: true *** True Line Result - @edges = [] -** Processing line: ~ (0...vert_count).each { |i| @edges[i] = Edge.new(verts[vert_ids[i - 1]], verts[vert_ids[i]]) }~ + else +** Processing line: ~ 0.9~ - Inside source: true *** True Line Result - (0...vert_count).each { |i| @edges[i] = Edge.new(verts[vert_ids[i - 1]], verts[vert_ids[i]]) } -** Processing line: ~ @edges.rotate! 1~ + 0.9 +** Processing line: ~ end~ - Inside source: true *** True Line Result - @edges.rotate! 1 + 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: ~ class Edge~ +** Processing line: ~ def countdown_text~ - Inside source: true *** True Line Result - class Edge -** Processing line: ~ attr_reader :point_a, :point_b~ + def countdown_text +** Processing line: ~ state.countdown ||= -1~ - Inside source: true *** True Line Result - attr_reader :point_a, :point_b -** Processing line: ~~ + state.countdown ||= -1 +** Processing line: ~ return "" if state.countdown == 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize(point_a, point_b)~ + return "" if state.countdown == 0 +** Processing line: ~ return "GO!" if state.countdown.idiv(60) == 0~ - Inside source: true *** True Line Result - def initialize(point_a, point_b) -** Processing line: ~ @point_a = point_a~ + return "GO!" if state.countdown.idiv(60) == 0 +** Processing line: ~ return "GAME OVER" if state.death_at~ - Inside source: true *** True Line Result - @point_a = point_a -** Processing line: ~ @point_b = point_b~ + return "GAME OVER" if state.death_at +** Processing line: ~ return "READY?"~ - Inside source: true *** True Line Result - @point_b = point_b + return "READY?" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87488,14 +94371,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def sorted~ +** Processing line: ~ def begin_countdown~ - Inside source: true *** True Line Result - def sorted -** Processing line: ~ @point_a.id < @point_b.id ? self : Edge.new(@point_b, @point_a)~ + def begin_countdown +** Processing line: ~ state.countdown = 4.seconds~ - Inside source: true *** True Line Result - @point_a.id < @point_b.id ? self : Edge.new(@point_b, @point_a) + state.countdown = 4.seconds ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87504,26 +94387,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def draw_override ffi~ +** Processing line: ~ def score_text~ - Inside source: true *** True Line Result - def draw_override ffi -** Processing line: ~ ffi.draw_line(@point_a.render_x, @point_a.render_y, @point_b.render_x, @point_b.render_y, 255, 0, 0, 128)~ + def score_text +** Processing line: ~ return "" unless state.countdown > 1.seconds~ - Inside source: true *** True Line Result - ffi.draw_line(@point_a.render_x, @point_a.render_y, @point_b.render_x, @point_b.render_y, 255, 0, 0, 128) -** Processing line: ~ ffi.draw_line(@point_a.render_x+1, @point_a.render_y, @point_b.render_x+1, @point_b.render_y, 255, 0, 0, 128)~ + return "" unless state.countdown > 1.seconds +** Processing line: ~ return "" unless state.death_at~ - Inside source: true *** True Line Result - ffi.draw_line(@point_a.render_x+1, @point_a.render_y, @point_b.render_x+1, @point_b.render_y, 255, 0, 0, 128) -** Processing line: ~ ffi.draw_line(@point_a.render_x, @point_a.render_y+1, @point_b.render_x, @point_b.render_y+1, 255, 0, 0, 128)~ + return "" unless state.death_at +** Processing line: ~ return "SCORE: 0 (LOL)" if state.score == 0~ - Inside source: true *** True Line Result - ffi.draw_line(@point_a.render_x, @point_a.render_y+1, @point_b.render_x, @point_b.render_y+1, 255, 0, 0, 128) -** Processing line: ~ ffi.draw_line(@point_a.render_x+1, @point_a.render_y+1, @point_b.render_x+1, @point_b.render_y+1, 255, 0, 0, 128)~ + return "SCORE: 0 (LOL)" if state.score == 0 +** Processing line: ~ return "HI SCORE: #{state.score}" if state.score == state.hi_score~ - Inside source: true *** True Line Result - ffi.draw_line(@point_a.render_x+1, @point_a.render_y+1, @point_b.render_x+1, @point_b.render_y+1, 255, 0, 0, 128) + return "HI SCORE: #{state.score}" if state.score == state.hi_score +** Processing line: ~ return "SCORE: #{state.score}"~ +- Inside source: true +*** True Line Result + return "SCORE: #{state.score}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87532,58 +94419,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def primitive_marker~ -- Inside source: true -*** True Line Result - def primitive_marker -** Processing line: ~ :line~ -- Inside source: true -*** True Line Result - :line -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~ end~ +** Processing line: ~ def reset_game set_flash = true~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def reset_game set_flash = true +** Processing line: ~ state.flash_at = state.tick_count if set_flash~ - Inside source: true *** True Line Result - -** Processing line: ~ class Vertex~ + state.flash_at = state.tick_count if set_flash +** Processing line: ~ state.walls = []~ - Inside source: true *** True Line Result - class Vertex -** Processing line: ~ attr_accessor :x, :y, :z, :id~ + state.walls = [] +** Processing line: ~ state.y = 500~ - Inside source: true *** True Line Result - attr_accessor :x, :y, :z, :id -** Processing line: ~~ + state.y = 500 +** Processing line: ~ state.dy = 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def initialize(data, id)~ + state.dy = 0 +** Processing line: ~ state.hi_score = state.hi_score.greater(state.score)~ - Inside source: true *** True Line Result - def initialize(data, id) -** Processing line: ~ @x = data[0].to_f~ + state.hi_score = state.hi_score.greater(state.score) +** Processing line: ~ state.score = 0~ - Inside source: true *** True Line Result - @x = data[0].to_f -** Processing line: ~ @y = data[1].to_f~ + state.score = 0 +** Processing line: ~ state.wall_countdown = state.wall_countdown_length.fdiv(2)~ - Inside source: true *** True Line Result - @y = data[1].to_f -** Processing line: ~ @z = data[2].to_f~ + state.wall_countdown = state.wall_countdown_length.fdiv(2) +** Processing line: ~ state.show_death = false~ - Inside source: true *** True Line Result - @z = data[2].to_f -** Processing line: ~ @id = id~ + state.show_death = false +** Processing line: ~ state.death_at = nil~ - Inside source: true *** True Line Result - @id = id + state.death_at = nil ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87592,66 +94467,78 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def fast_3x3_transform! mtx~ +** Processing line: ~ def change_to_scene scene~ - Inside source: true *** True Line Result - def fast_3x3_transform! mtx -** Processing line: ~ _x, _y, _z = @x, @y, @z~ + def change_to_scene scene +** Processing line: ~ state.scene = scene~ - Inside source: true *** True Line Result - _x, _y, _z = @x, @y, @z -** Processing line: ~ @x = mtx[0][0] * _x + mtx[0][1] * _y + mtx[0][2] * _z~ + state.scene = scene +** Processing line: ~ state.scene_at = state.tick_count~ - Inside source: true *** True Line Result - @x = mtx[0][0] * _x + mtx[0][1] * _y + mtx[0][2] * _z -** Processing line: ~ @y = mtx[1][0] * _x + mtx[1][1] * _y + mtx[1][2] * _z~ + state.scene_at = state.tick_count +** Processing line: ~ inputs.keyboard.clear~ - Inside source: true *** True Line Result - @y = mtx[1][0] * _x + mtx[1][1] * _y + mtx[1][2] * _z -** Processing line: ~ @z = mtx[2][0] * _x + mtx[2][1] * _y + mtx[2][2] * _z~ + inputs.keyboard.clear +** Processing line: ~ inputs.controller_one.clear~ - Inside source: true *** True Line Result - @z = mtx[2][0] * _x + mtx[2][1] * _y + mtx[2][2] * _z + inputs.controller_one.clear ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_x~ +** Processing line: ~ $flappy_dragon = FlappyDragon.new~ - Inside source: true *** True Line Result - def render_x -** Processing line: ~ @x * (10 / (5 - @y)) * 170 + 640~ + $flappy_dragon = FlappyDragon.new +** Processing line: ~~ - Inside source: true *** True Line Result - @x * (10 / (5 - @y)) * 170 + 640 -** Processing line: ~ end~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def tick args +** Processing line: ~ $flappy_dragon.grid = args.grid~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_y~ + $flappy_dragon.grid = args.grid +** Processing line: ~ $flappy_dragon.inputs = args.inputs~ - Inside source: true *** True Line Result - def render_y -** Processing line: ~ @z * (10 / (5 - @y)) * 170 + 360~ + $flappy_dragon.inputs = args.inputs +** Processing line: ~ $flappy_dragon.state = args.state~ - Inside source: true *** True Line Result - @z * (10 / (5 - @y)) * 170 + 360 -** Processing line: ~ end~ + $flappy_dragon.state = args.state +** Processing line: ~ $flappy_dragon.outputs = args.outputs~ - Inside source: true *** True Line Result - end + $flappy_dragon.outputs = args.outputs +** Processing line: ~ $flappy_dragon.tick~ +- Inside source: true +*** True Line Result + $flappy_dragon.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~#+end_src~ - Line was identified as the end of a code block. *** True Line Result @@ -87660,174 +94547,190 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** 3d - Wireframe - Data - what-is-this.txt~ +** Processing line: ~*** Arcade - Pong - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** 3d - Wireframe - Data - what-is-this.txt +*** Arcade - Pong - 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_3d/02_wireframe/data/what-is-this.txt~ +** Processing line: ~ # ./samples/99_genre_arcade/pong/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/99_genre_3d/02_wireframe/data/what-is-this.txt -** Processing line: ~ https://en.wikipedia.org/wiki/OFF_(file_format)~ + # ./samples/99_genre_arcade/pong/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - https://en.wikipedia.org/wiki/OFF_(file_format) -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + def tick args +** Processing line: ~ defaults args~ +- Inside source: true *** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. + defaults args +** Processing line: ~ render args~ +- Inside source: true *** True Line Result - -** Processing line: ~*** Arcade - Bullet Hell - main.rb~ -- Header detected. + render args +** Processing line: ~ calc args~ +- Inside source: true *** True Line Result - + calc args +** Processing line: ~ input args~ +- Inside source: true *** True Line Result -*** Arcade - Bullet Hell - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + input args +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true *** True Line Result +** Processing line: ~ def defaults args~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/bullet_hell/app/main.rb~ + def defaults args +** Processing line: ~ args.state.ball.debounce ||= 3 * 60~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/bullet_hell/app/main.rb -** Processing line: ~ def tick args~ + args.state.ball.debounce ||= 3 * 60 +** Processing line: ~ args.state.ball.size ||= 10~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.state.base_columns ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }~ + args.state.ball.size ||= 10 +** Processing line: ~ args.state.ball.size_half ||= args.state.ball.size / 2~ - Inside source: true *** True Line Result - args.state.base_columns ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 } -** Processing line: ~ args.state.base_rows ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }~ + args.state.ball.size_half ||= args.state.ball.size / 2 +** Processing line: ~ args.state.ball.x ||= 640~ - Inside source: true *** True Line Result - args.state.base_rows ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 } -** Processing line: ~ args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }~ + args.state.ball.x ||= 640 +** Processing line: ~ args.state.ball.y ||= 360~ - Inside source: true *** True Line Result - args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 } -** Processing line: ~ args.state.offset_rows = 5.map { 0 }~ + args.state.ball.y ||= 360 +** Processing line: ~ args.state.ball.dx ||= 5.randomize(:sign)~ - Inside source: true *** True Line Result - args.state.offset_rows = 5.map { 0 } -** Processing line: ~ args.state.columns = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }~ + args.state.ball.dx ||= 5.randomize(:sign) +** Processing line: ~ args.state.ball.dy ||= 5.randomize(:sign)~ - Inside source: true *** True Line Result - args.state.columns = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] } -** Processing line: ~ args.state.rows = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }~ + args.state.ball.dy ||= 5.randomize(:sign) +** Processing line: ~ args.state.left_paddle.y ||= 360~ - Inside source: true *** True Line Result - args.state.rows = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] } -** Processing line: ~ args.state.explosions ||= []~ + args.state.left_paddle.y ||= 360 +** Processing line: ~ args.state.right_paddle.y ||= 360~ - Inside source: true *** True Line Result - args.state.explosions ||= [] -** Processing line: ~ args.state.enemies ||= []~ + args.state.right_paddle.y ||= 360 +** Processing line: ~ args.state.paddle.h ||= 120~ - Inside source: true *** True Line Result - args.state.enemies ||= [] -** Processing line: ~ args.state.score ||= 0~ + args.state.paddle.h ||= 120 +** Processing line: ~ args.state.paddle.w ||= 10~ - Inside source: true *** True Line Result - args.state.score ||= 0 -** Processing line: ~ args.state.wave ||= 0~ + args.state.paddle.w ||= 10 +** Processing line: ~ args.state.left_paddle.score ||= 0~ - Inside source: true *** True Line Result - args.state.wave ||= 0 -** Processing line: ~ if args.state.enemies.empty?~ + args.state.left_paddle.score ||= 0 +** Processing line: ~ args.state.right_paddle.score ||= 0~ - Inside source: true *** True Line Result - if args.state.enemies.empty? -** Processing line: ~ args.state.wave += 1~ + args.state.right_paddle.score ||= 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.wave += 1 -** Processing line: ~ args.state.wave_root = Math.sqrt(args.state.wave)~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.wave_root = Math.sqrt(args.state.wave) -** Processing line: ~ args.state.enemies = make_enemies~ + +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - args.state.enemies = make_enemies -** Processing line: ~ end~ + def render args +** Processing line: ~ render_center_line args~ - Inside source: true *** True Line Result - end -** Processing line: ~ args.state.player ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}~ + render_center_line args +** Processing line: ~ render_scores args~ - Inside source: true *** True Line Result - args.state.player ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true} -** Processing line: ~ args.state.enemy_bullets ||= []~ + render_scores args +** Processing line: ~ render_countdown args~ - Inside source: true *** True Line Result - args.state.enemy_bullets ||= [] -** Processing line: ~ args.state.player_bullets ||= []~ + render_countdown args +** Processing line: ~ render_ball args~ - Inside source: true *** True Line Result - args.state.player_bullets ||= [] -** Processing line: ~ args.state.lives ||= 3~ + render_ball args +** Processing line: ~ render_paddles args~ - Inside source: true *** True Line Result - args.state.lives ||= 3 -** Processing line: ~ args.state.missed_shots ||= 0~ + render_paddles args +** Processing line: ~ render_instructions args~ - Inside source: true *** True Line Result - args.state.missed_shots ||= 0 -** Processing line: ~ args.state.fired_shots ||= 0~ + render_instructions args +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.fired_shots ||= 0 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ update_explosions args~ +** Processing line: ~ begin :render_methods~ - Inside source: true *** True Line Result - update_explosions args -** Processing line: ~ update_enemy_positions args~ + begin :render_methods +** Processing line: ~ def render_center_line args~ - Inside source: true *** True Line Result - update_enemy_positions args + def render_center_line args +** Processing line: ~ args.outputs.lines << [640, 0, 640, 720]~ +- Inside source: true +*** True Line Result + args.outputs.lines << [640, 0, 640, 720] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if args.inputs.left && args.state.player[:x] > (300 + 5)~ +** Processing line: ~ def render_scores args~ - Inside source: true *** True Line Result - if args.inputs.left && args.state.player[:x] > (300 + 5) -** Processing line: ~ args.state.player[:x] -= 5~ + def render_scores args +** Processing line: ~ args.outputs.labels << [~ - Inside source: true *** True Line Result - args.state.player[:x] -= 5 -** Processing line: ~ end~ + args.outputs.labels << [ +** Processing line: ~ [320, 650, args.state.left_paddle.score, 10, 1],~ - Inside source: true *** True Line Result - end -** Processing line: ~ if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)~ + [320, 650, args.state.left_paddle.score, 10, 1], +** Processing line: ~ [960, 650, args.state.right_paddle.score, 10, 1]~ - Inside source: true *** True Line Result - if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5) -** Processing line: ~ args.state.player[:x] += 5~ + [960, 650, args.state.right_paddle.score, 10, 1] +** Processing line: ~ ]~ - Inside source: true *** True Line Result - args.state.player[:x] += 5 + ] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87836,34 +94739,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ args.state.enemy_bullets.each do |bullet|~ +** Processing line: ~ def render_countdown args~ - Inside source: true *** True Line Result - args.state.enemy_bullets.each do |bullet| -** Processing line: ~ bullet[:x] += bullet[:dx]~ + def render_countdown args +** Processing line: ~ return unless args.state.ball.debounce > 0~ - Inside source: true *** True Line Result - bullet[:x] += bullet[:dx] -** Processing line: ~ bullet[:y] += bullet[:dy]~ + return unless args.state.ball.debounce > 0 +** Processing line: ~ args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]~ - Inside source: true *** True Line Result - bullet[:y] += bullet[:dy] + args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1] ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ args.state.player_bullets.each do |bullet|~ +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player_bullets.each do |bullet| -** Processing line: ~ bullet[:x] += bullet[:dx]~ + +** Processing line: ~ def render_ball args~ - Inside source: true *** True Line Result - bullet[:x] += bullet[:dx] -** Processing line: ~ bullet[:y] += bullet[:dy]~ + def render_ball args +** Processing line: ~ args.outputs.solids << solid_ball(args)~ - Inside source: true *** True Line Result - bullet[:y] += bullet[:dy] + args.outputs.solids << solid_ball(args) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87872,106 +94775,130 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ args.state.enemy_bullets = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }~ +** Processing line: ~ def render_paddles args~ - Inside source: true *** True Line Result - args.state.enemy_bullets = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) } -** Processing line: ~ args.state.player_bullets = args.state.player_bullets.find_all do |bullet|~ + def render_paddles args +** Processing line: ~ args.outputs.solids << solid_left_paddle(args)~ - Inside source: true *** True Line Result - args.state.player_bullets = args.state.player_bullets.find_all do |bullet| -** Processing line: ~ if bullet[:y].between?(-16, 736)~ + args.outputs.solids << solid_left_paddle(args) +** Processing line: ~ args.outputs.solids << solid_right_paddle(args)~ - Inside source: true *** True Line Result - if bullet[:y].between?(-16, 736) -** Processing line: ~ true~ + args.outputs.solids << solid_right_paddle(args) +** Processing line: ~ end~ - Inside source: true *** True Line Result - true -** Processing line: ~ else~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - else -** Processing line: ~ args.state.missed_shots += 1~ + +** Processing line: ~ def render_instructions args~ - Inside source: true *** True Line Result - args.state.missed_shots += 1 -** Processing line: ~ false~ + def render_instructions args +** Processing line: ~ args.outputs.labels << [320, 30, "W and S keys to move left paddle.", 0, 1]~ - Inside source: true *** True Line Result - false -** Processing line: ~ end~ + args.outputs.labels << [320, 30, "W and S keys to move left paddle.", 0, 1] +** Processing line: ~ args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]~ - Inside source: true *** True Line Result - end + args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1] ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.enemies = args.state.enemies.reject do |enemy|~ +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - args.state.enemies = args.state.enemies.reject do |enemy| -** Processing line: ~ if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2~ + def calc args +** Processing line: ~ args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0~ - Inside source: true *** True Line Result - if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2 -** Processing line: ~ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ + args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0 +** Processing line: ~ calc_move_ball args~ - Inside source: true *** True Line Result - args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} -** Processing line: ~ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ + calc_move_ball args +** Processing line: ~ calc_collision_with_left_paddle args~ - Inside source: true *** True Line Result - args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} -** Processing line: ~ args.state.player[:alive] = false~ + calc_collision_with_left_paddle args +** Processing line: ~ calc_collision_with_right_paddle args~ - Inside source: true *** True Line Result - args.state.player[:alive] = false -** Processing line: ~ true~ + calc_collision_with_right_paddle args +** Processing line: ~ calc_collision_with_walls args~ - Inside source: true *** True Line Result - true -** Processing line: ~ else~ + calc_collision_with_walls args +** Processing line: ~ end~ - Inside source: true *** True Line Result - else -** Processing line: ~ false~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - false -** Processing line: ~ end~ + +** Processing line: ~ begin :calc_methods~ - Inside source: true *** True Line Result - end + begin :calc_methods +** Processing line: ~ def calc_move_ball args~ +- Inside source: true +*** True Line Result + def calc_move_ball args +** Processing line: ~ args.state.ball.x += args.state.ball.dx~ +- Inside source: true +*** True Line Result + args.state.ball.x += args.state.ball.dx +** Processing line: ~ args.state.ball.y += args.state.ball.dy~ +- Inside source: true +*** True Line Result + args.state.ball.y += args.state.ball.dy ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ args.state.enemy_bullets.each do |bullet|~ +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.enemy_bullets.each do |bullet| -** Processing line: ~ if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2~ + +** Processing line: ~ def calc_collision_with_left_paddle args~ - Inside source: true *** True Line Result - if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2 -** Processing line: ~ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ + def calc_collision_with_left_paddle args +** Processing line: ~ if solid_left_paddle(args).intersect_rect? solid_ball(args)~ - Inside source: true *** True Line Result - args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} -** Processing line: ~ args.state.player[:alive] = false~ + if solid_left_paddle(args).intersect_rect? solid_ball(args) +** Processing line: ~ args.state.ball.dx *= -1~ - Inside source: true *** True Line Result - args.state.player[:alive] = false -** Processing line: ~ bullet[:despawn] = true~ + args.state.ball.dx *= -1 +** Processing line: ~ elsif args.state.ball.x < 0~ - Inside source: true *** True Line Result - bullet[:despawn] = true + elsif args.state.ball.x < 0 +** Processing line: ~ args.state.right_paddle.score += 1~ +- Inside source: true +*** True Line Result + args.state.right_paddle.score += 1 +** Processing line: ~ calc_reset_round args~ +- Inside source: true +*** True Line Result + calc_reset_round args ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -87980,46 +94907,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: ~ args.state.enemies = args.state.enemies.reject do |enemy|~ +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.enemies = args.state.enemies.reject do |enemy| -** Processing line: ~ args.state.player_bullets.any? do |bullet|~ + +** Processing line: ~ def calc_collision_with_right_paddle args~ - Inside source: true *** True Line Result - args.state.player_bullets.any? do |bullet| -** Processing line: ~ if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2~ + def calc_collision_with_right_paddle args +** Processing line: ~ if solid_right_paddle(args).intersect_rect? solid_ball(args)~ - Inside source: true *** True Line Result - if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2 -** Processing line: ~ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~ + if solid_right_paddle(args).intersect_rect? solid_ball(args) +** Processing line: ~ args.state.ball.dx *= -1~ - Inside source: true *** True Line Result - args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0} -** Processing line: ~ bullet[:despawn] = true~ + args.state.ball.dx *= -1 +** Processing line: ~ elsif args.state.ball.x > 1280~ - Inside source: true *** True Line Result - bullet[:despawn] = true -** Processing line: ~ args.state.score += 1000 * args.state.wave~ + elsif args.state.ball.x > 1280 +** Processing line: ~ args.state.left_paddle.score += 1~ - Inside source: true *** True Line Result - args.state.score += 1000 * args.state.wave -** Processing line: ~ true~ + args.state.left_paddle.score += 1 +** Processing line: ~ calc_reset_round args~ - Inside source: true *** True Line Result - true -** Processing line: ~ else~ + calc_reset_round args +** Processing line: ~ end~ - Inside source: true *** True Line Result - else -** Processing line: ~ false~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - false -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ def calc_collision_with_walls args~ +- Inside source: true +*** True Line Result + def calc_collision_with_walls args +** Processing line: ~ if args.state.ball.y + args.state.ball.size_half > 720~ +- Inside source: true +*** True Line Result + if args.state.ball.y + args.state.ball.size_half > 720 +** Processing line: ~ args.state.ball.y = 720 - args.state.ball.size_half~ +- Inside source: true +*** True Line Result + args.state.ball.y = 720 - args.state.ball.size_half +** Processing line: ~ args.state.ball.dy *= -1~ +- Inside source: true +*** True Line Result + args.state.ball.dy *= -1 +** Processing line: ~ elsif args.state.ball.y - args.state.ball.size_half < 0~ +- Inside source: true +*** True Line Result + elsif args.state.ball.y - args.state.ball.size_half < 0 +** Processing line: ~ args.state.ball.y = args.state.ball.size_half~ +- Inside source: true +*** True Line Result + args.state.ball.y = args.state.ball.size_half +** Processing line: ~ args.state.ball.dy *= -1~ +- Inside source: true +*** True Line Result + args.state.ball.dy *= -1 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88032,54 +94987,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }~ +** Processing line: ~ def calc_reset_round args~ - Inside source: true *** True Line Result - args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] } -** Processing line: ~ args.state.enemy_bullets = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }~ + def calc_reset_round args +** Processing line: ~ args.state.ball.x = 640~ - Inside source: true *** True Line Result - args.state.enemy_bullets = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] } + args.state.ball.x = 640 +** Processing line: ~ args.state.ball.y = 360~ +- Inside source: true +*** True Line Result + args.state.ball.y = 360 +** Processing line: ~ args.state.ball.dx = 5.randomize(:sign)~ +- Inside source: true +*** True Line Result + args.state.ball.dx = 5.randomize(:sign) +** Processing line: ~ args.state.ball.dy = 5.randomize(:sign)~ +- Inside source: true +*** True Line Result + args.state.ball.dy = 5.randomize(:sign) +** Processing line: ~ args.state.ball.debounce = 3 * 60~ +- Inside source: true +*** True Line Result + args.state.ball.debounce = 3 * 60 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.player[:cooldown] -= 1~ +** Processing line: ~ def input args~ - Inside source: true *** True Line Result - args.state.player[:cooldown] -= 1 -** Processing line: ~ if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]~ + def input args +** Processing line: ~ input_left_paddle args~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive] -** Processing line: ~ args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite~ + input_left_paddle args +** Processing line: ~ input_right_paddle args~ - Inside source: true *** True Line Result - args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite -** Processing line: ~ args.state.fired_shots += 1~ + input_right_paddle args +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.fired_shots += 1 -** Processing line: ~ args.state.player[:cooldown] = 10 + 20 / args.state.wave~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player[:cooldown] = 10 + 20 / args.state.wave -** Processing line: ~ end~ + +** Processing line: ~ begin :input_methods~ - Inside source: true *** True Line Result - end -** Processing line: ~ args.state.enemies.each do |enemy|~ + begin :input_methods +** Processing line: ~ def input_left_paddle args~ - Inside source: true *** True Line Result - args.state.enemies.each do |enemy| -** Processing line: ~ if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal~ + def input_left_paddle args +** Processing line: ~ if args.inputs.controller_one.key_down.down || args.inputs.keyboard.key_down.s~ - Inside source: true *** True Line Result - if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal -** Processing line: ~ args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite~ + if args.inputs.controller_one.key_down.down || args.inputs.keyboard.key_down.s +** Processing line: ~ args.state.left_paddle.y -= 40~ - Inside source: true *** True Line Result - args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite + args.state.left_paddle.y -= 40 +** Processing line: ~ elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w~ +- Inside source: true +*** True Line Result + elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w +** Processing line: ~ args.state.left_paddle.y += 40~ +- Inside source: true +*** True Line Result + args.state.left_paddle.y += 40 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88092,122 +95079,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ -- Inside source: true -*** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.outputs.primitives << args.state.enemies.map do |enemy|~ -- Inside source: true -*** True Line Result - args.outputs.primitives << args.state.enemies.map do |enemy| -** Processing line: ~ [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite~ +** Processing line: ~ def input_right_paddle args~ - Inside source: true *** True Line Result - [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite -** Processing line: ~ end~ + def input_right_paddle args +** Processing line: ~ if args.inputs.controller_two.key_down.down || args.inputs.keyboard.key_down.l~ - Inside source: true *** True Line Result - end -** Processing line: ~ args.outputs.primitives << args.state.player if args.state.player[:alive]~ + if args.inputs.controller_two.key_down.down || args.inputs.keyboard.key_down.l +** Processing line: ~ args.state.right_paddle.y -= 40~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.player if args.state.player[:alive] -** Processing line: ~ args.outputs.primitives << args.state.explosions~ + args.state.right_paddle.y -= 40 +** Processing line: ~ elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.explosions -** Processing line: ~ args.outputs.primitives << args.state.player_bullets~ + elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o +** Processing line: ~ args.state.right_paddle.y += 40~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.player_bullets -** Processing line: ~ args.outputs.primitives << args.state.enemy_bullets~ + args.state.right_paddle.y += 40 +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.enemy_bullets -** Processing line: ~ accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots -** Processing line: ~ args.outputs.primitives << [~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.primitives << [ -** Processing line: ~ [0, 0, 300, 720, 96, 0, 0].solid,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - [0, 0, 300, 720, 96, 0, 0].solid, -** Processing line: ~ [1280 - 300, 0, 300, 720, 96, 0, 0].solid,~ + +** Processing line: ~ begin :assets~ - Inside source: true *** True Line Result - [1280 - 300, 0, 300, 720, 96, 0, 0].solid, -** Processing line: ~ [1280 - 290, 60, "Wave #{args.state.wave}", 255, 255, 255].label,~ + begin :assets +** Processing line: ~ def solid_ball args~ - Inside source: true *** True Line Result - [1280 - 290, 60, "Wave #{args.state.wave}", 255, 255, 255].label, -** Processing line: ~ [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,~ + def solid_ball args +** Processing line: ~ centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size~ - Inside source: true *** True Line Result - [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label, -** Processing line: ~ [1280 - 290, 20, "Score #{(args.state.score * accuracy).floor}", 255, 255, 255].label,~ + centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size +** Processing line: ~ end~ - Inside source: true *** True Line Result - [1280 - 290, 20, "Score #{(args.state.score * accuracy).floor}", 255, 255, 255].label, -** Processing line: ~ ]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - ] -** Processing line: ~ args.outputs.primitives << args.state.lives.times.map do |n|~ + +** Processing line: ~ def solid_left_paddle args~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.lives.times.map do |n| -** Processing line: ~ [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite~ + def solid_left_paddle args +** Processing line: ~ centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h~ - Inside source: true *** True Line Result - [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite + centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ #args.outputs.debug << args.gtk.framerate_diagnostics_primitives~ -- Inside source: true -*** True Line Result - #args.outputs.debug << args.gtk.framerate_diagnostics_primitives ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }~ +** Processing line: ~ def solid_right_paddle args~ - Inside source: true *** True Line Result - if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal } -** Processing line: ~ args.state.player[:alive] = true~ + def solid_right_paddle args +** Processing line: ~ centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h~ - Inside source: true *** True Line Result - args.state.player[:alive] = true -** Processing line: ~ args.state.player[:x] = 624~ + centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def centered_rect x, y, w, h~ - Inside source: true *** True Line Result - args.state.player[:x] = 624 -** Processing line: ~ args.state.player[:y] = 80~ + def centered_rect x, y, w, h +** Processing line: ~ [x - w / 2, y - h / 2, w, h]~ - Inside source: true *** True Line Result - args.state.player[:y] = 80 -** Processing line: ~ args.state.lives -= 1~ + [x - w / 2, y - h / 2, w, h] +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.lives -= 1 -** Processing line: ~ if args.state.lives == -1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if args.state.lives == -1 -** Processing line: ~ args.state.clear!~ + +** Processing line: ~ def centered_rect_vertically x, y, w, h~ - Inside source: true *** True Line Result - args.state.clear! -** Processing line: ~ end~ + def centered_rect_vertically x, y, w, h +** Processing line: ~ [x, y - h / 2, w, h]~ - Inside source: true *** True Line Result - end + [x, y - h / 2, w, h] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88220,242 +95203,250 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def make_enemies~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - def make_enemies -** Processing line: ~ enemies = []~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - enemies = [] -** Processing line: ~ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~ -- Inside source: true + +** Processing line: ~*** Arcade - Snakemoji - main.rb~ +- Header detected. *** True Line Result - enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} } -** Processing line: ~ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~ + +*** True Line Result +*** Arcade - Snakemoji - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. +*** True Line Result + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/snakemoji/app/main.rb~ - Inside source: true *** True Line Result - enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} } -** Processing line: ~ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~ + # ./samples/99_genre_arcade/snakemoji/app/main.rb +** Processing line: ~ # coding: utf-8~ - Inside source: true *** True Line Result - enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} } -** Processing line: ~ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~ + # coding: utf-8 +** Processing line: ~ ################################~ - Inside source: true *** True Line Result - enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} } -** Processing line: ~ enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }~ + ################################ +** Processing line: ~ # So I was working on a snake game while~ - Inside source: true *** True Line Result - enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} } -** Processing line: ~ enemies~ + # So I was working on a snake game while +** Processing line: ~ # learning DragonRuby, and at some point I had a thought~ - Inside source: true *** True Line Result - enemies -** Processing line: ~ end~ + # learning DragonRuby, and at some point I had a thought +** Processing line: ~ # what if I use "😀" as a function name, surely it wont work right...?~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # what if I use "😀" as a function name, surely it wont work right...? +** Processing line: ~ # RIGHT....?~ - Inside source: true *** True Line Result - -** Processing line: ~ def update_explosions args~ + # RIGHT....? +** Processing line: ~ # BUT IT DID, IT WORKED~ - Inside source: true *** True Line Result - def update_explosions args -** Processing line: ~ args.state.explosions.each do |explosion|~ + # BUT IT DID, IT WORKED +** Processing line: ~ # it all went downhill from then~ - Inside source: true *** True Line Result - args.state.explosions.each do |explosion| -** Processing line: ~ explosion[:age] += 0.5~ + # it all went downhill from then +** Processing line: ~ # Created by Anton K. (ai Doge)~ - Inside source: true *** True Line Result - explosion[:age] += 0.5 -** Processing line: ~ explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"~ + # Created by Anton K. (ai Doge) +** Processing line: ~ # https://gist.github.com/scorp200~ - Inside source: true *** True Line Result - explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png" -** Processing line: ~ end~ + # https://gist.github.com/scorp200 +** Processing line: ~ #############LICENSE############~ - Inside source: true *** True Line Result - end -** Processing line: ~ args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }~ + #############LICENSE############ +** Processing line: ~ # Feel free to use this anywhere and however you want~ - Inside source: true *** True Line Result - args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 } -** Processing line: ~ end~ + # Feel free to use this anywhere and however you want +** Processing line: ~ # You can sell this to EA for $1,000,000 if you want, its completely free.~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # You can sell this to EA for $1,000,000 if you want, its completely free. +** Processing line: ~ # Just rememeber you are helping this... thing... to spread...~ - Inside source: true *** True Line Result - -** Processing line: ~ def update_enemy_positions args~ + # Just rememeber you are helping this... thing... to spread... +** Processing line: ~ # ALSO! I am not liable for any mental, physical or financial damage caused.~ - Inside source: true *** True Line Result - def update_enemy_positions args -** Processing line: ~ args.state.enemies.each do |enemy|~ + # ALSO! I am not liable for any mental, physical or financial damage caused. +** Processing line: ~ #############LICENSE############~ - Inside source: true *** True Line Result - args.state.enemies.each do |enemy| -** Processing line: ~ if enemy[:move_state] == :normal~ + #############LICENSE############ +** Processing line: ~~ - Inside source: true *** True Line Result - if enemy[:move_state] == :normal -** Processing line: ~ enemy[:x] = args.state.columns[enemy[:col]]~ + +** Processing line: ~~ - Inside source: true *** True Line Result - enemy[:x] = args.state.columns[enemy[:col]] -** Processing line: ~ enemy[:y] = args.state.rows[enemy[:row]]~ + +** Processing line: ~ class Array~ - Inside source: true *** True Line Result - enemy[:y] = args.state.rows[enemy[:row]] -** Processing line: ~ enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]~ + class Array +** Processing line: ~ #Helper function~ - Inside source: true *** True Line Result - enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive] -** Processing line: ~ elsif enemy[:move_state] == :dive~ + #Helper function +** Processing line: ~ def move! vector~ - Inside source: true *** True Line Result - elsif enemy[:move_state] == :dive -** Processing line: ~ enemy[:target_x] ||= args.state.player[:x]~ + def move! vector +** Processing line: ~ self.x += vector.x~ - Inside source: true *** True Line Result - enemy[:target_x] ||= args.state.player[:x] -** Processing line: ~ enemy[:target_y] ||= args.state.player[:y]~ + self.x += vector.x +** Processing line: ~ self.y += vector.y~ - Inside source: true *** True Line Result - enemy[:target_y] ||= args.state.player[:y] -** Processing line: ~ dx = enemy[:target_x] - enemy[:x]~ + self.y += vector.y +** Processing line: ~ return self~ - Inside source: true *** True Line Result - dx = enemy[:target_x] - enemy[:x] -** Processing line: ~ dy = enemy[:target_y] - enemy[:y]~ + return self +** Processing line: ~ end~ - Inside source: true *** True Line Result - dy = enemy[:target_y] - enemy[:y] -** Processing line: ~ vel = Math.sqrt(dx * dx + dy * dy)~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - vel = Math.sqrt(dx * dx + dy * dy) -** Processing line: ~ speed_limit = 2 + args.state.wave_root~ + +** Processing line: ~ #Helper function to draw snake body~ - Inside source: true *** True Line Result - speed_limit = 2 + args.state.wave_root -** Processing line: ~ if vel > speed_limit~ + #Helper function to draw snake body +** Processing line: ~ def draw! 🎮, 📺, color~ - Inside source: true *** True Line Result - if vel > speed_limit -** Processing line: ~ dx /= vel / speed_limit~ + def draw! 🎮, 📺, color +** Processing line: ~ translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]~ - Inside source: true *** True Line Result - dx /= vel / speed_limit -** Processing line: ~ dy /= vel / speed_limit~ + translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - dy /= vel / speed_limit -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ if vel < 1 || !args.state.player[:alive]~ + +** Processing line: ~ #This is where it all started, I was trying to find good way to multiply a map by a number, * is already used so is **~ - Inside source: true *** True Line Result - if vel < 1 || !args.state.player[:alive] -** Processing line: ~ enemy[:move_state] = :retreat~ + #This is where it all started, I was trying to find good way to multiply a map by a number, * is already used so is ** +** Processing line: ~ #I kept trying different combinations of symbols, when suddenly...~ - Inside source: true *** True Line Result - enemy[:move_state] = :retreat -** Processing line: ~ end~ + #I kept trying different combinations of symbols, when suddenly... +** Processing line: ~ def 😀 value~ - Inside source: true *** True Line Result - end -** Processing line: ~ enemy[:x] += dx~ + def 😀 value +** Processing line: ~ self.map {|d| d * value}~ - Inside source: true *** True Line Result - enemy[:x] += dx -** Processing line: ~ enemy[:y] += dy~ + self.map {|d| d * value} +** Processing line: ~ end~ - Inside source: true *** True Line Result - enemy[:y] += dy -** Processing line: ~ elsif enemy[:move_state] == :retreat~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif enemy[:move_state] == :retreat -** Processing line: ~ enemy[:target_x] = args.state.columns[enemy[:col]]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - enemy[:target_x] = args.state.columns[enemy[:col]] -** Processing line: ~ enemy[:target_y] = args.state.rows[enemy[:row]]~ + +** Processing line: ~ #Draw stuff with an offset~ - Inside source: true *** True Line Result - enemy[:target_y] = args.state.rows[enemy[:row]] -** Processing line: ~ dx = enemy[:target_x] - enemy[:x]~ + #Draw stuff with an offset +** Processing line: ~ def translate output_collection, ⛓, what~ - Inside source: true *** True Line Result - dx = enemy[:target_x] - enemy[:x] -** Processing line: ~ dy = enemy[:target_y] - enemy[:y]~ + def translate output_collection, ⛓, what +** Processing line: ~ what.x += ⛓.x~ - Inside source: true *** True Line Result - dy = enemy[:target_y] - enemy[:y] -** Processing line: ~ vel = Math.sqrt(dx * dx + dy * dy)~ + what.x += ⛓.x +** Processing line: ~ what.y += ⛓.y~ - Inside source: true *** True Line Result - vel = Math.sqrt(dx * dx + dy * dy) -** Processing line: ~ speed_limit = 2 + args.state.wave_root~ + what.y += ⛓.y +** Processing line: ~ output_collection << what~ - Inside source: true *** True Line Result - speed_limit = 2 + args.state.wave_root -** Processing line: ~ if vel > speed_limit~ + output_collection << what +** Processing line: ~ end~ - Inside source: true *** True Line Result - if vel > speed_limit -** Processing line: ~ dx /= vel / speed_limit~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - dx /= vel / speed_limit -** Processing line: ~ dy /= vel / speed_limit~ + +** Processing line: ~ BLUE = [33, 150, 243]~ - Inside source: true *** True Line Result - dy /= vel / speed_limit -** Processing line: ~ elsif vel < 1~ + BLUE = [33, 150, 243] +** Processing line: ~ RED = [244, 67, 54]~ - Inside source: true *** True Line Result - elsif vel < 1 -** Processing line: ~ enemy[:move_state] = :normal~ + RED = [244, 67, 54] +** Processing line: ~ GOLD = [255, 193, 7]~ - Inside source: true *** True Line Result - enemy[:move_state] = :normal -** Processing line: ~ enemy[:target_x] = nil~ + GOLD = [255, 193, 7] +** Processing line: ~ LAST = 0~ - Inside source: true *** True Line Result - enemy[:target_x] = nil -** Processing line: ~ enemy[:target_y] = nil~ + LAST = 0 +** Processing line: ~~ - Inside source: true *** True Line Result - enemy[:target_y] = nil -** Processing line: ~ end~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - end -** Processing line: ~ enemy[:x] += dx~ + def tick args +** Processing line: ~ defaults args.state~ - Inside source: true *** True Line Result - enemy[:x] += dx -** Processing line: ~ enemy[:y] += dy~ + defaults args.state +** Processing line: ~ render args.state, args.outputs~ - Inside source: true *** True Line Result - enemy[:y] += dy -** Processing line: ~ end~ + render args.state, args.outputs +** Processing line: ~ input args.state, args.inputs~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + input args.state, args.inputs +** Processing line: ~ update args.state~ - Inside source: true *** True Line Result - end + update args.state ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88464,118 +95455,122 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Arcade - Dueling Starships - main.rb~ -- Header detected. +** Processing line: ~ def update 🎮~ +- Inside source: true *** True Line Result - + def update 🎮 +** Processing line: ~ #Update every 10 frames~ +- Inside source: true *** True Line Result -*** Arcade - Dueling Starships - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + #Update every 10 frames +** Processing line: ~ if 🎮.tick_count.mod_zero? 10~ +- Inside source: true *** True Line Result - + if 🎮.tick_count.mod_zero? 10 +** Processing line: ~ #Add new snake body piece at head's location~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/dueling_starships/app/main.rb~ + #Add new snake body piece at head's location +** Processing line: ~ 🎮.🐍 << [*🎮.🤖]~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/dueling_starships/app/main.rb -** Processing line: ~ class DuelingSpaceships~ + 🎮.🐍 << [*🎮.🤖] +** Processing line: ~ #Assign Next Direction to Direction~ - Inside source: true *** True Line Result - class DuelingSpaceships -** Processing line: ~ attr_accessor :state, :inputs, :outputs, :grid~ + #Assign Next Direction to Direction +** Processing line: ~ 🎮.🚗 = *🎮.🚦~ - Inside source: true *** True Line Result - attr_accessor :state, :inputs, :outputs, :grid + 🎮.🚗 = *🎮.🚦 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick~ +** Processing line: ~ #Trim the snake a bit if its longer than current size~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + #Trim the snake a bit if its longer than current size +** Processing line: ~ if 🎮.🐍.length > 🎮.🛒~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render~ + if 🎮.🐍.length > 🎮.🛒 +** Processing line: ~ 🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]~ - Inside source: true *** True Line Result - render -** Processing line: ~ calc~ + 🎮.🐍 = 🎮.🐍[-🎮.🛒..-1] +** Processing line: ~ end~ - Inside source: true *** True Line Result - calc -** Processing line: ~ input~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - input -** Processing line: ~ end~ + +** Processing line: ~ #Move the head in the Direction~ - Inside source: true *** True Line Result - end + #Move the head in the Direction +** Processing line: ~ 🎮.🤖.move! 🎮.🚗~ +- Inside source: true +*** True Line Result + 🎮.🤖.move! 🎮.🚗 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults~ +** Processing line: ~ #If Head is outside the playing field, or inside snake's body restart game~ - Inside source: true *** True Line Result - def defaults -** Processing line: ~ outputs.background_color = [0, 0, 0]~ + #If Head is outside the playing field, or inside snake's body restart game +** Processing line: ~ if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}~ - Inside source: true *** True Line Result - outputs.background_color = [0, 0, 0] -** Processing line: ~ state.ship_blue ||= new_blue_ship~ + if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖} +** Processing line: ~ LAST = 🎮.💰~ - Inside source: true *** True Line Result - state.ship_blue ||= new_blue_ship -** Processing line: ~ state.ship_red ||= new_red_ship~ + LAST = 🎮.💰 +** Processing line: ~ 🎮.as_hash.clear~ - Inside source: true *** True Line Result - state.ship_red ||= new_red_ship -** Processing line: ~ state.flames ||= []~ + 🎮.as_hash.clear +** Processing line: ~ return~ - Inside source: true *** True Line Result - state.flames ||= [] -** Processing line: ~ state.bullets ||= []~ + return +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.bullets ||= [] -** Processing line: ~ state.ship_blue_score ||= 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.ship_blue_score ||= 0 -** Processing line: ~ state.ship_red_score ||= 0~ + +** Processing line: ~ #If head lands on food add size and score~ - Inside source: true *** True Line Result - state.ship_red_score ||= 0 -** Processing line: ~ state.stars ||= 100.map do~ + #If head lands on food add size and score +** Processing line: ~ if 🎮.🤖 == 🎮.🍎~ - Inside source: true *** True Line Result - state.stars ||= 100.map do -** Processing line: ~ [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),~ + if 🎮.🤖 == 🎮.🍎 +** Processing line: ~ 🎮.🛒 += 1~ - Inside source: true *** True Line Result - [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio), -** Processing line: ~ grid.h_half.randomize(:sign, :ratio)),~ + 🎮.🛒 += 1 +** Processing line: ~ 🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5~ - Inside source: true *** True Line Result - grid.h_half.randomize(:sign, :ratio)), -** Processing line: ~ 128 + 128.randomize(:ratio), 255, 255]~ + 🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5 +** Processing line: ~ spawn_🍎 🎮~ - Inside source: true *** True Line Result - 128 + 128.randomize(:ratio), 255, 255] + spawn_🍎 🎮 +** Processing line: ~ puts 🎮.🍎~ +- Inside source: true +*** True Line Result + puts 🎮.🍎 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88588,170 +95583,174 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def default_ship x, y, angle, sprite_path, bullet_sprite_path, color~ -- Inside source: true -*** True Line Result - def default_ship x, y, angle, sprite_path, bullet_sprite_path, color -** Processing line: ~ state.new_entity(:ship,~ +** Processing line: ~ #Every second remove 1 point~ - Inside source: true *** True Line Result - state.new_entity(:ship, -** Processing line: ~ { x: x,~ + #Every second remove 1 point +** Processing line: ~ if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)~ - Inside source: true *** True Line Result - { x: x, -** Processing line: ~ y: y,~ + if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60) +** Processing line: ~ 🎮.💰 -= 1~ - Inside source: true *** True Line Result - y: y, -** Processing line: ~ dy: 0,~ + 🎮.💰 -= 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - dy: 0, -** Processing line: ~ dx: 0,~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - dx: 0, -** Processing line: ~ damage: 0,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - damage: 0, -** Processing line: ~ dead: false,~ + +** Processing line: ~ def spawn_🍎 🎮~ - Inside source: true *** True Line Result - dead: false, -** Processing line: ~ angle: angle,~ + def spawn_🍎 🎮 +** Processing line: ~ #Food~ - Inside source: true *** True Line Result - angle: angle, -** Processing line: ~ max_alpha: 255,~ + #Food +** Processing line: ~ 🎮.🍎 ||= [*🎮.🤖]~ - Inside source: true *** True Line Result - max_alpha: 255, -** Processing line: ~ sprite_path: sprite_path,~ + 🎮.🍎 ||= [*🎮.🤖] +** Processing line: ~ #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body~ - Inside source: true *** True Line Result - sprite_path: sprite_path, -** Processing line: ~ bullet_sprite_path: bullet_sprite_path,~ + #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body +** Processing line: ~ while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do~ - Inside source: true *** True Line Result - bullet_sprite_path: bullet_sprite_path, -** Processing line: ~ color: color })~ + while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do +** Processing line: ~ 🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]~ - Inside source: true *** True Line Result - color: color }) + 🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)] ** 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 new_red_ship~ +** Processing line: ~ def render 🎮, 📺~ - Inside source: true *** True Line Result - def new_red_ship -** Processing line: ~ default_ship(400, 250.randomize(:sign, :ratio),~ + def render 🎮, 📺 +** Processing line: ~ #Paint the background black~ - Inside source: true *** True Line Result - default_ship(400, 250.randomize(:sign, :ratio), -** Processing line: ~ 180, 'sprites/ship_red.png', 'sprites/red_bullet.png',~ + #Paint the background black +** Processing line: ~ 📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]~ - Inside source: true *** True Line Result - 180, 'sprites/ship_red.png', 'sprites/red_bullet.png', -** Processing line: ~ [255, 90, 90])~ + 📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255] +** Processing line: ~ #Draw a border for the playing field~ - Inside source: true *** True Line Result - [255, 90, 90]) -** Processing line: ~ end~ + #Draw a border for the playing field +** Processing line: ~ translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]~ - Inside source: true *** True Line Result - end + translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def new_blue_ship~ +** Processing line: ~ #Draw the snake's body~ - Inside source: true *** True Line Result - def new_blue_ship -** Processing line: ~ default_ship(-400, 250.randomize(:sign, :ratio),~ + #Draw the snake's body +** Processing line: ~ 🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end~ - Inside source: true *** True Line Result - default_ship(-400, 250.randomize(:sign, :ratio), -** Processing line: ~ 0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',~ + 🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end +** Processing line: ~ #Draw the head~ - Inside source: true *** True Line Result - 0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png', -** Processing line: ~ [110, 140, 255])~ + #Draw the head +** Processing line: ~ 🎮.🤖.draw! 🎮, 📺, BLUE~ - Inside source: true *** True Line Result - [110, 140, 255]) -** Processing line: ~ end~ + 🎮.🤖.draw! 🎮, 📺, BLUE +** Processing line: ~ #Draw the food~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + #Draw the food +** Processing line: ~ 🎮.🍎.draw! 🎮, 📺, RED~ - Inside source: true *** True Line Result - -** Processing line: ~ def render~ + 🎮.🍎.draw! 🎮, 📺, RED +** Processing line: ~~ - Inside source: true *** True Line Result - def render -** Processing line: ~ render_instructions~ + +** Processing line: ~ #Draw current score~ - Inside source: true *** True Line Result - render_instructions -** Processing line: ~ render_score~ + #Draw current score +** Processing line: ~ translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]~ - Inside source: true *** True Line Result - render_score -** Processing line: ~ render_universe~ + translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD] +** Processing line: ~ #Draw your last score, if any~ - Inside source: true *** True Line Result - render_universe -** Processing line: ~ render_flames~ + #Draw your last score, if any +** Processing line: ~ translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]~ - Inside source: true *** True Line Result - render_flames -** Processing line: ~ render_ships~ + translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0] +** Processing line: ~ #Draw starting message, only if Direction is 0~ - Inside source: true *** True Line Result - render_ships -** Processing line: ~ render_bullets~ + #Draw starting message, only if Direction is 0 +** Processing line: ~ translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]~ - Inside source: true *** True Line Result - render_bullets -** Processing line: ~ end~ + translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_ships~ +** Processing line: ~ def input 🎮, 🕹~ - Inside source: true *** True Line Result - def render_ships -** Processing line: ~ update_ship_outputs(state.ship_blue)~ + def input 🎮, 🕹 +** Processing line: ~ #Left and Right keyboard input, only change if X direction is 0~ - Inside source: true *** True Line Result - update_ship_outputs(state.ship_blue) -** Processing line: ~ update_ship_outputs(state.ship_red)~ + #Left and Right keyboard input, only change if X direction is 0 +** Processing line: ~ if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0~ - Inside source: true *** True Line Result - update_ship_outputs(state.ship_red) -** Processing line: ~ outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]~ + if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0 +** Processing line: ~ 🎮.🚦 = [-1, 0]~ - Inside source: true *** True Line Result - outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite] -** Processing line: ~ outputs.labels << [state.ship_blue.label, state.ship_red.label]~ + 🎮.🚦 = [-1, 0] +** Processing line: ~ elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0~ - Inside source: true *** True Line Result - outputs.labels << [state.ship_blue.label, state.ship_red.label] + elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0 +** Processing line: ~ 🎮.🚦 = [1, 0]~ +- Inside source: true +*** True Line Result + 🎮.🚦 = [1, 0] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88760,158 +95759,198 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_instructions~ +** Processing line: ~ #Up and Down keyboard input, only change if Y direction is 0~ - Inside source: true *** True Line Result - def render_instructions -** Processing line: ~ return if state.ship_blue.dx > 0 || state.ship_blue.dy > 0 ||~ + #Up and Down keyboard input, only change if Y direction is 0 +** Processing line: ~ if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0~ - Inside source: true *** True Line Result - return if state.ship_blue.dx > 0 || state.ship_blue.dy > 0 || -** Processing line: ~ state.ship_red.dx > 0 || state.ship_red.dy > 0 ||~ + if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0 +** Processing line: ~ 🎮.🚦 = [0, 1]~ - Inside source: true *** True Line Result - state.ship_red.dx > 0 || state.ship_red.dy > 0 || -** Processing line: ~ state.flames.length > 0~ + 🎮.🚦 = [0, 1] +** Processing line: ~ elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0~ - Inside source: true *** True Line Result - state.flames.length > 0 + elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0 +** Processing line: ~ 🎮.🚦 = [0, -1]~ +- Inside source: true +*** True Line Result + 🎮.🚦 = [0, -1] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.labels << [grid.left.shift_right(30),~ +** Processing line: ~ def defaults 🎮~ - Inside source: true *** True Line Result - outputs.labels << [grid.left.shift_right(30), -** Processing line: ~ grid.bottom.shift_up(30),~ + def defaults 🎮 +** Processing line: ~ #Playing field size~ - Inside source: true *** True Line Result - grid.bottom.shift_up(30), -** Processing line: ~ "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",~ + #Playing field size +** Processing line: ~ 🎮.🗺 ||= [20, 20]~ - Inside source: true *** True Line Result - "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.", -** Processing line: ~ 0, 0, 255, 255, 255]~ + 🎮.🗺 ||= [20, 20] +** Processing line: ~ #Scale for drawing, screen height / Field height~ - Inside source: true *** True Line Result - 0, 0, 255, 255, 255] -** Processing line: ~ end~ + #Scale for drawing, screen height / Field height +** Processing line: ~ 🎮.⚖️ ||= 720 / 🎮.🗺.y~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + 🎮.⚖️ ||= 720 / 🎮.🗺.y +** Processing line: ~ #Offset, offset all rendering to the center of the screen~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc~ + #Offset, offset all rendering to the center of the screen +** Processing line: ~ 🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]~ - Inside source: true *** True Line Result - def calc -** Processing line: ~ calc_thrusts~ + 🎮.⛓ ||= [(1280 - 720).fdiv(2), 0] +** Processing line: ~ #Padding, make the snake body slightly smaller than the scale~ - Inside source: true *** True Line Result - calc_thrusts -** Processing line: ~ calc_ships~ + #Padding, make the snake body slightly smaller than the scale +** Processing line: ~ 🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i~ - Inside source: true *** True Line Result - calc_ships -** Processing line: ~ calc_bullets~ + 🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i +** Processing line: ~ #Snake Size~ - Inside source: true *** True Line Result - calc_bullets -** Processing line: ~ calc_winner~ + #Snake Size +** Processing line: ~ 🎮.🛒 ||= 3~ - Inside source: true *** True Line Result - calc_winner -** Processing line: ~ end~ + 🎮.🛒 ||= 3 +** Processing line: ~ #Snake head, the only part we are actually controlling~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + #Snake head, the only part we are actually controlling +** Processing line: ~ 🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]~ - Inside source: true *** True Line Result - -** Processing line: ~ def input~ + 🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2] +** Processing line: ~ #Snake body map, follows the head~ - Inside source: true *** True Line Result - def input -** Processing line: ~ input_accelerate~ + #Snake body map, follows the head +** Processing line: ~ 🎮.🐍 ||= []~ - Inside source: true *** True Line Result - input_accelerate -** Processing line: ~ input_turn~ + 🎮.🐍 ||= [] +** Processing line: ~ #Direction the head moves to~ - Inside source: true *** True Line Result - input_turn -** Processing line: ~ input_bullets_and_mines~ + #Direction the head moves to +** Processing line: ~ 🎮.🚗 ||= [0, 0]~ - Inside source: true *** True Line Result - input_bullets_and_mines -** Processing line: ~ end~ + 🎮.🚗 ||= [0, 0] +** Processing line: ~ #Next_Direction, during input check only change this variable and then when game updates asign this to Direction~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + #Next_Direction, during input check only change this variable and then when game updates asign this to Direction +** Processing line: ~ 🎮.🚦 ||= [*🎮.🚗]~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_score~ + 🎮.🚦 ||= [*🎮.🚗] +** Processing line: ~ #Your score~ - Inside source: true *** True Line Result - def render_score -** Processing line: ~ outputs.labels << [grid.left.shift_right(80),~ + #Your score +** Processing line: ~ 🎮.💰 ||= 0~ - Inside source: true *** True Line Result - outputs.labels << [grid.left.shift_right(80), -** Processing line: ~ grid.top.shift_down(40),~ + 🎮.💰 ||= 0 +** Processing line: ~ #Spawns Food randomly~ - Inside source: true *** True Line Result - grid.top.shift_down(40), -** Processing line: ~ state.ship_blue_score, 30, 1, state.ship_blue.color]~ + #Spawns Food randomly +** Processing line: ~ spawn_🍎(🎮) unless 🎮.🍎?~ - Inside source: true *** True Line Result - state.ship_blue_score, 30, 1, state.ship_blue.color] + spawn_🍎(🎮) unless 🎮.🍎? +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.labels << [grid.right.shift_left(80),~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - outputs.labels << [grid.right.shift_left(80), -** Processing line: ~ grid.top.shift_down(40),~ +#+end_src +** Processing line: ~~ +- End of paragraph detected. +*** True Line Result + +** Processing line: ~*** Arcade - Solar System - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** Arcade - Solar System - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. +*** True Line Result + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/solar_system/app/main.rb~ - Inside source: true *** True Line Result - grid.top.shift_down(40), -** Processing line: ~ state.ship_red_score, 30, 1, state.ship_red.color]~ + # ./samples/99_genre_arcade/solar_system/app/main.rb +** Processing line: ~ # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4~ - Inside source: true *** True Line Result - state.ship_red_score, 30, 1, state.ship_red.color] -** Processing line: ~ end~ + # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4 +** Processing line: ~ # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8~ - Inside source: true *** True Line Result - end + # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_universe~ +** Processing line: ~ def defaults args~ - Inside source: true *** True Line Result - def render_universe -** Processing line: ~ return if outputs.static_solids.any?~ + def defaults args +** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - return if outputs.static_solids.any? -** Processing line: ~ outputs.static_solids << grid.rect~ + args.outputs.background_color = [0, 0, 0] +** Processing line: ~ args.state.x ||= 640~ - Inside source: true *** True Line Result - outputs.static_solids << grid.rect -** Processing line: ~ outputs.static_solids << state.stars~ + args.state.x ||= 640 +** Processing line: ~ args.state.y ||= 360~ - Inside source: true *** True Line Result - outputs.static_solids << state.stars + args.state.y ||= 360 +** Processing line: ~ args.state.stars ||= 100.map do~ +- Inside source: true +*** True Line Result + args.state.stars ||= 100.map do +** Processing line: ~ [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]~ +- Inside source: true +*** True Line Result + [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88920,22 +95959,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def apply_round_finished_alpha entity~ -- Inside source: true -*** True Line Result - def apply_round_finished_alpha entity -** Processing line: ~ return entity unless state.round_finished_debounce~ +** Processing line: ~ args.state.sun ||= args.state.new_entity(:sun) do |s|~ - Inside source: true *** True Line Result - return entity unless state.round_finished_debounce -** Processing line: ~ entity.a *= state.round_finished_debounce.percentage_of(2.seconds)~ + args.state.sun ||= args.state.new_entity(:sun) do |s| +** Processing line: ~ s.s = 100~ - Inside source: true *** True Line Result - entity.a *= state.round_finished_debounce.percentage_of(2.seconds) -** Processing line: ~ return entity~ + s.s = 100 +** Processing line: ~ s.path = 'sprites/sun.png'~ - Inside source: true *** True Line Result - return entity + s.path = 'sprites/sun.png' ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -88944,74 +95979,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def update_ship_outputs ship, sprite_size = 66~ -- Inside source: true -*** True Line Result - def update_ship_outputs ship, sprite_size = 66 -** Processing line: ~ ship.sprite =~ +** Processing line: ~ args.state.planets = [~ - Inside source: true *** True Line Result - ship.sprite = -** Processing line: ~ apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),~ + args.state.planets = [ +** Processing line: ~ [:mercury, 65, 5, 88],~ - Inside source: true *** True Line Result - apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y), -** Processing line: ~ ship.sprite_path,~ + [:mercury, 65, 5, 88], +** Processing line: ~ [:venus, 100, 10, 225],~ - Inside source: true *** True Line Result - ship.sprite_path, -** Processing line: ~ ship.angle,~ + [:venus, 100, 10, 225], +** Processing line: ~ [:earth, 120, 10, 365],~ - Inside source: true *** True Line Result - ship.angle, -** Processing line: ~ ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite~ + [:earth, 120, 10, 365], +** Processing line: ~ [:mars, 140, 8, 687],~ - Inside source: true *** True Line Result - ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite -** Processing line: ~ ship.label =~ + [:mars, 140, 8, 687], +** Processing line: ~ [:jupiter, 280, 30, 365 * 11.8],~ - Inside source: true *** True Line Result - ship.label = -** Processing line: ~ apply_round_finished_alpha [ship.x,~ + [:jupiter, 280, 30, 365 * 11.8], +** Processing line: ~ [:saturn, 350, 20, 365 * 29.5],~ - Inside source: true *** True Line Result - apply_round_finished_alpha [ship.x, -** Processing line: ~ ship.y + 100,~ + [:saturn, 350, 20, 365 * 29.5], +** Processing line: ~ [:uranus, 400, 15, 365 * 84],~ - Inside source: true *** True Line Result - ship.y + 100, -** Processing line: ~ "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label~ + [:uranus, 400, 15, 365 * 84], +** Processing line: ~ [:neptune, 440, 15, 365 * 164.8],~ - Inside source: true *** True Line Result - "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label -** Processing line: ~ end~ + [:neptune, 440, 15, 365 * 164.8], +** Processing line: ~ [:pluto, 480, 5, 365 * 247.8],~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [:pluto, 480, 5, 365 * 247.8], +** Processing line: ~ ].map do |name, distance, size, year_in_days|~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_flames sprite_size = 6~ + ].map do |name, distance, size, year_in_days| +** Processing line: ~ args.state.new_entity(name) do |p|~ - Inside source: true *** True Line Result - def render_flames sprite_size = 6 -** Processing line: ~ outputs.sprites << state.flames.map do |p|~ + args.state.new_entity(name) do |p| +** Processing line: ~ p.path = "sprites/#{name}.png"~ - Inside source: true *** True Line Result - outputs.sprites << state.flames.map do |p| -** Processing line: ~ apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),~ + p.path = "sprites/#{name}.png" +** Processing line: ~ p.distance = distance * 0.7~ - Inside source: true *** True Line Result - apply_round_finished_alpha [sprite_size.to_square(p.x, p.y), -** Processing line: ~ 'sprites/flame.png', 0,~ + p.distance = distance * 0.7 +** Processing line: ~ p.s = size * 0.7~ - Inside source: true *** True Line Result - 'sprites/flame.png', 0, -** Processing line: ~ p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite~ + p.s = size * 0.7 +** Processing line: ~ p.year_in_days = year_in_days~ - Inside source: true *** True Line Result - p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite + p.year_in_days = year_in_days ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89024,126 +96055,122 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render_bullets sprite_size = 10~ -- Inside source: true -*** True Line Result - def render_bullets sprite_size = 10 -** Processing line: ~ outputs.sprites << state.bullets.map do |b|~ -- Inside source: true -*** True Line Result - outputs.sprites << state.bullets.map do |b| -** Processing line: ~ apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),~ +** Processing line: ~ args.state.ship ||= args.state.new_entity(:ship) do |s|~ - Inside source: true *** True Line Result - apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y), -** Processing line: ~ b.owner.bullet_sprite_path,~ + args.state.ship ||= args.state.new_entity(:ship) do |s| +** Processing line: ~ s.x = 1280 * rand~ - Inside source: true *** True Line Result - b.owner.bullet_sprite_path, -** Processing line: ~ 0, b.max_alpha].sprite~ + s.x = 1280 * rand +** Processing line: ~ s.y = 720 * rand~ - Inside source: true *** True Line Result - 0, b.max_alpha].sprite -** Processing line: ~ end~ + s.y = 720 * rand +** Processing line: ~ s.angle = 0~ - Inside source: true *** True Line Result - end + s.angle = 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def wrap_location! location~ +** Processing line: ~ def to_sprite args, entity~ - Inside source: true *** True Line Result - def wrap_location! location -** Processing line: ~ location.x = grid.left if location.x > grid.right~ + def to_sprite args, entity +** Processing line: ~ x = 0~ - Inside source: true *** True Line Result - location.x = grid.left if location.x > grid.right -** Processing line: ~ location.x = grid.right if location.x < grid.left~ + x = 0 +** Processing line: ~ y = 0~ - Inside source: true *** True Line Result - location.x = grid.right if location.x < grid.left -** Processing line: ~ location.y = grid.top if location.y < grid.bottom~ + y = 0 +** Processing line: ~~ - Inside source: true *** True Line Result - location.y = grid.top if location.y < grid.bottom -** Processing line: ~ location.y = grid.bottom if location.y > grid.top~ + +** Processing line: ~ if entity.year_in_days~ - Inside source: true *** True Line Result - location.y = grid.bottom if location.y > grid.top -** Processing line: ~ location~ + if entity.year_in_days +** Processing line: ~ day = args.state.tick_count~ - Inside source: true *** True Line Result - location -** Processing line: ~ end~ + day = args.state.tick_count +** Processing line: ~ day_in_year = day % entity.year_in_days~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + day_in_year = day % entity.year_in_days +** Processing line: ~ entity.random_start_day ||= day_in_year * rand~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_thrusts~ + entity.random_start_day ||= day_in_year * rand +** Processing line: ~ percentage_of_year = day_in_year.fdiv(entity.year_in_days)~ - Inside source: true *** True Line Result - def calc_thrusts -** Processing line: ~ state.flames =~ + percentage_of_year = day_in_year.fdiv(entity.year_in_days) +** Processing line: ~ angle = 365 * percentage_of_year~ - Inside source: true *** True Line Result - state.flames = -** Processing line: ~ state.flames~ + angle = 365 * percentage_of_year +** Processing line: ~ x = angle.vector_x(entity.distance)~ - Inside source: true *** True Line Result - state.flames -** Processing line: ~ .reject(&:old?)~ + x = angle.vector_x(entity.distance) +** Processing line: ~ y = angle.vector_y(entity.distance)~ - Inside source: true *** True Line Result - .reject(&:old?) -** Processing line: ~ .map do |p|~ + y = angle.vector_y(entity.distance) +** Processing line: ~ end~ - Inside source: true *** True Line Result - .map do |p| -** Processing line: ~ p.speed *= 0.9~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - p.speed *= 0.9 -** Processing line: ~ p.y += p.angle.vector_y(p.speed)~ + +** Processing line: ~ [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]~ - Inside source: true *** True Line Result - p.y += p.angle.vector_y(p.speed) -** Processing line: ~ p.x += p.angle.vector_x(p.speed)~ + [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path] +** Processing line: ~ end~ - Inside source: true *** True Line Result - p.x += p.angle.vector_x(p.speed) -** Processing line: ~ wrap_location! p~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - wrap_location! p -** Processing line: ~ end~ + +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def render args +** Processing line: ~ args.outputs.solids << [0, 0, 1280, 720]~ - Inside source: true *** True Line Result - end + args.outputs.solids << [0, 0, 1280, 720] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def all_ships~ +** Processing line: ~ args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|~ - Inside source: true *** True Line Result - def all_ships -** Processing line: ~ [state.ship_blue, state.ship_red]~ + args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b| +** Processing line: ~ [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]~ - Inside source: true *** True Line Result - [state.ship_blue, state.ship_red] + [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89152,78 +96179,102 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def alive_ships~ +** Processing line: ~ args.outputs.sprites << to_sprite(args, args.state.sun)~ - Inside source: true *** True Line Result - def alive_ships -** Processing line: ~ all_ships.reject { |s| s.dead }~ + args.outputs.sprites << to_sprite(args, args.state.sun) +** Processing line: ~ args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }~ - Inside source: true *** True Line Result - all_ships.reject { |s| s.dead } -** Processing line: ~ end~ + args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p } +** Processing line: ~ args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]~ - Inside source: true *** True Line Result - end + args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_bullet bullet~ +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - def calc_bullet bullet -** Processing line: ~ bullet.y += bullet.angle.vector_y(bullet.speed)~ + def calc args +** Processing line: ~ args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|~ - Inside source: true *** True Line Result - bullet.y += bullet.angle.vector_y(bullet.speed) -** Processing line: ~ bullet.x += bullet.angle.vector_x(bullet.speed)~ + args.state.stars = args.state.stars.map do |x, y, speed, r, g, b| +** Processing line: ~ x += speed~ - Inside source: true *** True Line Result - bullet.x += bullet.angle.vector_x(bullet.speed) -** Processing line: ~ wrap_location! bullet~ + x += speed +** Processing line: ~ y += speed~ - Inside source: true *** True Line Result - wrap_location! bullet -** Processing line: ~ explode_bullet! bullet if bullet.old?~ + y += speed +** Processing line: ~ x = 0 if x > 1280~ - Inside source: true *** True Line Result - explode_bullet! bullet if bullet.old? -** Processing line: ~ return if bullet.exploded~ + x = 0 if x > 1280 +** Processing line: ~ y = 0 if y > 720~ - Inside source: true *** True Line Result - return if bullet.exploded -** Processing line: ~ return if state.round_finished~ + y = 0 if y > 720 +** Processing line: ~ [x, y, speed, r, g, b]~ - Inside source: true *** True Line Result - return if state.round_finished -** Processing line: ~ alive_ships.each do |s|~ + [x, y, speed, r, g, b] +** Processing line: ~ end~ - Inside source: true *** True Line Result - alive_ships.each do |s| -** Processing line: ~ if s != bullet.owner &&~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if s != bullet.owner && -** Processing line: ~ s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))~ + +** Processing line: ~ if args.state.tick_count == 0~ - Inside source: true *** True Line Result - s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y)) -** Processing line: ~ explode_bullet! bullet, 10, 5, 30~ + if args.state.tick_count == 0 +** Processing line: ~ args.outputs.sounds << 'sounds/bg.ogg'~ - Inside source: true *** True Line Result - explode_bullet! bullet, 10, 5, 30 -** Processing line: ~ s.damage += 1~ + args.outputs.sounds << 'sounds/bg.ogg' +** Processing line: ~ end~ - Inside source: true *** True Line Result - s.damage += 1 -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ def process_inputs args~ +- Inside source: true +*** True Line Result + def process_inputs args +** Processing line: ~ if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left~ +- Inside source: true +*** True Line Result + if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left +** Processing line: ~ args.state.ship.angle += 1~ +- Inside source: true +*** True Line Result + args.state.ship.angle += 1 +** Processing line: ~ elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right~ +- Inside source: true +*** True Line Result + elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right +** Processing line: ~ args.state.ship.angle -= 1~ +- Inside source: true +*** True Line Result + args.state.ship.angle -= 1 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89232,382 +96283,402 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc_bullets~ +** Processing line: ~ if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a~ - Inside source: true *** True Line Result - def calc_bullets -** Processing line: ~ state.bullets.each { |b| calc_bullet b }~ + if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a +** Processing line: ~ args.state.ship.x += args.state.ship.angle.x_vector~ - Inside source: true *** True Line Result - state.bullets.each { |b| calc_bullet b } -** Processing line: ~ state.bullets.reject! { |b| b.exploded }~ + args.state.ship.x += args.state.ship.angle.x_vector +** Processing line: ~ args.state.ship.y += args.state.ship.angle.y_vector~ - Inside source: true *** True Line Result - state.bullets.reject! { |b| b.exploded } + args.state.ship.y += args.state.ship.angle.y_vector ** 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 create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255 -** Processing line: ~ flame_count.times do~ + def tick args +** Processing line: ~ defaults args~ - Inside source: true *** True Line Result - flame_count.times do -** Processing line: ~ state.flames << state.new_entity(type,~ + defaults args +** Processing line: ~ render args~ - Inside source: true *** True Line Result - state.flames << state.new_entity(type, -** Processing line: ~ { angle: 360.randomize(:ratio),~ + render args +** Processing line: ~ calc args~ - Inside source: true *** True Line Result - { angle: 360.randomize(:ratio), -** Processing line: ~ speed: max_speed.randomize(:ratio),~ + calc args +** Processing line: ~ process_inputs args~ - Inside source: true *** True Line Result - speed: max_speed.randomize(:ratio), -** Processing line: ~ lifetime: lifetime,~ + process_inputs args +** Processing line: ~ end~ - Inside source: true *** True Line Result - lifetime: lifetime, -** Processing line: ~ x: entity.x,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x: entity.x, -** Processing line: ~ y: entity.y,~ + +** Processing line: ~ def r~ - Inside source: true *** True Line Result - y: entity.y, -** Processing line: ~ max_alpha: max_alpha })~ + def r +** Processing line: ~ $gtk.reset~ - Inside source: true *** True Line Result - max_alpha: max_alpha }) -** Processing line: ~ end~ + $gtk.reset +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. +*** True Line Result +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10~ -- Inside source: true +** Processing line: ~*** Arcade - Sound Golf - main.rb~ +- Header detected. *** True Line Result - def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10 -** Processing line: ~ bullet.exploded = true~ + +*** True Line Result +*** Arcade - Sound Golf - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. +*** True Line Result + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/sound_golf/app/main.rb~ - Inside source: true *** True Line Result - bullet.exploded = true -** Processing line: ~ create_explosion! :bullet_explosion,~ + # ./samples/99_genre_arcade/sound_golf/app/main.rb +** Processing line: ~ =begin~ - Inside source: true *** True Line Result - create_explosion! :bullet_explosion, -** Processing line: ~ bullet,~ + =begin +** Processing line: ~~ - Inside source: true *** True Line Result - bullet, -** Processing line: ~ flame_override,~ + +** Processing line: ~ APIs Listing that haven't been encountered in previous sample apps:~ - Inside source: true *** True Line Result - flame_override, -** Processing line: ~ max_speed,~ + APIs Listing that haven't been encountered in previous sample apps: +** Processing line: ~~ - Inside source: true *** True Line Result - max_speed, -** Processing line: ~ lifetime,~ + +** Processing line: ~ - sample: Chooses random element from array.~ - Inside source: true *** True Line Result - lifetime, -** Processing line: ~ bullet.max_alpha~ + - sample: Chooses random element from array. +** Processing line: ~ In this sample app, the target note is set by taking a sample from the collection~ - Inside source: true *** True Line Result - bullet.max_alpha -** Processing line: ~ end~ + In this sample app, the target note is set by taking a sample from the collection +** Processing line: ~ of available notes.~ - Inside source: true *** True Line Result - end + of available notes. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_ship ship~ +** Processing line: ~ Reminders:~ - Inside source: true *** True Line Result - def calc_ship ship -** Processing line: ~ ship.x += ship.dx~ + Reminders: +** Processing line: ~ - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~ - Inside source: true *** True Line Result - ship.x += ship.dx -** Processing line: ~ ship.y += ship.dy~ + - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual +** Processing line: ~ 720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~ - Inside source: true *** True Line Result - ship.y += ship.dy -** Processing line: ~ wrap_location! ship~ + 720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720). +** Processing line: ~~ - Inside source: true *** True Line Result - wrap_location! ship -** Processing line: ~ end~ + +** Processing line: ~ - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + - args.state.new_entity: Used when we want to create a new object, like a sprite or button. +** Processing line: ~ For example, if we want to create a new button, we would declare it as a new entity and~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_ships~ + For example, if we want to create a new button, we would declare it as a new entity and +** Processing line: ~ then define its properties.~ - Inside source: true *** True Line Result - def calc_ships -** Processing line: ~ all_ships.each { |s| calc_ship s }~ + then define its properties. +** Processing line: ~~ - Inside source: true *** True Line Result - all_ships.each { |s| calc_ship s } -** Processing line: ~ return if all_ships.any? { |s| s.dead }~ + +** Processing line: ~ - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~ - Inside source: true *** True Line Result - return if all_ships.any? { |s| s.dead } -** Processing line: ~ return if state.round_finished~ + - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated +** Processing line: ~ as Ruby code, and the placeholder is replaced with its corresponding value or result.~ - Inside source: true *** True Line Result - return if state.round_finished -** Processing line: ~ return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)~ + as Ruby code, and the placeholder is replaced with its corresponding value or result. +** Processing line: ~~ - Inside source: true *** True Line Result - return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite) -** Processing line: ~ state.ship_blue.damage = 5~ + +** Processing line: ~ - args.outputs.labels: An array. The values generate a label.~ - Inside source: true *** True Line Result - state.ship_blue.damage = 5 -** Processing line: ~ state.ship_red.damage = 5~ + - args.outputs.labels: An array. The values generate a label. +** Processing line: ~ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~ - Inside source: true *** True Line Result - state.ship_red.damage = 5 -** Processing line: ~ end~ + The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] +** Processing line: ~ For more information about labels, go to mygame/documentation/02-labels.md.~ - Inside source: true *** True Line Result - end + For more information about labels, go to mygame/documentation/02-labels.md. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def create_thruster_flames! ship~ +** Processing line: ~ - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).~ - Inside source: true *** True Line Result - def create_thruster_flames! ship -** Processing line: ~ state.flames << state.new_entity(:ship_thruster,~ + - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't). +** Processing line: ~~ - Inside source: true *** True Line Result - state.flames << state.new_entity(:ship_thruster, -** Processing line: ~ { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),~ + +** Processing line: ~ - first: Returns the first element of an array.~ - Inside source: true *** True Line Result - { angle: ship.angle + 180 + 60.randomize(:sign, :ratio), -** Processing line: ~ speed: 5.randomize(:ratio),~ + - first: Returns the first element of an array. +** Processing line: ~~ - Inside source: true *** True Line Result - speed: 5.randomize(:ratio), -** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ + +** Processing line: ~ - inside_rect: Returns true or false depending on if the point is inside the rect.~ - Inside source: true *** True Line Result - max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), -** Processing line: ~ lifetime: 30,~ + - inside_rect: Returns true or false depending on if the point is inside the rect. +** Processing line: ~~ - Inside source: true *** True Line Result - lifetime: 30, -** Processing line: ~ x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),~ + +** Processing line: ~ - to_sym: Returns symbol corresponding to string. Will create a symbol if it does~ - Inside source: true *** True Line Result - x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio), -** Processing line: ~ y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })~ + - to_sym: Returns symbol corresponding to string. Will create a symbol if it does +** Processing line: ~ not already exist.~ - Inside source: true *** True Line Result - y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) }) -** Processing line: ~ end~ + not already exist. +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ =end~ +- Inside source: true +*** True Line Result + =end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input_accelerate_ship should_move_ship, ship~ +** Processing line: ~ # This sample app allows users to test their musical skills by matching the piano sound that plays in each~ - Inside source: true *** True Line Result - def input_accelerate_ship should_move_ship, ship -** Processing line: ~ return if ship.dead~ + # This sample app allows users to test their musical skills by matching the piano sound that plays in each +** Processing line: ~ # level to the correct note.~ - Inside source: true *** True Line Result - return if ship.dead + # level to the correct note. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ should_move_ship &&= (ship.dx + ship.dy).abs < 5~ +** Processing line: ~ # Runs all the methods necessary for the game to function properly.~ - Inside source: true *** True Line Result - should_move_ship &&= (ship.dx + ship.dy).abs < 5 -** Processing line: ~~ + # Runs all the methods necessary for the game to function properly. +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - -** Processing line: ~ if should_move_ship~ + def tick args +** Processing line: ~ defaults args~ - Inside source: true *** True Line Result - if should_move_ship -** Processing line: ~ create_thruster_flames! ship~ + defaults args +** Processing line: ~ render args~ - Inside source: true *** True Line Result - create_thruster_flames! ship -** Processing line: ~ ship.dx += ship.angle.vector_x 0.050~ + render args +** Processing line: ~ calc args~ - Inside source: true *** True Line Result - ship.dx += ship.angle.vector_x 0.050 -** Processing line: ~ ship.dy += ship.angle.vector_y 0.050~ + calc args +** Processing line: ~ input_mouse args~ - Inside source: true *** True Line Result - ship.dy += ship.angle.vector_y 0.050 -** Processing line: ~ else~ + input_mouse args +** Processing line: ~ tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""~ - Inside source: true *** True Line Result - else -** Processing line: ~ ship.dx *= 0.99~ + tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\"" +** Processing line: ~ end~ - Inside source: true *** True Line Result - ship.dx *= 0.99 -** Processing line: ~ ship.dy *= 0.99~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - ship.dy *= 0.99 -** Processing line: ~ end~ + +** Processing line: ~ # Sets default values and creates empty collections~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Sets default values and creates empty collections +** Processing line: ~ # Initialization happens in the first frame only~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Initialization happens in the first frame only +** Processing line: ~ def defaults args~ - Inside source: true *** True Line Result - -** Processing line: ~ def input_accelerate~ + def defaults args +** Processing line: ~ args.state.notes ||= []~ - Inside source: true *** True Line Result - def input_accelerate -** Processing line: ~ input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue~ + args.state.notes ||= [] +** Processing line: ~ args.state.click_feedbacks ||= []~ - Inside source: true *** True Line Result - input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue -** Processing line: ~ input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red~ + args.state.click_feedbacks ||= [] +** Processing line: ~ args.state.current_level ||= 1~ - Inside source: true *** True Line Result - input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red -** Processing line: ~ end~ + args.state.current_level ||= 1 +** Processing line: ~ args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet~ - Inside source: true *** True Line Result - end + args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input_turn_ship direction, ship~ +** Processing line: ~ # Uses a label to display current level, and shows the score~ - Inside source: true *** True Line Result - def input_turn_ship direction, ship -** Processing line: ~ ship.angle -= 3 * direction~ + # Uses a label to display current level, and shows the score +** Processing line: ~ # Creates a button to play the sample note, and displays the available notes that could be a potential match~ - Inside source: true *** True Line Result - ship.angle -= 3 * direction -** Processing line: ~ end~ + # Creates a button to play the sample note, and displays the available notes that could be a potential match +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - end + def render args ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input_turn~ +** Processing line: ~ # grid.w_half positions the label in the horizontal center of the screen.~ - Inside source: true *** True Line Result - def input_turn -** Processing line: ~ input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue~ + # grid.w_half positions the label in the horizontal center of the screen. +** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]~ - Inside source: true *** True Line Result - input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue -** Processing line: ~ input_turn_ship inputs.controller_two.left_right, state.ship_red~ + args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0] +** Processing line: ~~ - Inside source: true *** True Line Result - input_turn_ship inputs.controller_two.left_right, state.ship_red -** Processing line: ~ end~ + +** Processing line: ~ render_score args # shows score on screen~ - Inside source: true *** True Line Result - end + render_score args # shows score on screen ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input_bullet create_bullet, ship~ -- Inside source: true -*** True Line Result - def input_bullet create_bullet, ship -** Processing line: ~ return unless create_bullet~ +** Processing line: ~ args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title~ - Inside source: true *** True Line Result - return unless create_bullet -** Processing line: ~ return if ship.dead~ + args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title +** Processing line: ~ args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }~ - Inside source: true *** True Line Result - return if ship.dead + args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.bullets << state.new_entity(:ship_bullet,~ +** Processing line: ~ if args.state.game_over # if game is over, a "play again" button is shown~ - Inside source: true *** True Line Result - state.bullets << state.new_entity(:ship_bullet, -** Processing line: ~ { owner: ship,~ + if args.state.game_over # if game is over, a "play again" button is shown +** Processing line: ~ # Calculations ensure that Play Again label is displayed in center of border~ - Inside source: true *** True Line Result - { owner: ship, -** Processing line: ~ angle: ship.angle,~ + # Calculations ensure that Play Again label is displayed in center of border +** Processing line: ~ # Remove calculations from y parameters and see what happens to border and label placement~ - Inside source: true *** True Line Result - angle: ship.angle, -** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ + # Remove calculations from y parameters and see what happens to border and label placement +** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label~ - Inside source: true *** True Line Result - max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), -** Processing line: ~ speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),~ + args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label +** Processing line: ~ args.outputs.borders << args.state.play_again_button # outputs border~ - Inside source: true *** True Line Result - speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y), -** Processing line: ~ lifetime: 120,~ + args.outputs.borders << args.state.play_again_button # outputs border +** Processing line: ~ else # otherwise, if game is not over~ - Inside source: true *** True Line Result - lifetime: 120, -** Processing line: ~ sprite_size: 10,~ + else # otherwise, if game is not over +** Processing line: ~ # Calculations ensure that label appears in center of border~ - Inside source: true *** True Line Result - sprite_size: 10, -** Processing line: ~ x: ship.x + ship.angle.vector_x * 32,~ + # Calculations ensure that label appears in center of border +** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label~ - Inside source: true *** True Line Result - x: ship.x + ship.angle.vector_x * 32, -** Processing line: ~ y: ship.y + ship.angle.vector_y * 32 })~ + args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label +** Processing line: ~ args.outputs.borders << args.state.play_note_button # outputs border~ - Inside source: true *** True Line Result - y: ship.y + ship.angle.vector_y * 32 }) + args.outputs.borders << args.state.play_note_button # outputs border ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89616,58 +96687,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def input_mine create_mine, ship~ -- Inside source: true -*** True Line Result - def input_mine create_mine, ship -** Processing line: ~ return unless create_mine~ -- Inside source: true -*** True Line Result - return unless create_mine -** Processing line: ~ return if ship.dead~ +** Processing line: ~ return if args.state.game_over # return if game is over~ - Inside source: true *** True Line Result - return if ship.dead + return if args.state.game_over # return if game is over ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.bullets << state.new_entity(:ship_bullet,~ -- Inside source: true -*** True Line Result - state.bullets << state.new_entity(:ship_bullet, -** Processing line: ~ { owner: ship,~ -- Inside source: true -*** True Line Result - { owner: ship, -** Processing line: ~ angle: 360.randomize(:sign, :ratio),~ +** Processing line: ~ args.outputs.labels << [args.grid.w_half, 400, "I think the note is a(n)...", 0, 1, 0, 0, 0] # outputs label~ - Inside source: true *** True Line Result - angle: 360.randomize(:sign, :ratio), -** Processing line: ~ max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~ + args.outputs.labels << [args.grid.w_half, 400, "I think the note is a(n)...", 0, 1, 0, 0, 0] # outputs label +** Processing line: ~~ - Inside source: true *** True Line Result - max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds), -** Processing line: ~ speed: 0.02,~ + +** Processing line: ~ # Shows all of the available notes that can be potential matches.~ - Inside source: true *** True Line Result - speed: 0.02, -** Processing line: ~ sprite_size: 10,~ + # Shows all of the available notes that can be potential matches. +** Processing line: ~ available_notes.each_with_index do |note, i|~ - Inside source: true *** True Line Result - sprite_size: 10, -** Processing line: ~ lifetime: 600,~ + available_notes.each_with_index do |note, i| +** Processing line: ~ args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)~ - Inside source: true *** True Line Result - lifetime: 600, -** Processing line: ~ x: ship.x + ship.angle.vector_x * -50,~ + args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border) +** Processing line: ~ args.outputs.labels << args.state.notes[i].label # outputs note on screen with a label and a border~ - Inside source: true *** True Line Result - x: ship.x + ship.angle.vector_x * -50, -** Processing line: ~ y: ship.y + ship.angle.vector_y * -50 })~ + args.outputs.labels << args.state.notes[i].label # outputs note on screen with a label and a border +** Processing line: ~ args.outputs.borders << args.state.notes[i].border~ - Inside source: true *** True Line Result - y: ship.y + ship.angle.vector_y * -50 }) + args.outputs.borders << args.state.notes[i].border ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89676,274 +96731,258 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def input_bullets_and_mines~ -- Inside source: true -*** True Line Result - def input_bullets_and_mines -** Processing line: ~ return if state.bullets.length > 100~ -- Inside source: true -*** True Line Result - return if state.bullets.length > 100 -** Processing line: ~~ +** Processing line: ~ # Shows whether or not the user is correct by filling the screen with either red or green~ - Inside source: true *** True Line Result - -** Processing line: ~ [~ + # Shows whether or not the user is correct by filling the screen with either red or green +** Processing line: ~ args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }~ - Inside source: true *** True Line Result - [ -** Processing line: ~ [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,~ + args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid } +** Processing line: ~ end~ - Inside source: true *** True Line Result - [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space, -** Processing line: ~ inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - inputs.controller_one.key_down.b || inputs.keyboard.key_down.down, -** Processing line: ~ state.ship_blue],~ + +** Processing line: ~ # Shows the score (number of times the user guesses wrong) onto the screen using labels.~ - Inside source: true *** True Line Result - state.ship_blue], -** Processing line: ~ [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]~ + # Shows the score (number of times the user guesses wrong) onto the screen using labels. +** Processing line: ~ def render_score args~ - Inside source: true *** True Line Result - [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red] -** Processing line: ~ ].each do |a_held, b_down, ship|~ + def render_score args +** Processing line: ~ if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par~ - Inside source: true *** True Line Result - ].each do |a_held, b_down, ship| -** Processing line: ~ input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)~ + if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par +** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]~ - Inside source: true *** True Line Result - input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship) -** Processing line: ~ input_mine(b_down, ship)~ + args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0] +** Processing line: ~ else # otherwise, number of times the user has guessed wrong is shown~ - Inside source: true *** True Line Result - input_mine(b_down, ship) -** Processing line: ~ end~ + else # otherwise, number of times the user has guessed wrong is shown +** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation~ - Inside source: true *** True Line Result - end + args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_kill_ships~ +** Processing line: ~ # Sets the target note for the level and performs calculations on click_feedbacks.~ - Inside source: true *** True Line Result - def calc_kill_ships -** Processing line: ~ alive_ships.find_all { |s| s.damage >= 5 }.each do |s|~ + # Sets the target note for the level and performs calculations on click_feedbacks. +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - alive_ships.find_all { |s| s.damage >= 5 }.each do |s| -** Processing line: ~ s.dead = true~ + def calc args +** Processing line: ~ args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note~ - Inside source: true *** True Line Result - s.dead = true -** Processing line: ~ create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha~ + args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note +** Processing line: ~ args.state.click_feedbacks.each { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely~ - Inside source: true *** True Line Result - create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha -** Processing line: ~ end~ + args.state.click_feedbacks.each { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely +** Processing line: ~ # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection +** Processing line: ~ args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }~ - Inside source: true *** True Line Result - end + args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_score~ +** Processing line: ~ # Uses input from the user to play the target note, as well as the other notes that could be a potential match.~ - Inside source: true *** True Line Result - def calc_score -** Processing line: ~ return if state.round_finished~ + # Uses input from the user to play the target note, as well as the other notes that could be a potential match. +** Processing line: ~ def input_mouse args~ - Inside source: true *** True Line Result - return if state.round_finished -** Processing line: ~ return if alive_ships.length > 1~ + def input_mouse args +** Processing line: ~ return unless args.inputs.mouse.click # return unless the mouse is clicked~ - Inside source: true *** True Line Result - return if alive_ships.length > 1 + return unless args.inputs.mouse.click # return unless the mouse is clicked ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if alive_ships.first == state.ship_red~ -- Inside source: true -*** True Line Result - if alive_ships.first == state.ship_red -** Processing line: ~ state.ship_red_score += 1~ +** Processing line: ~ # finds button that was clicked by user~ - Inside source: true *** True Line Result - state.ship_red_score += 1 -** Processing line: ~ elsif alive_ships.first == state.ship_blue~ + # finds button that was clicked by user +** Processing line: ~ button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements~ - Inside source: true *** True Line Result - elsif alive_ships.first == state.ship_blue -** Processing line: ~ state.ship_blue_score += 1~ + button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements +** Processing line: ~ args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of~ - Inside source: true *** True Line Result - state.ship_blue_score += 1 -** Processing line: ~ end~ + args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of +** Processing line: ~ end.find_all { |b| b.is_a? Hash }.first # reject, return first element~ - Inside source: true *** True Line Result - end + end.find_all { |b| b.is_a? Hash }.first # reject, return first element ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.round_finished = true~ -- Inside source: true -*** True Line Result - state.round_finished = true -** Processing line: ~ end~ +** Processing line: ~ return unless button_clicked # return unless button_clicked as a value (a button was clicked)~ - Inside source: true *** True Line Result - end + return unless button_clicked # return unless button_clicked as a value (a button was clicked) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_reset_ships~ -- Inside source: true -*** True Line Result - def calc_reset_ships -** Processing line: ~ return unless state.round_finished~ +** Processing line: ~ queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked~ - Inside source: true *** True Line Result - return unless state.round_finished -** Processing line: ~ state.round_finished_debounce ||= 2.seconds~ + queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked +** Processing line: ~ button_clicked.x,~ - Inside source: true *** True Line Result - state.round_finished_debounce ||= 2.seconds -** Processing line: ~ state.round_finished_debounce -= 1~ + button_clicked.x, +** Processing line: ~ button_clicked.y,~ - Inside source: true *** True Line Result - state.round_finished_debounce -= 1 -** Processing line: ~ return if state.round_finished_debounce > 0~ + button_clicked.y, +** Processing line: ~ button_clicked.w,~ - Inside source: true *** True Line Result - return if state.round_finished_debounce > 0 -** Processing line: ~ start_new_round!~ + button_clicked.w, +** Processing line: ~ button_clicked.h,~ - Inside source: true *** True Line Result - start_new_round! -** Processing line: ~ end~ + button_clicked.h, +** Processing line: ~ 150, 100, 200 # sets color of button to shade of purple~ - Inside source: true *** True Line Result - end + 150, 100, 200 # sets color of button to shade of purple ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def start_new_round!~ +** Processing line: ~ if button_clicked[:label] == 'play' # if "play note" button is pressed~ - Inside source: true *** True Line Result - def start_new_round! -** Processing line: ~ state.ship_blue = new_blue_ship~ + if button_clicked[:label] == 'play' # if "play note" button is pressed +** Processing line: ~ args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output~ - Inside source: true *** True Line Result - state.ship_blue = new_blue_ship -** Processing line: ~ state.ship_red = new_red_ship~ + args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output +** Processing line: ~ elsif button_clicked[:label] == 'again' # if "play game again" button is pressed~ - Inside source: true *** True Line Result - state.ship_red = new_red_ship -** Processing line: ~ state.round_finished = false~ + elsif button_clicked[:label] == 'again' # if "play game again" button is pressed +** Processing line: ~ args.state.target_note = nil # no target note~ - Inside source: true *** True Line Result - state.round_finished = false -** Processing line: ~ state.round_finished_debounce = nil~ + args.state.target_note = nil # no target note +** Processing line: ~ args.state.current_level = 1 # starts at level 1 again~ - Inside source: true *** True Line Result - state.round_finished_debounce = nil -** Processing line: ~ state.flames.clear~ + args.state.current_level = 1 # starts at level 1 again +** Processing line: ~ args.state.times_wrong = 0 # starts off with 0 wrong guesses~ - Inside source: true *** True Line Result - state.flames.clear -** Processing line: ~ state.bullets.clear~ + args.state.times_wrong = 0 # starts off with 0 wrong guesses +** Processing line: ~ args.state.game_over = false # the game is not over (because it has just been restarted)~ - Inside source: true *** True Line Result - state.bullets.clear -** Processing line: ~ end~ + args.state.game_over = false # the game is not over (because it has just been restarted) +** Processing line: ~ else # otherwise if neither of those buttons were pressed~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + else # otherwise if neither of those buttons were pressed +** Processing line: ~ args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_winner~ + args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played +** Processing line: ~ if button_clicked[:label] == args.state.target_note # if clicked note is target note~ - Inside source: true *** True Line Result - def calc_winner -** Processing line: ~ calc_kill_ships~ + if button_clicked[:label] == args.state.target_note # if clicked note is target note +** Processing line: ~ args.state.target_note = nil # target note is emptied~ - Inside source: true *** True Line Result - calc_kill_ships -** Processing line: ~ calc_score~ + args.state.target_note = nil # target note is emptied +** Processing line: ~~ - Inside source: true *** True Line Result - calc_score -** Processing line: ~ calc_reset_ships~ + +** Processing line: ~ if args.state.current_level < 9 # if game hasn't reached level 9~ - Inside source: true *** True Line Result - calc_reset_ships -** Processing line: ~ end~ + if args.state.current_level < 9 # if game hasn't reached level 9 +** Processing line: ~ args.state.current_level += 1 # game goes to next level~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.current_level += 1 # game goes to next level +** Processing line: ~ else # otherwise, if game has reached level 9~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + else # otherwise, if game has reached level 9 +** Processing line: ~ args.state.game_over = true # the game is over~ - Inside source: true *** True Line Result - -** Processing line: ~ $dueling_spaceship = DuelingSpaceships.new~ + args.state.game_over = true # the game is over +** Processing line: ~ end~ - Inside source: true *** True Line Result - $dueling_spaceship = DuelingSpaceships.new + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ -- Inside source: true -*** True Line Result - def tick args -** Processing line: ~ args.grid.origin_center!~ +** Processing line: ~ queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly~ - Inside source: true *** True Line Result - args.grid.origin_center! -** Processing line: ~ $dueling_spaceship.inputs = args.inputs~ + queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly +** Processing line: ~ else # otherwise, if clicked note is not target note~ - Inside source: true *** True Line Result - $dueling_spaceship.inputs = args.inputs -** Processing line: ~ $dueling_spaceship.outputs = args.outputs~ + else # otherwise, if clicked note is not target note +** Processing line: ~ args.state.times_wrong += 1 # increments times user guessed wrong~ - Inside source: true *** True Line Result - $dueling_spaceship.outputs = args.outputs -** Processing line: ~ $dueling_spaceship.state = args.state~ + args.state.times_wrong += 1 # increments times user guessed wrong +** Processing line: ~ queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong~ - Inside source: true *** True Line Result - $dueling_spaceship.state = args.state -** Processing line: ~ $dueling_spaceship.grid = args.grid~ + queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong +** Processing line: ~ end~ - Inside source: true *** True Line Result - $dueling_spaceship.grid = args.grid -** Processing line: ~ $dueling_spaceship.tick~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - $dueling_spaceship.tick + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -89952,1206 +96991,1194 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** arcade/flappy dragon/credits.txt~ -- Header detected. -*** True Line Result - -*** True Line Result -*** arcade/flappy dragon/credits.txt -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - -*** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt~ +** Processing line: ~ # Creates a collection of all of the available notes as symbols~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt -** Processing line: ~ code: Amir Rajan, https://twitter.com/amirrajan~ + # Creates a collection of all of the available notes as symbols +** Processing line: ~ def available_notes~ - Inside source: true *** True Line Result - code: Amir Rajan, https://twitter.com/amirrajan -** Processing line: ~ graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel~ + def available_notes +** Processing line: ~ [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]~ - Inside source: true *** True Line Result - graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel -** Processing line: ~~ + [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4] +** 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: ~*** arcade/flappy dragon/main.rb~ -- Header detected. +** Processing line: ~ # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.~ +- Inside source: true *** True Line Result - + # Creates buttons for each note, and sets a label (the note's name) and border for each note's button. +** Processing line: ~ def piano_button args, note, position~ +- Inside source: true *** True Line Result -*** arcade/flappy dragon/main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + def piano_button args, note, position +** Processing line: ~ args.state.new_entity(:button) do |b| # declares button as new entity~ +- Inside source: true *** True Line Result - + args.state.new_entity(:button) do |b| # declares button as new entity +** Processing line: ~ b.label = [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/flappy_dragon/app/main.rb~ + b.label = [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition +** Processing line: ~ b.border = { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/flappy_dragon/app/main.rb -** Processing line: ~ class FlappyDragon~ + b.border = { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border +** Processing line: ~ end~ - Inside source: true *** True Line Result - class FlappyDragon -** Processing line: ~ attr_accessor :grid, :inputs, :state, :outputs~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - attr_accessor :grid, :inputs, :state, :outputs + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick~ +** Processing line: ~ # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong +** Processing line: ~ # If a button is clicked, the inside of button is purple (see input_mouse method)~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render~ + # If a button is clicked, the inside of button is purple (see input_mouse method) +** Processing line: ~ # If correct note is clicked, screen turns green~ - Inside source: true *** True Line Result - render -** Processing line: ~ calc~ + # If correct note is clicked, screen turns green +** Processing line: ~ # If incorrect note is clicked, screen turns red (again, see input_mouse method)~ - Inside source: true *** True Line Result - calc -** Processing line: ~ process_inputs~ + # If incorrect note is clicked, screen turns red (again, see input_mouse method) +** Processing line: ~ def queue_click_feedback args, x, y, w, h, *color~ - Inside source: true *** True Line Result - process_inputs + def queue_click_feedback args, x, y, w, h, *color +** Processing line: ~ args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity~ +- Inside source: true +*** True Line Result + args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity +** Processing line: ~ c.solid = [x, y, w, h, *color, 255] # sets color~ +- Inside source: true +*** True Line Result + c.solid = [x, y, w, h, *color, 255] # sets color ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults~ +** Processing line: ~ def tick_instructions args, text, y = 715~ - Inside source: true *** True Line Result - def defaults -** Processing line: ~ state.flap_power = 11~ + def tick_instructions args, text, y = 715 +** Processing line: ~ return if args.state.key_event_occurred~ - Inside source: true *** True Line Result - state.flap_power = 11 -** Processing line: ~ state.gravity = 0.9~ + return if args.state.key_event_occurred +** Processing line: ~ if args.inputs.mouse.click ||~ - Inside source: true *** True Line Result - state.gravity = 0.9 -** Processing line: ~ state.ceiling = 600~ + if args.inputs.mouse.click || +** Processing line: ~ args.inputs.keyboard.directional_vector ||~ - Inside source: true *** True Line Result - state.ceiling = 600 -** Processing line: ~ state.ceiling_flap_power = 6~ + args.inputs.keyboard.directional_vector || +** Processing line: ~ args.inputs.keyboard.key_down.enter ||~ - Inside source: true *** True Line Result - state.ceiling_flap_power = 6 -** Processing line: ~ state.wall_countdown_length = 100~ + args.inputs.keyboard.key_down.enter || +** Processing line: ~ args.inputs.keyboard.key_down.escape~ - Inside source: true *** True Line Result - state.wall_countdown_length = 100 -** Processing line: ~ state.wall_gap_size = 100~ + args.inputs.keyboard.key_down.escape +** Processing line: ~ args.state.key_event_occurred = true~ - Inside source: true *** True Line Result - state.wall_gap_size = 100 -** Processing line: ~ state.wall_countdown ||= 0~ + args.state.key_event_occurred = true +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.wall_countdown ||= 0 -** Processing line: ~ state.hi_score ||= 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.hi_score ||= 0 -** Processing line: ~ state.score ||= 0~ + +** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ - Inside source: true *** True Line Result - state.score ||= 0 -** Processing line: ~ state.walls ||= []~ + args.outputs.debug << [0, y - 50, 1280, 60].solid +** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ - Inside source: true *** True Line Result - state.walls ||= [] -** Processing line: ~ state.x ||= 50~ + args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label +** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ - Inside source: true *** True Line Result - state.x ||= 50 -** Processing line: ~ state.y ||= 500~ + args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.y ||= 500 -** Processing line: ~ state.dy ||= 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.dy ||= 0 -** Processing line: ~ state.scene ||= :menu~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - state.scene ||= :menu -** Processing line: ~ state.scene_at ||= 0~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - state.scene_at ||= 0 -** Processing line: ~ state.difficulty ||= :normal~ -- Inside source: true + +** Processing line: ~*** Arcade - Twinstick - main.rb~ +- Header detected. *** True Line Result - state.difficulty ||= :normal -** Processing line: ~ state.new_difficulty ||= :normal~ -- Inside source: true + *** True Line Result - state.new_difficulty ||= :normal -** Processing line: ~ state.countdown ||= 4.seconds~ -- Inside source: true +*** Arcade - Twinstick - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - state.countdown ||= 4.seconds -** Processing line: ~ state.flash_at ||= 0~ + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_arcade/twinstick/app/main.rb~ - Inside source: true *** True Line Result - state.flash_at ||= 0 -** Processing line: ~ end~ + # ./samples/99_genre_arcade/twinstick/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def tick args +** Processing line: ~ args.state.player ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}~ - Inside source: true *** True Line Result - -** Processing line: ~ def render~ + args.state.player ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0} +** Processing line: ~ args.state.enemies ||= []~ - Inside source: true *** True Line Result - def render -** Processing line: ~ outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1~ + args.state.enemies ||= [] +** Processing line: ~ args.state.player_bullets ||= []~ - Inside source: true *** True Line Result - outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1 -** Processing line: ~ render_score~ + args.state.player_bullets ||= [] +** Processing line: ~ args.state.tick_count ||= -1~ - Inside source: true *** True Line Result - render_score -** Processing line: ~ render_menu~ + args.state.tick_count ||= -1 +** Processing line: ~ args.state.tick_count += 1~ - Inside source: true *** True Line Result - render_menu -** Processing line: ~ render_game~ + args.state.tick_count += 1 +** Processing line: ~ spawn_enemies args~ - Inside source: true *** True Line Result - render_game -** Processing line: ~ end~ + spawn_enemies args +** Processing line: ~ kill_enemies args~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + kill_enemies args +** Processing line: ~ move_enemies args~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_score~ + move_enemies args +** Processing line: ~ move_bullets args~ - Inside source: true *** True Line Result - def render_score -** Processing line: ~ outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label~ + move_bullets args +** Processing line: ~ move_player args~ - Inside source: true *** True Line Result - outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label -** Processing line: ~ outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label~ + move_player args +** Processing line: ~ fire_player args~ - Inside source: true *** True Line Result - outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label -** Processing line: ~ outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label~ + fire_player args +** Processing line: ~ args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)~ - Inside source: true *** True Line Result - outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label -** Processing line: ~ end~ + args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255) +** Processing line: ~ label_color = args.state.player[:health] <= 5 ? 255 : 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + label_color = args.state.player[:health] <= 5 ? 255 : 0 +** Processing line: ~ args.outputs.labels << [~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_menu~ + args.outputs.labels << [ +** Processing line: ~ {~ - Inside source: true *** True Line Result - def render_menu -** Processing line: ~ return unless state.scene == :menu~ + { +** Processing line: ~ x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",~ - Inside source: true *** True Line Result - return unless state.scene == :menu -** Processing line: ~ render_overlay~ + x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP", +** Processing line: ~ r: label_color, g: label_color, b: label_color~ - Inside source: true *** True Line Result - render_overlay -** Processing line: ~~ + r: label_color, g: label_color, b: label_color +** Processing line: ~ }, {~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]~ + }, { +** Processing line: ~ x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",~ - Inside source: true *** True Line Result - outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255] -** Processing line: ~ outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]~ + x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS", +** Processing line: ~ r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,~ - Inside source: true *** True Line Result - outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255] -** Processing line: ~ outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255]~ + r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length, +** Processing line: ~ }~ - Inside source: true *** True Line Result - outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255] -** Processing line: ~ outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255]~ + } +** Processing line: ~ ]~ - Inside source: true *** True Line Result - outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255] -** Processing line: ~ outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]~ + ] +** Processing line: ~ args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]~ - Inside source: true *** True Line Result - outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255] -** Processing line: ~ outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]~ + args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets] +** Processing line: ~ args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero~ - Inside source: true *** True Line Result - outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255] -** Processing line: ~ outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]~ + args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255]~ +** Processing line: ~ def spawn_enemies args~ - Inside source: true *** True Line Result - outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255] -** Processing line: ~ outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255]~ + def spawn_enemies args +** Processing line: ~ # Spawn enemies more frequently as the player's score increases.~ - Inside source: true *** True Line Result - outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255] -** Processing line: ~ outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255]~ + # Spawn enemies more frequently as the player's score increases. +** Processing line: ~ if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?~ - Inside source: true *** True Line Result - outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255] -** Processing line: ~ outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255]~ + if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero? +** Processing line: ~ theta = rand * Math::PI * 2~ - Inside source: true *** True Line Result - outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255] -** Processing line: ~ end~ + theta = rand * Math::PI * 2 +** Processing line: ~ args.state.enemies << {~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.enemies << { +** Processing line: ~ x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_overlay~ + x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png', +** Processing line: ~ r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor~ - Inside source: true *** True Line Result - def render_overlay -** Processing line: ~ outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid~ + r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor +** Processing line: ~ }~ - Inside source: true *** True Line Result - outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid + } ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_game~ +** Processing line: ~ def kill_enemies args~ - Inside source: true *** True Line Result - def render_game -** Processing line: ~ render_game_over~ + def kill_enemies args +** Processing line: ~ args.state.enemies.reject! do |enemy|~ - Inside source: true *** True Line Result - render_game_over -** Processing line: ~ render_background~ + args.state.enemies.reject! do |enemy| +** Processing line: ~ # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)~ - Inside source: true *** True Line Result - render_background -** Processing line: ~ render_walls~ + # Check if enemy and player are within 80 pixels of each other (i.e. overlapping) +** Processing line: ~ if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2~ - Inside source: true *** True Line Result - render_walls -** Processing line: ~ render_dragon~ + if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2 +** Processing line: ~ # Enemy is touching player. Kill enemy, and reduce player HP by 1.~ - Inside source: true *** True Line Result - render_dragon -** Processing line: ~ render_flash~ + # Enemy is touching player. Kill enemy, and reduce player HP by 1. +** Processing line: ~ args.state.player[:health] -= 1~ - Inside source: true *** True Line Result - render_flash -** Processing line: ~ end~ + args.state.player[:health] -= 1 +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ args.state.player_bullets.any? do |bullet|~ +- Inside source: true +*** True Line Result + args.state.player_bullets.any? do |bullet| +** Processing line: ~ # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)~ +- Inside source: true +*** True Line Result + # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping) +** Processing line: ~ if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2 +** Processing line: ~ # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_game_over~ + # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP +** Processing line: ~ args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0~ - Inside source: true *** True Line Result - def render_game_over -** Processing line: ~ return unless state.scene == :game~ + args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0 +** Processing line: ~ # Keep track of how many enemies have been killed by this particular bullet~ - Inside source: true *** True Line Result - return unless state.scene == :game -** Processing line: ~ outputs.labels << [638, 358, score_text, 20, 1]~ + # Keep track of how many enemies have been killed by this particular bullet +** Processing line: ~ bullet[:kills] += 1~ - Inside source: true *** True Line Result - outputs.labels << [638, 358, score_text, 20, 1] -** Processing line: ~ outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]~ + bullet[:kills] += 1 +** Processing line: ~ # Earn more points by killing multiple enemies with one shot.~ - Inside source: true *** True Line Result - outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255] -** Processing line: ~ outputs.labels << [638, 428, countdown_text, 20, 1]~ + # Earn more points by killing multiple enemies with one shot. +** Processing line: ~ args.state.player[:score] += bullet[:kills]~ - Inside source: true *** True Line Result - outputs.labels << [638, 428, countdown_text, 20, 1] -** Processing line: ~ outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]~ + args.state.player[:score] += bullet[:kills] +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255] -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_background~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def render_background -** Processing line: ~ outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png'] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ scroll_point_at = state.tick_count~ +** Processing line: ~ def move_enemies args~ - Inside source: true *** True Line Result - scroll_point_at = state.tick_count -** Processing line: ~ scroll_point_at = state.scene_at if state.scene == :menu~ + def move_enemies args +** Processing line: ~ args.state.enemies.each do |enemy|~ - Inside source: true *** True Line Result - scroll_point_at = state.scene_at if state.scene == :menu -** Processing line: ~ scroll_point_at = state.death_at if state.countdown > 0~ + args.state.enemies.each do |enemy| +** Processing line: ~ # Get the angle from the enemy to the player~ - Inside source: true *** True Line Result - scroll_point_at = state.death_at if state.countdown > 0 -** Processing line: ~ scroll_point_at ||= 0~ + # Get the angle from the enemy to the player +** Processing line: ~ theta = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)~ - Inside source: true *** True Line Result - scroll_point_at ||= 0 -** Processing line: ~~ + theta = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x) +** Processing line: ~ # Convert the angle to a vector pointing at the player~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png', 0.25)~ + # Convert the angle to a vector pointing at the player +** Processing line: ~ dx, dy = theta.to_degrees.vector 5~ - Inside source: true *** True Line Result - outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png', 0.25) -** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)~ + dx, dy = theta.to_degrees.vector 5 +** Processing line: ~ # Move the enemy towards thr player~ - Inside source: true *** True Line Result - outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50) -** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80)~ + # Move the enemy towards thr player +** Processing line: ~ enemy.x -= dx~ - Inside source: true *** True Line Result - outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80) + enemy.x -= dx +** Processing line: ~ enemy.y -= dy~ +- Inside source: true +*** True Line Result + enemy.y -= dy ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_walls~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def render_walls -** Processing line: ~ state.walls.each do |w|~ + +** Processing line: ~ def move_bullets args~ - Inside source: true *** True Line Result - state.walls.each do |w| -** Processing line: ~ w.sprites = [~ + def move_bullets args +** Processing line: ~ args.state.player_bullets.each do |bullet|~ - Inside source: true *** True Line Result - w.sprites = [ -** Processing line: ~ [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],~ + args.state.player_bullets.each do |bullet| +** Processing line: ~ # Move the bullets according to the bullet's velocity~ - Inside source: true *** True Line Result - [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180], -** Processing line: ~ [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0]~ + # Move the bullets according to the bullet's velocity +** Processing line: ~ bullet.x += bullet[:vx]~ - Inside source: true *** True Line Result - [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0] -** Processing line: ~ ]~ + bullet.x += bullet[:vx] +** Processing line: ~ bullet.y += bullet[:vy]~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + bullet.y += bullet[:vy] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ outputs.sprites << state.walls.map(&:sprites)~ + end +** Processing line: ~ args.state.player_bullets.reject! do |bullet|~ - Inside source: true *** True Line Result - outputs.sprites << state.walls.map(&:sprites) -** Processing line: ~ end~ + args.state.player_bullets.reject! do |bullet| +** Processing line: ~ # Despawn bullets that are outside the screen area~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Despawn bullets that are outside the screen area +** Processing line: ~ bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_dragon~ + bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740 +** Processing line: ~ end~ - Inside source: true *** True Line Result - def render_dragon -** Processing line: ~ state.show_death = true if state.countdown == 3.seconds~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.show_death = true if state.countdown == 3.seconds + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ render_debug_hitbox false~ +** Processing line: ~ def move_player args~ - Inside source: true *** True Line Result - render_debug_hitbox false -** Processing line: ~~ + def move_player args +** Processing line: ~ # Get the currently held direction.~ - Inside source: true *** True Line Result - -** Processing line: ~ if state.show_death == false || !state.death_at~ + # Get the currently held direction. +** Processing line: ~ dx, dy = move_directional_vector args~ - Inside source: true *** True Line Result - if state.show_death == false || !state.death_at -** Processing line: ~ animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at~ + dx, dy = move_directional_vector args +** Processing line: ~ # Take the weighted average of the old velocities and the desired velocities.~ - Inside source: true *** True Line Result - animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at -** Processing line: ~ sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"~ + # Take the weighted average of the old velocities and the desired velocities. +** Processing line: ~ # Since move_directional_vector returns values between -1 and 1,~ - Inside source: true *** True Line Result - sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png" -** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ + # Since move_directional_vector returns values between -1 and 1, +** Processing line: ~ # and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75~ - Inside source: true *** True Line Result - state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] -** Processing line: ~ else~ + # and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75 +** Processing line: ~ args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75~ - Inside source: true *** True Line Result - else -** Processing line: ~ sprite_name = "sprites/dragon_die.png"~ + args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75 +** Processing line: ~ args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75~ - Inside source: true *** True Line Result - sprite_name = "sprites/dragon_die.png" -** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ + args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75 +** Processing line: ~ # Move the player~ - Inside source: true *** True Line Result - state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] -** Processing line: ~ sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds~ + # Move the player +** Processing line: ~ args.state.player.x += args.state.player[:vx]~ - Inside source: true *** True Line Result - sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds -** Processing line: ~ state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1~ + args.state.player.x += args.state.player[:vx] +** Processing line: ~ args.state.player.y += args.state.player[:vy]~ - Inside source: true *** True Line Result - state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1 -** Processing line: ~ state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction~ + args.state.player.y += args.state.player[:vy] +** Processing line: ~ # If the player is about to go out of bounds, put them back in bounds.~ - Inside source: true *** True Line Result - state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction -** Processing line: ~ state.dragon_sprite.y += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)~ + # If the player is about to go out of bounds, put them back in bounds. +** Processing line: ~ args.state.player.x = args.state.player.x.clamp(0, 1201)~ - Inside source: true *** True Line Result - state.dragon_sprite.y += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6) -** Processing line: ~ end~ + args.state.player.x = args.state.player.x.clamp(0, 1201) +** Processing line: ~ args.state.player.y = args.state.player.y.clamp(0, 640)~ - Inside source: true *** True Line Result - end + args.state.player.y = args.state.player.y.clamp(0, 640) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.sprites << state.dragon_sprite~ +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.sprites << state.dragon_sprite -** Processing line: ~ end~ + +** Processing line: ~ def fire_player args~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def fire_player args +** Processing line: ~ # Reduce the firing cooldown each tick~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_debug_hitbox show~ + # Reduce the firing cooldown each tick +** Processing line: ~ args.state.player[:cooldown] -= 1~ - Inside source: true *** True Line Result - def render_debug_hitbox show -** Processing line: ~ return unless show~ + args.state.player[:cooldown] -= 1 +** Processing line: ~ # If the player is allowed to fire~ - Inside source: true *** True Line Result - return unless show -** Processing line: ~ outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite~ + # If the player is allowed to fire +** Processing line: ~ if args.state.player[:cooldown] <= 0~ - Inside source: true *** True Line Result - outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite -** Processing line: ~ outputs.borders << state.walls.flat_map do |w|~ + if args.state.player[:cooldown] <= 0 +** Processing line: ~ dx, dy = shoot_directional_vector args # Get the bullet velocity~ - Inside source: true *** True Line Result - outputs.borders << state.walls.flat_map do |w| -** Processing line: ~ w.sprites.map { |s| [s.rect, 255, 0, 0] }~ + dx, dy = shoot_directional_vector args # Get the bullet velocity +** Processing line: ~ return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.~ - Inside source: true *** True Line Result - w.sprites.map { |s| [s.rect, 255, 0, 0] } -** Processing line: ~ end~ + return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early. +** Processing line: ~ # Add a new bullet to the list of player bullets.~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Add a new bullet to the list of player bullets. +** Processing line: ~ args.state.player_bullets << {~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.player_bullets << { +** Processing line: ~ x: args.state.player.x + 30 + 40 * dx,~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_flash~ + x: args.state.player.x + 30 + 40 * dx, +** Processing line: ~ y: args.state.player.y + 30 + 40 * dy,~ - Inside source: true *** True Line Result - def render_flash -** Processing line: ~ return unless state.flash_at~ + y: args.state.player.y + 30 + 40 * dy, +** Processing line: ~ w: 20, h: 20,~ - Inside source: true *** True Line Result - return unless state.flash_at -** Processing line: ~~ + w: 20, h: 20, +** Processing line: ~ path: 'sprites/circle-white.png',~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.primitives << [grid.rect,~ + path: 'sprites/circle-white.png', +** Processing line: ~ r: 0, g: 0, b: 0,~ - Inside source: true *** True Line Result - outputs.primitives << [grid.rect, -** Processing line: ~ white,~ + r: 0, g: 0, b: 0, +** Processing line: ~ vx: 10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity~ - Inside source: true *** True Line Result - white, -** Processing line: ~ 255 * state.flash_at.ease(20, :flip)].solid~ + vx: 10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity +** Processing line: ~ kills: 0~ - Inside source: true *** True Line Result - 255 * state.flash_at.ease(20, :flip)].solid -** Processing line: ~~ + kills: 0 +** Processing line: ~ }~ - Inside source: true *** True Line Result - -** Processing line: ~ state.flash_at = 0 if state.flash_at.elapsed_time > 20~ + } +** Processing line: ~ args.state.player[:cooldown] = 30 # Reset the cooldown~ - Inside source: true *** True Line Result - state.flash_at = 0 if state.flash_at.elapsed_time > 20 + args.state.player[:cooldown] = 30 # Reset the cooldown ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc~ +** Processing line: ~ # Custom function for getting a directional vector just for movement using WASD~ - Inside source: true *** True Line Result - def calc -** Processing line: ~ return unless state.scene == :game~ + # Custom function for getting a directional vector just for movement using WASD +** Processing line: ~ def move_directional_vector args~ - Inside source: true *** True Line Result - return unless state.scene == :game -** Processing line: ~ reset_game if state.countdown == 1~ + def move_directional_vector args +** Processing line: ~ dx = 0~ - Inside source: true *** True Line Result - reset_game if state.countdown == 1 -** Processing line: ~ state.countdown -= 1 and return if state.countdown > 0~ + dx = 0 +** Processing line: ~ dx += 1 if args.inputs.keyboard.d~ - Inside source: true *** True Line Result - state.countdown -= 1 and return if state.countdown > 0 -** Processing line: ~ calc_walls~ + dx += 1 if args.inputs.keyboard.d +** Processing line: ~ dx -= 1 if args.inputs.keyboard.a~ - Inside source: true *** True Line Result - calc_walls -** Processing line: ~ calc_flap~ + dx -= 1 if args.inputs.keyboard.a +** Processing line: ~ dy = 0~ - Inside source: true *** True Line Result - calc_flap -** Processing line: ~ calc_game_over~ + dy = 0 +** Processing line: ~ dy += 1 if args.inputs.keyboard.w~ - Inside source: true *** True Line Result - calc_game_over -** Processing line: ~ end~ + dy += 1 if args.inputs.keyboard.w +** Processing line: ~ dy -= 1 if args.inputs.keyboard.s~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + dy -= 1 if args.inputs.keyboard.s +** Processing line: ~ if dx != 0 && dy != 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_walls~ + if dx != 0 && dy != 0 +** Processing line: ~ dx *= 0.7071~ - Inside source: true *** True Line Result - def calc_walls -** Processing line: ~ state.walls.each { |w| w.x -= 8 }~ + dx *= 0.7071 +** Processing line: ~ dy *= 0.7071~ - Inside source: true *** True Line Result - state.walls.each { |w| w.x -= 8 } -** Processing line: ~~ + dy *= 0.7071 +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ walls_count_before_removal = state.walls.length~ + end +** Processing line: ~ [dx, dy]~ - Inside source: true *** True Line Result - walls_count_before_removal = state.walls.length + [dx, dy] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.walls.reject! { |w| w.x < -100 }~ +** Processing line: ~ # Custom function for getting a directional vector just for shooting using the arrow keys~ - Inside source: true *** True Line Result - state.walls.reject! { |w| w.x < -100 } -** Processing line: ~~ + # Custom function for getting a directional vector just for shooting using the arrow keys +** Processing line: ~ def shoot_directional_vector args~ - Inside source: true *** True Line Result - -** Processing line: ~ state.score += 1 if state.walls.count < walls_count_before_removal~ + def shoot_directional_vector args +** Processing line: ~ dx = 0~ - Inside source: true *** True Line Result - state.score += 1 if state.walls.count < walls_count_before_removal -** Processing line: ~~ + dx = 0 +** Processing line: ~ dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right~ - Inside source: true *** True Line Result - -** Processing line: ~ state.wall_countdown -= 1 and return if state.wall_countdown > 0~ + dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right +** Processing line: ~ dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left~ - Inside source: true *** True Line Result - state.wall_countdown -= 1 and return if state.wall_countdown > 0 -** Processing line: ~~ + dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left +** Processing line: ~ dy = 0~ - Inside source: true *** True Line Result - -** Processing line: ~ state.walls << state.new_entity(:wall) do |w|~ + dy = 0 +** Processing line: ~ dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up~ - Inside source: true *** True Line Result - state.walls << state.new_entity(:wall) do |w| -** Processing line: ~ w.x = grid.right~ + dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up +** Processing line: ~ dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down~ - Inside source: true *** True Line Result - w.x = grid.right -** Processing line: ~ w.opening = grid.top~ + dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down +** Processing line: ~ if dx != 0 && dy != 0~ - Inside source: true *** True Line Result - w.opening = grid.top -** Processing line: ~ .randomize(:ratio)~ + if dx != 0 && dy != 0 +** Processing line: ~ dx *= 0.7071~ - Inside source: true *** True Line Result - .randomize(:ratio) -** Processing line: ~ .greater(200)~ + dx *= 0.7071 +** Processing line: ~ dy *= 0.7071~ - Inside source: true *** True Line Result - .greater(200) -** Processing line: ~ .lesser(520)~ + dy *= 0.7071 +** Processing line: ~ end~ - Inside source: true *** True Line Result - .lesser(520) -** Processing line: ~ w.bottom_height = w.opening - state.wall_gap_size~ + end +** Processing line: ~ [dx, dy]~ - Inside source: true *** True Line Result - w.bottom_height = w.opening - state.wall_gap_size -** Processing line: ~ w.top_y = w.opening + state.wall_gap_size~ + [dx, dy] +** Processing line: ~ end~ - Inside source: true *** True Line Result - w.top_y = w.opening + state.wall_gap_size -** Processing line: ~ end~ -- Inside source: true + end +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - end +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ state.wall_countdown = state.wall_countdown_length~ -- Inside source: true +** Processing line: ~*** Crafting - Craft Game Starting Point - main.rb~ +- Header detected. *** True Line Result - state.wall_countdown = state.wall_countdown_length -** Processing line: ~ end~ -- Inside source: true + *** True Line Result - end -** Processing line: ~~ -- Inside source: true +*** Crafting - Craft Game Starting Point - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result -** Processing line: ~ def calc_flap~ -- Inside source: true -*** True Line Result - def calc_flap -** Processing line: ~ state.y += state.dy~ -- Inside source: true *** True Line Result - state.y += state.dy -** Processing line: ~ state.dy = state.dy.lesser state.flap_power~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb~ - Inside source: true *** True Line Result - state.dy = state.dy.lesser state.flap_power -** Processing line: ~ state.dy -= state.gravity~ + # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb +** Processing line: ~ # ==================================================~ - Inside source: true *** True Line Result - state.dy -= state.gravity -** Processing line: ~ return if state.y < state.ceiling~ + # ================================================== +** Processing line: ~ # A NOTE TO JAM CRAFT PARTICIPANTS:~ - Inside source: true *** True Line Result - return if state.y < state.ceiling -** Processing line: ~ state.y = state.ceiling~ + # A NOTE TO JAM CRAFT PARTICIPANTS: +** Processing line: ~ # The comments and code in here are just as small piece of DragonRuby's capabilities.~ - Inside source: true *** True Line Result - state.y = state.ceiling -** Processing line: ~ state.dy = state.dy.lesser state.ceiling_flap_power~ + # The comments and code in here are just as small piece of DragonRuby's capabilities. +** Processing line: ~ # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!~ - Inside source: true *** True Line Result - state.dy = state.dy.lesser state.ceiling_flap_power -** Processing line: ~ end~ + # Be sure to check out the rest of the sample apps. Start with README.txt and go from there! +** Processing line: ~ # ==================================================~ - Inside source: true *** True Line Result - end + # ================================================== ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_game_over~ -- Inside source: true -*** True Line Result - def calc_game_over -** Processing line: ~ return unless game_over?~ -- Inside source: true -*** True Line Result - return unless game_over? -** Processing line: ~~ +** Processing line: ~ # def tick args is the entry point into your game. This function is called at~ - Inside source: true *** True Line Result - -** Processing line: ~ state.death_at = state.tick_count~ + # def tick args is the entry point into your game. This function is called at +** Processing line: ~ # a fixed update time of 60hz (60 fps).~ - Inside source: true *** True Line Result - state.death_at = state.tick_count -** Processing line: ~ state.death_from = state.walls.first~ + # a fixed update time of 60hz (60 fps). +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - state.death_from = state.walls.first -** Processing line: ~ state.death_fall_direction = -1~ + def tick args +** Processing line: ~ # The defaults function intitializes the game.~ - Inside source: true *** True Line Result - state.death_fall_direction = -1 -** Processing line: ~ state.death_fall_direction = 1 if state.x > state.death_from.x~ + # The defaults function intitializes the game. +** Processing line: ~ defaults args~ - Inside source: true *** True Line Result - state.death_fall_direction = 1 if state.x > state.death_from.x -** Processing line: ~ outputs.sounds << "sounds/hit-sound.wav"~ + defaults args +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.sounds << "sounds/hit-sound.wav" -** Processing line: ~ begin_countdown~ + +** Processing line: ~ # After the game is initialized, render it.~ - Inside source: true *** True Line Result - begin_countdown -** Processing line: ~ end~ + # After the game is initialized, render it. +** Processing line: ~ render args~ - Inside source: true *** True Line Result - end + render args ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def process_inputs~ -- Inside source: true -*** True Line Result - def process_inputs -** Processing line: ~ process_inputs_menu~ -- Inside source: true -*** True Line Result - process_inputs_menu -** Processing line: ~ process_inputs_game~ +** Processing line: ~ # After rendering the player should be able to respond to input.~ - Inside source: true *** True Line Result - process_inputs_game -** Processing line: ~ end~ + # After rendering the player should be able to respond to input. +** Processing line: ~ input args~ - Inside source: true *** True Line Result - end + input args ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def process_inputs_menu~ +** Processing line: ~ # After responding to input, the game performs any additional calculations.~ - Inside source: true *** True Line Result - def process_inputs_menu -** Processing line: ~ return unless state.scene == :menu~ + # After responding to input, the game performs any additional calculations. +** Processing line: ~ calc args~ - Inside source: true *** True Line Result - return unless state.scene == :menu + calc args +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select~ +** Processing line: ~ def defaults args~ - Inside source: true *** True Line Result - changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select -** Processing line: ~ if inputs.mouse.click~ + def defaults args +** Processing line: ~ # hide the mouse cursor for this game, we are going to render our own cursor~ - Inside source: true *** True Line Result - if inputs.mouse.click -** Processing line: ~ p = inputs.mouse.click.point~ + # hide the mouse cursor for this game, we are going to render our own cursor +** Processing line: ~ if args.state.tick_count == 0~ - Inside source: true *** True Line Result - p = inputs.mouse.click.point -** Processing line: ~ if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)~ + if args.state.tick_count == 0 +** Processing line: ~ args.gtk.hide_cursor~ - Inside source: true *** True Line Result - if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800) -** Processing line: ~ changediff = true~ + args.gtk.hide_cursor +** Processing line: ~ end~ - Inside source: true *** True Line Result - changediff = true -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ args.state.click_ripples ||= []~ - Inside source: true *** True Line Result - end + args.state.click_ripples ||= [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if changediff~ +** Processing line: ~ # everything is on a 1280x720 virtual canvas, so you can~ - Inside source: true *** True Line Result - if changediff -** Processing line: ~ case state.new_difficulty~ + # everything is on a 1280x720 virtual canvas, so you can +** Processing line: ~ # hardcode locations~ - Inside source: true *** True Line Result - case state.new_difficulty -** Processing line: ~ when :easy~ + # hardcode locations +** Processing line: ~~ - Inside source: true *** True Line Result - when :easy -** Processing line: ~ state.new_difficulty = :normal~ + +** Processing line: ~ # define the borders for where the inventory is located~ - Inside source: true *** True Line Result - state.new_difficulty = :normal -** Processing line: ~ when :normal~ + # define the borders for where the inventory is located +** Processing line: ~ # args.state is a data structure that accepts any arbitrary parameters~ - Inside source: true *** True Line Result - when :normal -** Processing line: ~ state.new_difficulty = :hard~ + # args.state is a data structure that accepts any arbitrary parameters +** Processing line: ~ # so you can create an object graph without having to create any classes.~ - Inside source: true *** True Line Result - state.new_difficulty = :hard -** Processing line: ~ when :hard~ + # so you can create an object graph without having to create any classes. +** Processing line: ~~ - Inside source: true *** True Line Result - when :hard -** Processing line: ~ state.new_difficulty = :flappy~ + +** Processing line: ~ # Bottom left is 0, 0. Top right is 1280, 720.~ - Inside source: true *** True Line Result - state.new_difficulty = :flappy -** Processing line: ~ when :flappy~ + # Bottom left is 0, 0. Top right is 1280, 720. +** Processing line: ~ # The inventory area is at the top of the screen~ - Inside source: true *** True Line Result - when :flappy -** Processing line: ~ state.new_difficulty = :easy~ + # The inventory area is at the top of the screen +** Processing line: ~ # the number 80 is the size of all the sprites, so that is what is being~ - Inside source: true *** True Line Result - state.new_difficulty = :easy -** Processing line: ~ end~ + # the number 80 is the size of all the sprites, so that is what is being +** Processing line: ~ # used to decide the with and height~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # used to decide the with and height +** Processing line: ~ args.state.sprite_size = 80~ - Inside source: true *** True Line Result - end + args.state.sprite_size = 80 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a~ -- Inside source: true -*** True Line Result - if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a -** Processing line: ~ state.difficulty = state.new_difficulty~ -- Inside source: true -*** True Line Result - state.difficulty = state.new_difficulty -** Processing line: ~ change_to_scene :game~ -- Inside source: true -*** True Line Result - change_to_scene :game -** Processing line: ~ reset_game false~ +** Processing line: ~ args.state.inventory_border.w = args.state.sprite_size * 10~ - Inside source: true *** True Line Result - reset_game false -** Processing line: ~ state.hi_score = 0~ + args.state.inventory_border.w = args.state.sprite_size * 10 +** Processing line: ~ args.state.inventory_border.h = args.state.sprite_size * 3~ - Inside source: true *** True Line Result - state.hi_score = 0 -** Processing line: ~ begin_countdown~ + args.state.inventory_border.h = args.state.sprite_size * 3 +** Processing line: ~ args.state.inventory_border.x = 10~ - Inside source: true *** True Line Result - begin_countdown -** Processing line: ~ end~ + args.state.inventory_border.x = 10 +** Processing line: ~ args.state.inventory_border.y = 710 - args.state.inventory_border.h~ - Inside source: true *** True Line Result - end + args.state.inventory_border.y = 710 - args.state.inventory_border.h ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b~ +** Processing line: ~ # define the borders for where the crafting area is located~ - Inside source: true *** True Line Result - if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b -** Processing line: ~ state.new_difficulty = state.difficulty~ + # define the borders for where the crafting area is located +** Processing line: ~ # the crafting area is below the inventory area~ - Inside source: true *** True Line Result - state.new_difficulty = state.difficulty -** Processing line: ~ change_to_scene :game~ + # the crafting area is below the inventory area +** Processing line: ~ # the number 80 is the size of all the sprites, so that is what is being~ - Inside source: true *** True Line Result - change_to_scene :game -** Processing line: ~ end~ + # the number 80 is the size of all the sprites, so that is what is being +** Processing line: ~ # used to decide the with and height~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # used to decide the with and height +** Processing line: ~ args.state.craft_border.x = 10~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.craft_border.x = 10 +** Processing line: ~ args.state.craft_border.y = 220~ - Inside source: true *** True Line Result - -** Processing line: ~ def process_inputs_game~ + args.state.craft_border.y = 220 +** Processing line: ~ args.state.craft_border.w = args.state.sprite_size * 3~ - Inside source: true *** True Line Result - def process_inputs_game -** Processing line: ~ return unless state.scene == :game~ + args.state.craft_border.w = args.state.sprite_size * 3 +** Processing line: ~ args.state.craft_border.h = args.state.sprite_size * 3~ - Inside source: true *** True Line Result - return unless state.scene == :game + args.state.craft_border.h = args.state.sprite_size * 3 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ clicked_menu = false~ +** Processing line: ~ # define the area where results are located~ - Inside source: true *** True Line Result - clicked_menu = false -** Processing line: ~ if inputs.mouse.click~ + # define the area where results are located +** Processing line: ~ # the crafting result is to the right of the craft area~ - Inside source: true *** True Line Result - if inputs.mouse.click -** Processing line: ~ p = inputs.mouse.click.point~ + # the crafting result is to the right of the craft area +** Processing line: ~ args.state.result_border.x = 10 + args.state.sprite_size * 3 + args.state.sprite_size~ - Inside source: true *** True Line Result - p = inputs.mouse.click.point -** Processing line: ~ clicked_menu = (p.y >= 620) && (p.x < 275)~ + args.state.result_border.x = 10 + args.state.sprite_size * 3 + args.state.sprite_size +** Processing line: ~ args.state.result_border.y = 220 + args.state.sprite_size~ - Inside source: true *** True Line Result - clicked_menu = (p.y >= 620) && (p.x < 275) -** Processing line: ~ end~ + args.state.result_border.y = 220 + args.state.sprite_size +** Processing line: ~ args.state.result_border.w = args.state.sprite_size~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.result_border.w = args.state.sprite_size +** Processing line: ~ args.state.result_border.h = args.state.sprite_size~ - Inside source: true *** True Line Result - -** Processing line: ~ if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start~ + args.state.result_border.h = args.state.sprite_size +** Processing line: ~~ - Inside source: true *** True Line Result - if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start -** Processing line: ~ change_to_scene :menu~ + +** Processing line: ~ # initialize items for the first time if they are nil~ - Inside source: true *** True Line Result - change_to_scene :menu -** Processing line: ~ elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0~ + # initialize items for the first time if they are nil +** Processing line: ~ # you start with 15 wood, 1 chest, and 5 plank~ - Inside source: true *** True Line Result - elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0 -** Processing line: ~ state.dy = 0~ + # you start with 15 wood, 1 chest, and 5 plank +** Processing line: ~ # Ruby has built in syntax for dictionaries (they look a lot like json objects).~ - Inside source: true *** True Line Result - state.dy = 0 -** Processing line: ~ state.dy += state.flap_power~ + # Ruby has built in syntax for dictionaries (they look a lot like json objects). +** Processing line: ~ # Ruby also has a special type called a Symbol denoted with a : followed by a word.~ - Inside source: true *** True Line Result - state.dy += state.flap_power -** Processing line: ~ state.flapped_at = state.tick_count~ + # Ruby also has a special type called a Symbol denoted with a : followed by a word. +** Processing line: ~ # Symbols are nice because they remove the need for magic strings.~ - Inside source: true *** True Line Result - state.flapped_at = state.tick_count -** Processing line: ~ outputs.sounds << "sounds/fly-sound.wav"~ + # Symbols are nice because they remove the need for magic strings. +** Processing line: ~ if !args.state.items~ - Inside source: true *** True Line Result - outputs.sounds << "sounds/fly-sound.wav" -** Processing line: ~ end~ + if !args.state.items +** Processing line: ~ args.state.items = [~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.items = [ +** Processing line: ~ {~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { +** Processing line: ~ id: :wood, # :wood is a Symbol, this is better than using "wood" for the id~ - Inside source: true *** True Line Result - -** Processing line: ~ def scrolling_background at, path, rate, y = 0~ + id: :wood, # :wood is a Symbol, this is better than using "wood" for the id +** Processing line: ~ quantity: 15,~ - Inside source: true *** True Line Result - def scrolling_background at, path, rate, y = 0 -** Processing line: ~ [~ + quantity: 15, +** Processing line: ~ path: 'sprites/wood.png',~ - Inside source: true *** True Line Result - [ -** Processing line: ~ [ 0 - at.*(rate) % 1440, y, 1440, 720, path],~ + path: 'sprites/wood.png', +** Processing line: ~ location: :inventory,~ - Inside source: true *** True Line Result - [ 0 - at.*(rate) % 1440, y, 1440, 720, path], -** Processing line: ~ [1440 - at.*(rate) % 1440, y, 1440, 720, path]~ + location: :inventory, +** Processing line: ~ ordinal_x: 0, ordinal_y: 0~ - Inside source: true *** True Line Result - [1440 - at.*(rate) % 1440, y, 1440, 720, path] -** Processing line: ~ ]~ + ordinal_x: 0, ordinal_y: 0 +** Processing line: ~ },~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + }, +** Processing line: ~ {~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { +** Processing line: ~ id: :chest,~ - Inside source: true *** True Line Result - -** Processing line: ~ def white~ + id: :chest, +** Processing line: ~ quantity: 1,~ - Inside source: true *** True Line Result - def white -** Processing line: ~ [255, 255, 255]~ + quantity: 1, +** Processing line: ~ path: 'sprites/chest.png',~ - Inside source: true *** True Line Result - [255, 255, 255] -** Processing line: ~ end~ + path: 'sprites/chest.png', +** Processing line: ~ location: :inventory,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + location: :inventory, +** Processing line: ~ ordinal_x: 1, ordinal_y: 0~ - Inside source: true *** True Line Result - -** Processing line: ~ def large_white_typeset~ + ordinal_x: 1, ordinal_y: 0 +** Processing line: ~ },~ - Inside source: true *** True Line Result - def large_white_typeset -** Processing line: ~ [5, 0, 255, 255, 255]~ + }, +** Processing line: ~ {~ - Inside source: true *** True Line Result - [5, 0, 255, 255, 255] -** Processing line: ~ end~ + { +** Processing line: ~ id: :plank,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + id: :plank, +** Processing line: ~ quantity: 5,~ - Inside source: true *** True Line Result - -** Processing line: ~ def at_beginning?~ + quantity: 5, +** Processing line: ~ path: 'sprites/plank.png',~ - Inside source: true *** True Line Result - def at_beginning? -** Processing line: ~ state.walls.count == 0~ + path: 'sprites/plank.png', +** Processing line: ~ location: :inventory,~ - Inside source: true *** True Line Result - state.walls.count == 0 -** Processing line: ~ end~ + location: :inventory, +** Processing line: ~ ordinal_x: 2, ordinal_y: 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + ordinal_x: 2, ordinal_y: 0 +** Processing line: ~ },~ - Inside source: true *** True Line Result - -** Processing line: ~ def dragon_collision_box~ + }, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - def dragon_collision_box -** Processing line: ~ state.dragon_sprite~ + ] +** Processing line: ~~ - Inside source: true *** True Line Result - state.dragon_sprite -** Processing line: ~ .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~ + +** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ - Inside source: true *** True Line Result - .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5) -** Processing line: ~ .rect_shift_right(10)~ + # after initializing the oridinal positions, derive the pixel +** Processing line: ~ # locations assuming that the width and height are 80~ - Inside source: true *** True Line Result - .rect_shift_right(10) -** Processing line: ~ .rect_shift_up(state.dy * 2)~ + # locations assuming that the width and height are 80 +** Processing line: ~ args.state.items.each { |item| set_inventory_position args, item }~ - Inside source: true *** True Line Result - .rect_shift_up(state.dy * 2) + args.state.items.each { |item| set_inventory_position args, item } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -91160,178 +98187,186 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def game_over?~ +** Processing line: ~ # define all the oridinal positions of the inventory slots~ - Inside source: true *** True Line Result - def game_over? -** Processing line: ~ return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?~ + # define all the oridinal positions of the inventory slots +** Processing line: ~ if !args.state.inventory_area~ - Inside source: true *** True Line Result - return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning? -** Processing line: ~~ + if !args.state.inventory_area +** Processing line: ~ args.state.inventory_area = [~ - Inside source: true *** True Line Result - -** Processing line: ~ state.walls~ + args.state.inventory_area = [ +** Processing line: ~ { ordinal_x: 0, ordinal_y: 0 },~ - Inside source: true *** True Line Result - state.walls -** Processing line: ~ .flat_map { |w| w.sprites }~ + { ordinal_x: 0, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 0 },~ - Inside source: true *** True Line Result - .flat_map { |w| w.sprites } -** Processing line: ~ .any? do |s|~ + { ordinal_x: 1, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 0 },~ - Inside source: true *** True Line Result - .any? do |s| -** Processing line: ~ s.intersect_rect?(dragon_collision_box)~ + { ordinal_x: 2, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 3, ordinal_y: 0 },~ - Inside source: true *** True Line Result - s.intersect_rect?(dragon_collision_box) -** Processing line: ~ end~ + { ordinal_x: 3, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 4, ordinal_y: 0 },~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + { ordinal_x: 4, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 5, ordinal_y: 0 },~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { ordinal_x: 5, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 6, ordinal_y: 0 },~ - Inside source: true *** True Line Result - -** Processing line: ~ def collision_forgiveness~ + { ordinal_x: 6, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 7, ordinal_y: 0 },~ - Inside source: true *** True Line Result - def collision_forgiveness -** Processing line: ~ case state.difficulty~ + { ordinal_x: 7, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 8, ordinal_y: 0 },~ - Inside source: true *** True Line Result - case state.difficulty -** Processing line: ~ when :easy~ + { ordinal_x: 8, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 9, ordinal_y: 0 },~ - Inside source: true *** True Line Result - when :easy -** Processing line: ~ 0.9~ + { ordinal_x: 9, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 0, ordinal_y: 1 },~ - Inside source: true *** True Line Result - 0.9 -** Processing line: ~ when :normal~ + { ordinal_x: 0, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 1 },~ - Inside source: true *** True Line Result - when :normal -** Processing line: ~ 0.7~ + { ordinal_x: 1, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 1 },~ - Inside source: true *** True Line Result - 0.7 -** Processing line: ~ when :hard~ + { ordinal_x: 2, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 3, ordinal_y: 1 },~ - Inside source: true *** True Line Result - when :hard -** Processing line: ~ 0.5~ + { ordinal_x: 3, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 4, ordinal_y: 1 },~ - Inside source: true *** True Line Result - 0.5 -** Processing line: ~ when :flappy~ + { ordinal_x: 4, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 5, ordinal_y: 1 },~ - Inside source: true *** True Line Result - when :flappy -** Processing line: ~ 0.3~ + { ordinal_x: 5, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 6, ordinal_y: 1 },~ - Inside source: true *** True Line Result - 0.3 -** Processing line: ~ else~ + { ordinal_x: 6, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 7, ordinal_y: 1 },~ - Inside source: true *** True Line Result - else -** Processing line: ~ 0.9~ + { ordinal_x: 7, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 8, ordinal_y: 1 },~ - Inside source: true *** True Line Result - 0.9 -** Processing line: ~ end~ + { ordinal_x: 8, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 9, ordinal_y: 1 },~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + { ordinal_x: 9, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 0, ordinal_y: 2 },~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { ordinal_x: 0, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 2 },~ - Inside source: true *** True Line Result - -** Processing line: ~ def countdown_text~ + { ordinal_x: 1, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 2 },~ - Inside source: true *** True Line Result - def countdown_text -** Processing line: ~ state.countdown ||= -1~ + { ordinal_x: 2, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 3, ordinal_y: 2 },~ - Inside source: true *** True Line Result - state.countdown ||= -1 -** Processing line: ~ return "" if state.countdown == 0~ + { ordinal_x: 3, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 4, ordinal_y: 2 },~ - Inside source: true *** True Line Result - return "" if state.countdown == 0 -** Processing line: ~ return "GO!" if state.countdown.idiv(60) == 0~ + { ordinal_x: 4, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 5, ordinal_y: 2 },~ - Inside source: true *** True Line Result - return "GO!" if state.countdown.idiv(60) == 0 -** Processing line: ~ return "GAME OVER" if state.death_at~ + { ordinal_x: 5, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 6, ordinal_y: 2 },~ - Inside source: true *** True Line Result - return "GAME OVER" if state.death_at -** Processing line: ~ return "READY?"~ + { ordinal_x: 6, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 7, ordinal_y: 2 },~ - Inside source: true *** True Line Result - return "READY?" -** Processing line: ~ end~ + { ordinal_x: 7, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 8, ordinal_y: 2 },~ - Inside source: true *** True Line Result - end + { ordinal_x: 8, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 9, ordinal_y: 2 },~ +- Inside source: true +*** True Line Result + { ordinal_x: 9, ordinal_y: 2 }, +** Processing line: ~ ]~ +- Inside source: true +*** True Line Result + ] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def begin_countdown~ +** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ - Inside source: true *** True Line Result - def begin_countdown -** Processing line: ~ state.countdown = 4.seconds~ + # after initializing the oridinal positions, derive the pixel +** Processing line: ~ # locations assuming that the width and height are 80~ - Inside source: true *** True Line Result - state.countdown = 4.seconds -** Processing line: ~ end~ + # locations assuming that the width and height are 80 +** Processing line: ~ args.state.inventory_area.each { |i| set_inventory_position args, i }~ - Inside source: true *** True Line Result - end + args.state.inventory_area.each { |i| set_inventory_position args, i } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def score_text~ +** Processing line: ~ # if you want to see the result you can use the Ruby function called "puts".~ - Inside source: true *** True Line Result - def score_text -** Processing line: ~ return "" unless state.countdown > 1.seconds~ + # if you want to see the result you can use the Ruby function called "puts". +** Processing line: ~ # Uncomment this line to see the value.~ - Inside source: true *** True Line Result - return "" unless state.countdown > 1.seconds -** Processing line: ~ return "" unless state.death_at~ + # Uncomment this line to see the value. +** Processing line: ~ # puts args.state.inventory_area~ - Inside source: true *** True Line Result - return "" unless state.death_at -** Processing line: ~ return "SCORE: 0 (LOL)" if state.score == 0~ + # puts args.state.inventory_area +** Processing line: ~~ - Inside source: true *** True Line Result - return "SCORE: 0 (LOL)" if state.score == 0 -** Processing line: ~ return "HI SCORE: #{state.score}" if state.score == state.hi_score~ + +** Processing line: ~ # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.~ - Inside source: true *** True Line Result - return "HI SCORE: #{state.score}" if state.score == state.hi_score -** Processing line: ~ return "SCORE: #{state.score}"~ + # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt. +** Processing line: ~ # To bring up DragonRuby's Console, press the ~ key within the game.~ - Inside source: true *** True Line Result - return "SCORE: #{state.score}" + # To bring up DragonRuby's Console, press the ~ key within the game. ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -91340,74 +98375,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def reset_game set_flash = true~ +** Processing line: ~ # define all the oridinal positions of the craft slots~ - Inside source: true *** True Line Result - def reset_game set_flash = true -** Processing line: ~ state.flash_at = state.tick_count if set_flash~ + # define all the oridinal positions of the craft slots +** Processing line: ~ if !args.state.craft_area~ - Inside source: true *** True Line Result - state.flash_at = state.tick_count if set_flash -** Processing line: ~ state.walls = []~ + if !args.state.craft_area +** Processing line: ~ args.state.craft_area = [~ - Inside source: true *** True Line Result - state.walls = [] -** Processing line: ~ state.y = 500~ + args.state.craft_area = [ +** Processing line: ~ { ordinal_x: 0, ordinal_y: 0 },~ - Inside source: true *** True Line Result - state.y = 500 -** Processing line: ~ state.dy = 0~ + { ordinal_x: 0, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 0, ordinal_y: 1 },~ - Inside source: true *** True Line Result - state.dy = 0 -** Processing line: ~ state.hi_score = state.hi_score.greater(state.score)~ + { ordinal_x: 0, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 0, ordinal_y: 2 },~ - Inside source: true *** True Line Result - state.hi_score = state.hi_score.greater(state.score) -** Processing line: ~ state.score = 0~ + { ordinal_x: 0, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 0 },~ - Inside source: true *** True Line Result - state.score = 0 -** Processing line: ~ state.wall_countdown = state.wall_countdown_length.fdiv(2)~ + { ordinal_x: 1, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 1 },~ - Inside source: true *** True Line Result - state.wall_countdown = state.wall_countdown_length.fdiv(2) -** Processing line: ~ state.show_death = false~ + { ordinal_x: 1, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 1, ordinal_y: 2 },~ - Inside source: true *** True Line Result - state.show_death = false -** Processing line: ~ state.death_at = nil~ + { ordinal_x: 1, ordinal_y: 2 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 0 },~ - Inside source: true *** True Line Result - state.death_at = nil -** Processing line: ~ end~ + { ordinal_x: 2, ordinal_y: 0 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 1 },~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { ordinal_x: 2, ordinal_y: 1 }, +** Processing line: ~ { ordinal_x: 2, ordinal_y: 2 },~ - Inside source: true *** True Line Result - -** Processing line: ~ def change_to_scene scene~ + { ordinal_x: 2, ordinal_y: 2 }, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - def change_to_scene scene -** Processing line: ~ state.scene = scene~ + ] +** Processing line: ~~ - Inside source: true *** True Line Result - state.scene = scene -** Processing line: ~ state.scene_at = state.tick_count~ + +** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ - Inside source: true *** True Line Result - state.scene_at = state.tick_count -** Processing line: ~ inputs.keyboard.clear~ + # after initializing the oridinal positions, derive the pixel +** Processing line: ~ # locations assuming that the width and height are 80~ - Inside source: true *** True Line Result - inputs.keyboard.clear -** Processing line: ~ inputs.controller_one.clear~ + # locations assuming that the width and height are 80 +** Processing line: ~ args.state.craft_area.each { |c| set_craft_position args, c }~ - Inside source: true *** True Line Result - inputs.controller_one.clear + args.state.craft_area.each { |c| set_craft_position args, c } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -91420,606 +98455,622 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ $flappy_dragon = FlappyDragon.new~ -- Inside source: true -*** True Line Result - $flappy_dragon = FlappyDragon.new ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $flappy_dragon.grid = args.grid~ + def render args +** Processing line: ~ # for the results area, create a sprite that show its boundaries~ - Inside source: true *** True Line Result - $flappy_dragon.grid = args.grid -** Processing line: ~ $flappy_dragon.inputs = args.inputs~ + # for the results area, create a sprite that show its boundaries +** Processing line: ~ args.outputs.primitives << { x: args.state.result_border.x,~ - Inside source: true *** True Line Result - $flappy_dragon.inputs = args.inputs -** Processing line: ~ $flappy_dragon.state = args.state~ + args.outputs.primitives << { x: args.state.result_border.x, +** Processing line: ~ y: args.state.result_border.y,~ - Inside source: true *** True Line Result - $flappy_dragon.state = args.state -** Processing line: ~ $flappy_dragon.outputs = args.outputs~ + y: args.state.result_border.y, +** Processing line: ~ w: args.state.result_border.w,~ - Inside source: true *** True Line Result - $flappy_dragon.outputs = args.outputs -** Processing line: ~ $flappy_dragon.tick~ + w: args.state.result_border.w, +** Processing line: ~ h: args.state.result_border.h,~ - Inside source: true *** True Line Result - $flappy_dragon.tick -** Processing line: ~ end~ + h: args.state.result_border.h, +** Processing line: ~ path: 'sprites/border-black.png' }~ - Inside source: true *** True Line Result - end + path: 'sprites/border-black.png' } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Arcade - Pong - main.rb~ -- Header detected. -*** True Line Result - +** Processing line: ~ # for each inventory spot, create a sprite~ +- Inside source: true *** True Line Result -*** Arcade - Pong - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # for each inventory spot, create a sprite +** Processing line: ~ # args.outputs.primitives is how DragonRuby performs a render.~ +- Inside source: true *** True Line Result - + # args.outputs.primitives is how DragonRuby performs a render. +** Processing line: ~ # Adding a single hash or multiple hashes to this array will tell~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/pong/app/main.rb~ + # Adding a single hash or multiple hashes to this array will tell +** Processing line: ~ # DragonRuby to render those primitives on that frame.~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/pong/app/main.rb -** Processing line: ~ def tick args~ + # DragonRuby to render those primitives on that frame. +** Processing line: ~~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ defaults args~ + +** Processing line: ~ # The .map function on Array is used instead of any kind of looping.~ - Inside source: true *** True Line Result - defaults args -** Processing line: ~ render args~ + # The .map function on Array is used instead of any kind of looping. +** Processing line: ~ # .map returns a new object for every object within an Array.~ - Inside source: true *** True Line Result - render args -** Processing line: ~ calc args~ + # .map returns a new object for every object within an Array. +** Processing line: ~ args.outputs.primitives << args.state.inventory_area.map do |a|~ - Inside source: true *** True Line Result - calc args -** Processing line: ~ input args~ + args.outputs.primitives << args.state.inventory_area.map do |a| +** Processing line: ~ { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~ - Inside source: true *** True Line Result - input args -** Processing line: ~ end~ + { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults args~ +** Processing line: ~ # for each craft spot, create a sprite~ - Inside source: true *** True Line Result - def defaults args -** Processing line: ~ args.state.ball.debounce ||= 3 * 60~ + # for each craft spot, create a sprite +** Processing line: ~ args.outputs.primitives << args.state.craft_area.map do |a|~ - Inside source: true *** True Line Result - args.state.ball.debounce ||= 3 * 60 -** Processing line: ~ args.state.ball.size ||= 10~ + args.outputs.primitives << args.state.craft_area.map do |a| +** Processing line: ~ { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~ - Inside source: true *** True Line Result - args.state.ball.size ||= 10 -** Processing line: ~ args.state.ball.size_half ||= args.state.ball.size / 2~ + { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.ball.size_half ||= args.state.ball.size / 2 -** Processing line: ~ args.state.ball.x ||= 640~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.ball.x ||= 640 -** Processing line: ~ args.state.ball.y ||= 360~ + +** Processing line: ~ # after the borders have been rendered, render the~ - Inside source: true *** True Line Result - args.state.ball.y ||= 360 -** Processing line: ~ args.state.ball.dx ||= 5.randomize(:sign)~ + # after the borders have been rendered, render the +** Processing line: ~ # items within those slots (and allow for highlighting)~ - Inside source: true *** True Line Result - args.state.ball.dx ||= 5.randomize(:sign) -** Processing line: ~ args.state.ball.dy ||= 5.randomize(:sign)~ + # items within those slots (and allow for highlighting) +** Processing line: ~ # if an item isn't currently being held~ - Inside source: true *** True Line Result - args.state.ball.dy ||= 5.randomize(:sign) -** Processing line: ~ args.state.left_paddle.y ||= 360~ + # if an item isn't currently being held +** Processing line: ~ allow_inventory_highlighting = !args.state.held_item~ - Inside source: true *** True Line Result - args.state.left_paddle.y ||= 360 -** Processing line: ~ args.state.right_paddle.y ||= 360~ + allow_inventory_highlighting = !args.state.held_item +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.right_paddle.y ||= 360 -** Processing line: ~ args.state.paddle.h ||= 120~ + +** Processing line: ~ # go through each item and render them~ - Inside source: true *** True Line Result - args.state.paddle.h ||= 120 -** Processing line: ~ args.state.paddle.w ||= 10~ + # go through each item and render them +** Processing line: ~ # use Array's find_all method to remove any items that are currently being held~ - Inside source: true *** True Line Result - args.state.paddle.w ||= 10 -** Processing line: ~ args.state.left_paddle.score ||= 0~ + # use Array's find_all method to remove any items that are currently being held +** Processing line: ~ args.state.items.find_all { |item| item[:location] != :held }.map do |item|~ - Inside source: true *** True Line Result - args.state.left_paddle.score ||= 0 -** Processing line: ~ args.state.right_paddle.score ||= 0~ + args.state.items.find_all { |item| item[:location] != :held }.map do |item| +** Processing line: ~ # if an item is currently being held, don't render it in it's spot within the~ - Inside source: true *** True Line Result - args.state.right_paddle.score ||= 0 -** Processing line: ~ end~ + # if an item is currently being held, don't render it in it's spot within the +** Processing line: ~ # inventory or craft area (this is handled via the find_all method).~ - Inside source: true *** True Line Result - end + # inventory or craft area (this is handled via the find_all method). ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render args~ +** Processing line: ~ # the item_prefab returns a hash containing all the visual components of an item.~ - Inside source: true *** True Line Result - def render args -** Processing line: ~ render_center_line args~ + # the item_prefab returns a hash containing all the visual components of an item. +** Processing line: ~ # the main sprite, the black background, the quantity text, and a hover indication~ - Inside source: true *** True Line Result - render_center_line args -** Processing line: ~ render_scores args~ + # the main sprite, the black background, the quantity text, and a hover indication +** Processing line: ~ # if the mouse is currently hovering over the item.~ - Inside source: true *** True Line Result - render_scores args -** Processing line: ~ render_countdown args~ + # if the mouse is currently hovering over the item. +** Processing line: ~ args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)~ - Inside source: true *** True Line Result - render_countdown args -** Processing line: ~ render_ball args~ + args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse) +** Processing line: ~ end~ - Inside source: true *** True Line Result - render_ball args -** Processing line: ~ render_paddles args~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - render_paddles args -** Processing line: ~ render_instructions args~ + +** Processing line: ~ # The last thing we want to render is the item currently being held.~ - Inside source: true *** True Line Result - render_instructions args -** Processing line: ~ end~ + # The last thing we want to render is the item currently being held. +** Processing line: ~ args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)~ - Inside source: true *** True Line Result - end + args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ begin :render_methods~ +** Processing line: ~ args.outputs.primitives << args.state.click_ripples~ - Inside source: true *** True Line Result - begin :render_methods -** Processing line: ~ def render_center_line args~ + args.outputs.primitives << args.state.click_ripples +** Processing line: ~~ - Inside source: true *** True Line Result - def render_center_line args -** Processing line: ~ args.outputs.lines << [640, 0, 640, 720]~ + +** Processing line: ~ # render a mouse cursor since we have the OS cursor hidden~ - Inside source: true *** True Line Result - args.outputs.lines << [640, 0, 640, 720] -** Processing line: ~ end~ + # render a mouse cursor since we have the OS cursor hidden +** Processing line: ~ args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~ - Inside source: true *** True Line Result - end + args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_scores args~ +** Processing line: ~ # Alrighty! This is where all the fun happens~ - Inside source: true *** True Line Result - def render_scores args -** Processing line: ~ args.outputs.labels << [~ + # Alrighty! This is where all the fun happens +** Processing line: ~ def input args~ - Inside source: true *** True Line Result - args.outputs.labels << [ -** Processing line: ~ [320, 650, args.state.left_paddle.score, 10, 1],~ + def input args +** Processing line: ~ # if the mouse is clicked and not item is currently being held~ - Inside source: true *** True Line Result - [320, 650, args.state.left_paddle.score, 10, 1], -** Processing line: ~ [960, 650, args.state.right_paddle.score, 10, 1]~ + # if the mouse is clicked and not item is currently being held +** Processing line: ~ # args.state.held_item is nil when the game starts.~ - Inside source: true *** True Line Result - [960, 650, args.state.right_paddle.score, 10, 1] -** Processing line: ~ ]~ + # args.state.held_item is nil when the game starts. +** Processing line: ~ # If the player clicks, the property args.inputs.mouse.click will~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + # If the player clicks, the property args.inputs.mouse.click will +** Processing line: ~ # be a non nil value, we don't want to process any of the code here~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # be a non nil value, we don't want to process any of the code here +** Processing line: ~ # if the mouse hasn't been clicked~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_countdown args~ + # if the mouse hasn't been clicked +** Processing line: ~ return if !args.inputs.mouse.click~ - Inside source: true *** True Line Result - def render_countdown args -** Processing line: ~ return unless args.state.ball.debounce > 0~ + return if !args.inputs.mouse.click +** Processing line: ~~ - Inside source: true *** True Line Result - return unless args.state.ball.debounce > 0 -** Processing line: ~ args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]~ + +** Processing line: ~ # if a click occurred, add a ripple to the ripple queue~ - Inside source: true *** True Line Result - args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1] -** Processing line: ~ end~ + # if a click occurred, add a ripple to the ripple queue +** Processing line: ~ args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~ - Inside source: true *** True Line Result - end + args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_ball args~ +** Processing line: ~ # if the mouse has been clicked, and no item is currently held...~ - Inside source: true *** True Line Result - def render_ball args -** Processing line: ~ args.outputs.solids << solid_ball(args)~ + # if the mouse has been clicked, and no item is currently held... +** Processing line: ~ if !args.state.held_item~ - Inside source: true *** True Line Result - args.outputs.solids << solid_ball(args) -** Processing line: ~ end~ + if !args.state.held_item +** Processing line: ~ # see if any of the items intersect the pointer using the inside_rect? method~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # see if any of the items intersect the pointer using the inside_rect? method +** Processing line: ~ # the find method will either return the first object that returns true~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_paddles args~ + # the find method will either return the first object that returns true +** Processing line: ~ # for the match clause, or it'll return nil if nothing matches the match clause~ - Inside source: true *** True Line Result - def render_paddles args -** Processing line: ~ args.outputs.solids << solid_left_paddle(args)~ + # for the match clause, or it'll return nil if nothing matches the match clause +** Processing line: ~ found = args.state.items.find do |item|~ - Inside source: true *** True Line Result - args.outputs.solids << solid_left_paddle(args) -** Processing line: ~ args.outputs.solids << solid_right_paddle(args)~ + found = args.state.items.find do |item| +** Processing line: ~ # for each item in args.state.items, run the following boolean check~ - Inside source: true *** True Line Result - args.outputs.solids << solid_right_paddle(args) -** Processing line: ~ end~ + # for each item in args.state.items, run the following boolean check +** Processing line: ~ args.inputs.mouse.click.point.inside_rect?(item)~ - Inside source: true *** True Line Result - end + args.inputs.mouse.click.point.inside_rect?(item) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_instructions args~ +** Processing line: ~ # if an item intersects the mouse pointer, then set the item's location to :held and~ - Inside source: true *** True Line Result - def render_instructions args -** Processing line: ~ args.outputs.labels << [320, 30, "W and S keys to move left paddle.", 0, 1]~ + # if an item intersects the mouse pointer, then set the item's location to :held and +** Processing line: ~ # set args.state.held_item to the item for later reference~ - Inside source: true *** True Line Result - args.outputs.labels << [320, 30, "W and S keys to move left paddle.", 0, 1] -** Processing line: ~ args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]~ + # set args.state.held_item to the item for later reference +** Processing line: ~ if found~ - Inside source: true *** True Line Result - args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1] -** Processing line: ~ end~ + if found +** Processing line: ~ args.state.held_item = found~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.held_item = found +** Processing line: ~ found[:location] = :held~ - Inside source: true *** True Line Result - end + found[:location] = :held +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc args~ +** Processing line: ~ # if the mouse is clicked and an item is currently beign held....~ - Inside source: true *** True Line Result - def calc args -** Processing line: ~ args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0~ + # if the mouse is clicked and an item is currently beign held.... +** Processing line: ~ elsif args.state.held_item~ - Inside source: true *** True Line Result - args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0 -** Processing line: ~ calc_move_ball args~ + elsif args.state.held_item +** Processing line: ~ # determine if a slot within the craft area was clicked~ - Inside source: true *** True Line Result - calc_move_ball args -** Processing line: ~ calc_collision_with_left_paddle args~ + # determine if a slot within the craft area was clicked +** Processing line: ~ craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~ - Inside source: true *** True Line Result - calc_collision_with_left_paddle args -** Processing line: ~ calc_collision_with_right_paddle args~ + craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a } +** Processing line: ~~ - Inside source: true *** True Line Result - calc_collision_with_right_paddle args -** Processing line: ~ calc_collision_with_walls args~ + +** Processing line: ~ # also determine if a slot within the inventory area was clicked~ - Inside source: true *** True Line Result - calc_collision_with_walls args -** Processing line: ~ end~ + # also determine if a slot within the inventory area was clicked +** Processing line: ~ inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~ - Inside source: true *** True Line Result - end + inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ begin :calc_methods~ +** Processing line: ~ # if the click was within a craft area~ - Inside source: true *** True Line Result - begin :calc_methods -** Processing line: ~ def calc_move_ball args~ + # if the click was within a craft area +** Processing line: ~ if craft_area~ - Inside source: true *** True Line Result - def calc_move_ball args -** Processing line: ~ args.state.ball.x += args.state.ball.dx~ + if craft_area +** Processing line: ~ # check to see if an item is already there and ignore the click if an item is found~ - Inside source: true *** True Line Result - args.state.ball.x += args.state.ball.dx -** Processing line: ~ args.state.ball.y += args.state.ball.dy~ + # check to see if an item is already there and ignore the click if an item is found +** Processing line: ~ # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal~ - Inside source: true *** True Line Result - args.state.ball.y += args.state.ball.dy -** Processing line: ~ end~ + # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal +** Processing line: ~ # position~ - Inside source: true *** True Line Result - end + # position +** Processing line: ~ item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]~ +- Inside source: true +*** True Line Result + item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_collision_with_left_paddle args~ +** Processing line: ~ # if an item *doesn't* exist in the craft area~ - Inside source: true *** True Line Result - def calc_collision_with_left_paddle args -** Processing line: ~ if solid_left_paddle(args).intersect_rect? solid_ball(args)~ + # if an item *doesn't* exist in the craft area +** Processing line: ~ if !item_already_there~ - Inside source: true *** True Line Result - if solid_left_paddle(args).intersect_rect? solid_ball(args) -** Processing line: ~ args.state.ball.dx *= -1~ + if !item_already_there +** Processing line: ~ # if the quantity they are currently holding is greater than 1~ - Inside source: true *** True Line Result - args.state.ball.dx *= -1 -** Processing line: ~ elsif args.state.ball.x < 0~ + # if the quantity they are currently holding is greater than 1 +** Processing line: ~ if args.state.held_item[:quantity] > 1~ - Inside source: true *** True Line Result - elsif args.state.ball.x < 0 -** Processing line: ~ args.state.right_paddle.score += 1~ + if args.state.held_item[:quantity] > 1 +** Processing line: ~ # remove one item (creating a seperate item of the same type), and place it~ - Inside source: true *** True Line Result - args.state.right_paddle.score += 1 -** Processing line: ~ calc_reset_round args~ + # remove one item (creating a seperate item of the same type), and place it +** Processing line: ~ # at the oridinal position and location of the craft area~ - Inside source: true *** True Line Result - calc_reset_round args -** Processing line: ~ end~ + # at the oridinal position and location of the craft area +** Processing line: ~ # the .merge method on Hash creates a new Hash, but updates any values~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # the .merge method on Hash creates a new Hash, but updates any values +** Processing line: ~ # passed as arguments to merge~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # passed as arguments to merge +** Processing line: ~ new_item = args.state.held_item.merge(quantity: 1,~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_collision_with_right_paddle args~ + new_item = args.state.held_item.merge(quantity: 1, +** Processing line: ~ location: :craft,~ - Inside source: true *** True Line Result - def calc_collision_with_right_paddle args -** Processing line: ~ if solid_right_paddle(args).intersect_rect? solid_ball(args)~ + location: :craft, +** Processing line: ~ ordinal_x: craft_area[:ordinal_x],~ - Inside source: true *** True Line Result - if solid_right_paddle(args).intersect_rect? solid_ball(args) -** Processing line: ~ args.state.ball.dx *= -1~ + ordinal_x: craft_area[:ordinal_x], +** Processing line: ~ ordinal_y: craft_area[:ordinal_y])~ - Inside source: true *** True Line Result - args.state.ball.dx *= -1 -** Processing line: ~ elsif args.state.ball.x > 1280~ + ordinal_y: craft_area[:ordinal_y]) +** Processing line: ~~ - Inside source: true *** True Line Result - elsif args.state.ball.x > 1280 -** Processing line: ~ args.state.left_paddle.score += 1~ + +** Processing line: ~ # after the item is crated, place it into the args.state.items collection~ - Inside source: true *** True Line Result - args.state.left_paddle.score += 1 -** Processing line: ~ calc_reset_round args~ + # after the item is crated, place it into the args.state.items collection +** Processing line: ~ args.state.items << new_item~ - Inside source: true *** True Line Result - calc_reset_round args -** Processing line: ~ end~ + args.state.items << new_item +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ # then subtract one from the held item~ - Inside source: true *** True Line Result - end + # then subtract one from the held item +** Processing line: ~ args.state.held_item[:quantity] -= 1~ +- Inside source: true +*** True Line Result + args.state.held_item[:quantity] -= 1 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_collision_with_walls args~ +** Processing line: ~ # if the craft area is available and there is only one item being held~ - Inside source: true *** True Line Result - def calc_collision_with_walls args -** Processing line: ~ if args.state.ball.y + args.state.ball.size_half > 720~ + # if the craft area is available and there is only one item being held +** Processing line: ~ elsif args.state.held_item[:quantity] == 1~ - Inside source: true *** True Line Result - if args.state.ball.y + args.state.ball.size_half > 720 -** Processing line: ~ args.state.ball.y = 720 - args.state.ball.size_half~ + elsif args.state.held_item[:quantity] == 1 +** Processing line: ~ # instead of creating any new items just set the location of the held item~ - Inside source: true *** True Line Result - args.state.ball.y = 720 - args.state.ball.size_half -** Processing line: ~ args.state.ball.dy *= -1~ + # instead of creating any new items just set the location of the held item +** Processing line: ~ # to the oridinal position of the craft area, and then nil out the~ - Inside source: true *** True Line Result - args.state.ball.dy *= -1 -** Processing line: ~ elsif args.state.ball.y - args.state.ball.size_half < 0~ + # to the oridinal position of the craft area, and then nil out the +** Processing line: ~ # held item state so that a new item can be picked up~ - Inside source: true *** True Line Result - elsif args.state.ball.y - args.state.ball.size_half < 0 -** Processing line: ~ args.state.ball.y = args.state.ball.size_half~ + # held item state so that a new item can be picked up +** Processing line: ~ args.state.held_item[:location] = :craft~ - Inside source: true *** True Line Result - args.state.ball.y = args.state.ball.size_half -** Processing line: ~ args.state.ball.dy *= -1~ + args.state.held_item[:location] = :craft +** Processing line: ~ args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]~ - Inside source: true *** True Line Result - args.state.ball.dy *= -1 -** Processing line: ~ end~ + args.state.held_item[:ordinal_x] = craft_area[:ordinal_x] +** Processing line: ~ args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.held_item[:ordinal_y] = craft_area[:ordinal_y] +** Processing line: ~ args.state.held_item = nil~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.held_item = nil +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_reset_round args~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def calc_reset_round args -** Processing line: ~ args.state.ball.x = 640~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.ball.x = 640 -** Processing line: ~ args.state.ball.y = 360~ + +** Processing line: ~ # if the selected area is an inventory area (as opposed to within the craft area)~ - Inside source: true *** True Line Result - args.state.ball.y = 360 -** Processing line: ~ args.state.ball.dx = 5.randomize(:sign)~ + # if the selected area is an inventory area (as opposed to within the craft area) +** Processing line: ~ elsif inventory_area~ - Inside source: true *** True Line Result - args.state.ball.dx = 5.randomize(:sign) -** Processing line: ~ args.state.ball.dy = 5.randomize(:sign)~ + elsif inventory_area +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.ball.dy = 5.randomize(:sign) -** Processing line: ~ args.state.ball.debounce = 3 * 60~ + +** Processing line: ~ # check to see if there is already an item in that inventory slot~ - Inside source: true *** True Line Result - args.state.ball.debounce = 3 * 60 -** Processing line: ~ end~ + # check to see if there is already an item in that inventory slot +** Processing line: ~ # the item_at_inventory_slot helper method returns an item or nil~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # the item_at_inventory_slot helper method returns an item or nil +** Processing line: ~ item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]~ - Inside source: true *** True Line Result - end + item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def input args~ +** Processing line: ~ # if there is already an item there, and the item types/id match~ - Inside source: true *** True Line Result - def input args -** Processing line: ~ input_left_paddle args~ + # if there is already an item there, and the item types/id match +** Processing line: ~ if item_already_there && item_already_there[:id] == args.state.held_item[:id]~ - Inside source: true *** True Line Result - input_left_paddle args -** Processing line: ~ input_right_paddle args~ + if item_already_there && item_already_there[:id] == args.state.held_item[:id] +** Processing line: ~ # then merge the item quantities~ - Inside source: true *** True Line Result - input_right_paddle args -** Processing line: ~ end~ + # then merge the item quantities +** Processing line: ~ held_quantity = args.state.held_item[:quantity]~ - Inside source: true *** True Line Result - end + held_quantity = args.state.held_item[:quantity] +** Processing line: ~ item_already_there[:quantity] += held_quantity~ +- Inside source: true +*** True Line Result + item_already_there[:quantity] += held_quantity ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ begin :input_methods~ +** Processing line: ~ # remove the item being held from the items collection (since it's quantity is now 0)~ - Inside source: true *** True Line Result - begin :input_methods -** Processing line: ~ def input_left_paddle args~ + # remove the item being held from the items collection (since it's quantity is now 0) +** Processing line: ~ args.state.items.reject! { |i| i[:location] == :held }~ - Inside source: true *** True Line Result - def input_left_paddle args -** Processing line: ~ if args.inputs.controller_one.key_down.down || args.inputs.keyboard.key_down.s~ + args.state.items.reject! { |i| i[:location] == :held } +** Processing line: ~~ - Inside source: true *** True Line Result - if args.inputs.controller_one.key_down.down || args.inputs.keyboard.key_down.s -** Processing line: ~ args.state.left_paddle.y -= 40~ + +** Processing line: ~ # nil out the held_item so a new item can be picked up~ - Inside source: true *** True Line Result - args.state.left_paddle.y -= 40 -** Processing line: ~ elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w~ + # nil out the held_item so a new item can be picked up +** Processing line: ~ args.state.held_item = nil~ - Inside source: true *** True Line Result - elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w -** Processing line: ~ args.state.left_paddle.y += 40~ + args.state.held_item = nil +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.left_paddle.y += 40 -** Processing line: ~ end~ + +** Processing line: ~ # if there currently isn't an item there, then put the held item in the slot~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # if there currently isn't an item there, then put the held item in the slot +** Processing line: ~ elsif !item_already_there~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif !item_already_there +** Processing line: ~ args.state.held_item[:location] = :inventory~ - Inside source: true *** True Line Result - -** Processing line: ~ def input_right_paddle args~ + args.state.held_item[:location] = :inventory +** Processing line: ~ args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]~ - Inside source: true *** True Line Result - def input_right_paddle args -** Processing line: ~ if args.inputs.controller_two.key_down.down || args.inputs.keyboard.key_down.l~ + args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x] +** Processing line: ~ args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]~ - Inside source: true *** True Line Result - if args.inputs.controller_two.key_down.down || args.inputs.keyboard.key_down.l -** Processing line: ~ args.state.right_paddle.y -= 40~ + args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y] +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.right_paddle.y -= 40 -** Processing line: ~ elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o~ + +** Processing line: ~ # nil out the held_item so a new item can be picked up~ - Inside source: true *** True Line Result - elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o -** Processing line: ~ args.state.right_paddle.y += 40~ + # nil out the held_item so a new item can be picked up +** Processing line: ~ args.state.held_item = nil~ - Inside source: true *** True Line Result - args.state.right_paddle.y += 40 + args.state.held_item = nil +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -92036,66 +99087,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ begin :assets~ +** Processing line: ~ # the calc method is executed after input~ - Inside source: true *** True Line Result - begin :assets -** Processing line: ~ def solid_ball args~ + # the calc method is executed after input +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - def solid_ball args -** Processing line: ~ centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size~ + def calc args +** Processing line: ~ # make sure that the real position of the inventory~ - Inside source: true *** True Line Result - centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size -** Processing line: ~ end~ + # make sure that the real position of the inventory +** Processing line: ~ # items are updated every frame to ensure that they~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # items are updated every frame to ensure that they +** Processing line: ~ # are placed correctly given their location and oridinal positions~ - Inside source: true *** True Line Result - -** Processing line: ~ def solid_left_paddle args~ + # are placed correctly given their location and oridinal positions +** Processing line: ~ # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)~ - Inside source: true *** True Line Result - def solid_left_paddle args -** Processing line: ~ centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h~ + # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place) +** Processing line: ~ args.state.items.each do |item|~ - Inside source: true *** True Line Result - centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h -** Processing line: ~ end~ + args.state.items.each do |item| +** Processing line: ~ # based on the location of the item, invoke the correct pixel conversion method~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # based on the location of the item, invoke the correct pixel conversion method +** Processing line: ~ if item[:location] == :inventory~ - Inside source: true *** True Line Result - -** Processing line: ~ def solid_right_paddle args~ + if item[:location] == :inventory +** Processing line: ~ set_inventory_position args, item~ - Inside source: true *** True Line Result - def solid_right_paddle args -** Processing line: ~ centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h~ + set_inventory_position args, item +** Processing line: ~ elsif item[:location] == :craft~ - Inside source: true *** True Line Result - centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h -** Processing line: ~ end~ + elsif item[:location] == :craft +** Processing line: ~ set_craft_position args, item~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + set_craft_position args, item +** Processing line: ~ elsif item[:location] == :held~ - Inside source: true *** True Line Result - -** Processing line: ~ def centered_rect x, y, w, h~ + elsif item[:location] == :held +** Processing line: ~ # if the item is held, center the item around the mouse pointer~ - Inside source: true *** True Line Result - def centered_rect x, y, w, h -** Processing line: ~ [x - w / 2, y - h / 2, w, h]~ + # if the item is held, center the item around the mouse pointer +** Processing line: ~ args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half~ - Inside source: true *** True Line Result - [x - w / 2, y - h / 2, w, h] + args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half +** Processing line: ~ args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half~ +- Inside source: true +*** True Line Result + args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -92104,270 +99163,270 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def centered_rect_vertically x, y, w, h~ +** Processing line: ~ # for each hash/sprite in the click ripples queue,~ - Inside source: true *** True Line Result - def centered_rect_vertically x, y, w, h -** Processing line: ~ [x, y - h / 2, w, h]~ + # for each hash/sprite in the click ripples queue, +** Processing line: ~ # expand its size by 20 percent and decrease its alpha~ - Inside source: true *** True Line Result - [x, y - h / 2, w, h] -** Processing line: ~ end~ + # expand its size by 20 percent and decrease its alpha +** Processing line: ~ # by 10.~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # by 10. +** Processing line: ~ args.state.click_ripples.each do |ripple|~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.click_ripples.each do |ripple| +** Processing line: ~ delta_w = ripple.w * 1.2 - ripple.w~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Arcade - Snakemoji - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Arcade - Snakemoji - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - + delta_w = ripple.w * 1.2 - ripple.w +** Processing line: ~ delta_h = ripple.h * 1.2 - ripple.h~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/snakemoji/app/main.rb~ + delta_h = ripple.h * 1.2 - ripple.h +** Processing line: ~ ripple.x -= delta_w.half~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/snakemoji/app/main.rb -** Processing line: ~ # coding: utf-8~ + ripple.x -= delta_w.half +** Processing line: ~ ripple.y -= delta_h.half~ - Inside source: true *** True Line Result - # coding: utf-8 -** Processing line: ~ ################################~ + ripple.y -= delta_h.half +** Processing line: ~ ripple.w += delta_w~ - Inside source: true *** True Line Result - ################################ -** Processing line: ~ # So I was working on a snake game while~ + ripple.w += delta_w +** Processing line: ~ ripple.h += delta_h~ - Inside source: true *** True Line Result - # So I was working on a snake game while -** Processing line: ~ # learning DragonRuby, and at some point I had a thought~ + ripple.h += delta_h +** Processing line: ~ ripple.a -= 10~ - Inside source: true *** True Line Result - # learning DragonRuby, and at some point I had a thought -** Processing line: ~ # what if I use "😀" as a function name, surely it wont work right...?~ + ripple.a -= 10 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # what if I use "😀" as a function name, surely it wont work right...? -** Processing line: ~ # RIGHT....?~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # RIGHT....? -** Processing line: ~ # BUT IT DID, IT WORKED~ + +** Processing line: ~ # remove any items from the collection where the alpha value is less than equal to~ - Inside source: true *** True Line Result - # BUT IT DID, IT WORKED -** Processing line: ~ # it all went downhill from then~ + # remove any items from the collection where the alpha value is less than equal to +** Processing line: ~ # zero using the reject! method (reject with an exclamation point at the end changes the~ - Inside source: true *** True Line Result - # it all went downhill from then -** Processing line: ~ # Created by Anton K. (ai Doge)~ + # zero using the reject! method (reject with an exclamation point at the end changes the +** Processing line: ~ # array value in place, while reject without the exclamation point returns a new array).~ - Inside source: true *** True Line Result - # Created by Anton K. (ai Doge) -** Processing line: ~ # https://gist.github.com/scorp200~ + # array value in place, while reject without the exclamation point returns a new array). +** Processing line: ~ args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }~ - Inside source: true *** True Line Result - # https://gist.github.com/scorp200 -** Processing line: ~ #############LICENSE############~ + args.state.click_ripples.reject! { |ripple| ripple.a <= 0 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - #############LICENSE############ -** Processing line: ~ # Feel free to use this anywhere and however you want~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Feel free to use this anywhere and however you want -** Processing line: ~ # You can sell this to EA for $1,000,000 if you want, its completely free.~ + +** Processing line: ~ # helper function for finding an item at a craft slot~ - Inside source: true *** True Line Result - # You can sell this to EA for $1,000,000 if you want, its completely free. -** Processing line: ~ # Just rememeber you are helping this... thing... to spread...~ + # helper function for finding an item at a craft slot +** Processing line: ~ def item_at_craft_slot args, ordinal_x, ordinal_y~ - Inside source: true *** True Line Result - # Just rememeber you are helping this... thing... to spread... -** Processing line: ~ # ALSO! I am not liable for any mental, physical or financial damage caused.~ + def item_at_craft_slot args, ordinal_x, ordinal_y +** Processing line: ~ args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~ - Inside source: true *** True Line Result - # ALSO! I am not liable for any mental, physical or financial damage caused. -** Processing line: ~ #############LICENSE############~ + args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y } +** Processing line: ~ end~ - Inside source: true *** True Line Result - #############LICENSE############ + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~~ +** Processing line: ~ # helper function for finding an item at an inventory slot~ - Inside source: true *** True Line Result - -** Processing line: ~ class Array~ + # helper function for finding an item at an inventory slot +** Processing line: ~ def item_at_inventory_slot args, ordinal_x, ordinal_y~ - Inside source: true *** True Line Result - class Array -** Processing line: ~ #Helper function~ + def item_at_inventory_slot args, ordinal_x, ordinal_y +** Processing line: ~ args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~ - Inside source: true *** True Line Result - #Helper function -** Processing line: ~ def move! vector~ + args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y } +** Processing line: ~ end~ - Inside source: true *** True Line Result - def move! vector -** Processing line: ~ self.x += vector.x~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - self.x += vector.x -** Processing line: ~ self.y += vector.y~ + +** Processing line: ~ # helper function that creates a visual representation of an item~ - Inside source: true *** True Line Result - self.y += vector.y -** Processing line: ~ return self~ + # helper function that creates a visual representation of an item +** Processing line: ~ def item_prefab args, item, should_highlight, mouse~ - Inside source: true *** True Line Result - return self -** Processing line: ~ end~ + def item_prefab args, item, should_highlight, mouse +** Processing line: ~ return nil unless item~ - Inside source: true *** True Line Result - end + return nil unless item ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Helper function to draw snake body~ +** Processing line: ~ overlay = nil~ - Inside source: true *** True Line Result - #Helper function to draw snake body -** Processing line: ~ def draw! 🎮, 📺, color~ + overlay = nil +** Processing line: ~~ - Inside source: true *** True Line Result - def draw! 🎮, 📺, color -** Processing line: ~ translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]~ + +** Processing line: ~ x = item.x~ - Inside source: true *** True Line Result - translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color] -** Processing line: ~ end~ + x = item.x +** Processing line: ~ y = item.y~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + y = item.y +** Processing line: ~ w = item.w~ - Inside source: true *** True Line Result - -** Processing line: ~ #This is where it all started, I was trying to find good way to multiply a map by a number, * is already used so is **~ + w = item.w +** Processing line: ~ h = item.h~ - Inside source: true *** True Line Result - #This is where it all started, I was trying to find good way to multiply a map by a number, * is already used so is ** -** Processing line: ~ #I kept trying different combinations of symbols, when suddenly...~ + h = item.h +** Processing line: ~~ - Inside source: true *** True Line Result - #I kept trying different combinations of symbols, when suddenly... -** Processing line: ~ def 😀 value~ + +** Processing line: ~ if should_highlight && mouse.point.inside_rect?(item)~ - Inside source: true *** True Line Result - def 😀 value -** Processing line: ~ self.map {|d| d * value}~ + if should_highlight && mouse.point.inside_rect?(item) +** Processing line: ~ overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }~ - Inside source: true *** True Line Result - self.map {|d| d * value} + overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, } ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ [~ +- Inside source: true +*** True Line Result + [ +** Processing line: ~ # sprites are hashes with a path property, this is the main sprite~ +- Inside source: true +*** True Line Result + # sprites are hashes with a path property, this is the main sprite +** Processing line: ~ { x: x, y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },~ +- Inside source: true +*** True Line Result + { x: x, y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Draw stuff with an offset~ +** Processing line: ~ # this represents the black area in the bottom right corner of the main sprite so that the~ - Inside source: true *** True Line Result - #Draw stuff with an offset -** Processing line: ~ def translate output_collection, ⛓, what~ + # this represents the black area in the bottom right corner of the main sprite so that the +** Processing line: ~ # quantity is visible~ - Inside source: true *** True Line Result - def translate output_collection, ⛓, what -** Processing line: ~ what.x += ⛓.x~ + # quantity is visible +** Processing line: ~ { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property~ - Inside source: true *** True Line Result - what.x += ⛓.x -** Processing line: ~ what.y += ⛓.y~ + { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property +** Processing line: ~~ - Inside source: true *** True Line Result - what.y += ⛓.y -** Processing line: ~ output_collection << what~ + +** Processing line: ~ # labels are hashes with a text property~ - Inside source: true *** True Line Result - output_collection << what -** Processing line: ~ end~ + # labels are hashes with a text property +** Processing line: ~ { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },~ - Inside source: true *** True Line Result - end + { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ BLUE = [33, 150, 243]~ +** Processing line: ~ # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)~ - Inside source: true *** True Line Result - BLUE = [33, 150, 243] -** Processing line: ~ RED = [244, 67, 54]~ + # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered) +** Processing line: ~ overlay~ - Inside source: true *** True Line Result - RED = [244, 67, 54] -** Processing line: ~ GOLD = [255, 193, 7]~ + overlay +** Processing line: ~ ]~ - Inside source: true *** True Line Result - GOLD = [255, 193, 7] -** Processing line: ~ LAST = 0~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - LAST = 0 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ # helper function for deriving the position of an item within inventory~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ defaults args.state~ + # helper function for deriving the position of an item within inventory +** Processing line: ~ def set_inventory_position args, item~ - Inside source: true *** True Line Result - defaults args.state -** Processing line: ~ render args.state, args.outputs~ + def set_inventory_position args, item +** Processing line: ~ item.x = args.state.inventory_border.x + item[:ordinal_x] * 80~ - Inside source: true *** True Line Result - render args.state, args.outputs -** Processing line: ~ input args.state, args.inputs~ + item.x = args.state.inventory_border.x + item[:ordinal_x] * 80 +** Processing line: ~ item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~ - Inside source: true *** True Line Result - input args.state, args.inputs -** Processing line: ~ update args.state~ + item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80 +** Processing line: ~ item.w = 80~ - Inside source: true *** True Line Result - update args.state + item.w = 80 +** Processing line: ~ item.h = 80~ +- Inside source: true +*** True Line Result + item.h = 80 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -92376,186 +99435,174 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def update 🎮~ +** Processing line: ~ # helper function for deriving the position of an item within the craft area~ - Inside source: true *** True Line Result - def update 🎮 -** Processing line: ~ #Update every 10 frames~ + # helper function for deriving the position of an item within the craft area +** Processing line: ~ def set_craft_position args, item~ - Inside source: true *** True Line Result - #Update every 10 frames -** Processing line: ~ if 🎮.tick_count.mod_zero? 10~ + def set_craft_position args, item +** Processing line: ~ item.x = args.state.craft_border.x + item[:ordinal_x] * 80~ - Inside source: true *** True Line Result - if 🎮.tick_count.mod_zero? 10 -** Processing line: ~ #Add new snake body piece at head's location~ + item.x = args.state.craft_border.x + item[:ordinal_x] * 80 +** Processing line: ~ item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~ - Inside source: true *** True Line Result - #Add new snake body piece at head's location -** Processing line: ~ 🎮.🐍 << [*🎮.🤖]~ + item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80 +** Processing line: ~ item.w = 80~ - Inside source: true *** True Line Result - 🎮.🐍 << [*🎮.🤖] -** Processing line: ~ #Assign Next Direction to Direction~ + item.w = 80 +** Processing line: ~ item.h = 80~ - Inside source: true *** True Line Result - #Assign Next Direction to Direction -** Processing line: ~ 🎮.🚗 = *🎮.🚦~ + item.h = 80 +** Processing line: ~ end~ - Inside source: true *** True Line Result - 🎮.🚗 = *🎮.🚦 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Trim the snake a bit if its longer than current size~ +** Processing line: ~ # Any lines outside of a function will be executed when the file is reloaded.~ - Inside source: true *** True Line Result - #Trim the snake a bit if its longer than current size -** Processing line: ~ if 🎮.🐍.length > 🎮.🛒~ + # Any lines outside of a function will be executed when the file is reloaded. +** Processing line: ~ # So every time you save main.rb, the game will be reset.~ - Inside source: true *** True Line Result - if 🎮.🐍.length > 🎮.🛒 -** Processing line: ~ 🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]~ + # So every time you save main.rb, the game will be reset. +** Processing line: ~ # Comment out the line below if you don't want this to happen.~ - Inside source: true *** True Line Result - 🎮.🐍 = 🎮.🐍[-🎮.🛒..-1] -** Processing line: ~ end~ + # Comment out the line below if you don't want this to happen. +** Processing line: ~ $gtk.reset~ - Inside source: true *** True Line Result - end + $gtk.reset ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Move the head in the Direction~ -- Inside source: true -*** True Line Result - #Move the head in the Direction -** Processing line: ~ 🎮.🤖.move! 🎮.🚗~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - 🎮.🤖.move! 🎮.🚗 +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ #If Head is outside the playing field, or inside snake's body restart game~ -- Inside source: true -*** True Line Result - #If Head is outside the playing field, or inside snake's body restart game -** Processing line: ~ if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}~ -- Inside source: true +** Processing line: ~*** Crafting - Farming Game Starting Point - main.rb~ +- Header detected. *** True Line Result - if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖} -** Processing line: ~ LAST = 🎮.💰~ -- Inside source: true + *** True Line Result - LAST = 🎮.💰 -** Processing line: ~ 🎮.as_hash.clear~ -- Inside source: true +*** Crafting - Farming Game Starting Point - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - 🎮.as_hash.clear -** Processing line: ~ return~ -- Inside source: true + *** True Line Result - return -** Processing line: ~ end~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - -** Processing line: ~ #If head lands on food add size and score~ + def tick args +** Processing line: ~ args.state.tile_size = 80~ - Inside source: true *** True Line Result - #If head lands on food add size and score -** Processing line: ~ if 🎮.🤖 == 🎮.🍎~ + args.state.tile_size = 80 +** Processing line: ~ args.state.player_speed = 4~ - Inside source: true *** True Line Result - if 🎮.🤖 == 🎮.🍎 -** Processing line: ~ 🎮.🛒 += 1~ + args.state.player_speed = 4 +** Processing line: ~ args.state.player ||= tile(args, 7, 3, 0, 128, 180)~ - Inside source: true *** True Line Result - 🎮.🛒 += 1 -** Processing line: ~ 🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5~ + args.state.player ||= tile(args, 7, 3, 0, 128, 180) +** Processing line: ~ generate_map args~ - Inside source: true *** True Line Result - 🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5 -** Processing line: ~ spawn_🍎 🎮~ + generate_map args +** Processing line: ~ #press j to plant a green onion~ - Inside source: true *** True Line Result - spawn_🍎 🎮 -** Processing line: ~ puts 🎮.🍎~ + #press j to plant a green onion +** Processing line: ~ if args.inputs.keyboard.j~ - Inside source: true *** True Line Result - puts 🎮.🍎 -** Processing line: ~ end~ + if args.inputs.keyboard.j +** Processing line: ~ #change this part you can change what you want to plant~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + #change this part you can change what you want to plant +** Processing line: ~ args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255) +** Processing line: ~ args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)~ - Inside source: true *** True Line Result - -** Processing line: ~ #Every second remove 1 point~ + args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0) +** Processing line: ~ end~ - Inside source: true *** True Line Result - #Every second remove 1 point -** Processing line: ~ if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)~ + end +** Processing line: ~ # Adds walls, background, and player to args.outputs.solids so they appear on screen~ - Inside source: true *** True Line Result - if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60) -** Processing line: ~ 🎮.💰 -= 1~ + # Adds walls, background, and player to args.outputs.solids so they appear on screen +** Processing line: ~ args.outputs.solids << [0,0,1280,720, 237,189,101]~ - Inside source: true *** True Line Result - 🎮.💰 -= 1 -** Processing line: ~ end~ + args.outputs.solids << [0,0,1280,720, 237,189,101] +** Processing line: ~ args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png'] +** Processing line: ~ args.outputs.solids << args.state.walls~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.outputs.solids << args.state.walls +** Processing line: ~ args.outputs.solids << args.state.player~ - Inside source: true *** True Line Result - -** Processing line: ~ def spawn_🍎 🎮~ + args.outputs.solids << args.state.player +** Processing line: ~ args.outputs.solids << args.state.plants~ - Inside source: true *** True Line Result - def spawn_🍎 🎮 -** Processing line: ~ #Food~ + args.outputs.solids << args.state.plants +** Processing line: ~ args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]~ - Inside source: true *** True Line Result - #Food -** Processing line: ~ 🎮.🍎 ||= [*🎮.🤖]~ + args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200] +** Processing line: ~~ - Inside source: true *** True Line Result - 🎮.🍎 ||= [*🎮.🤖] -** Processing line: ~ #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body~ + +** Processing line: ~ move_player args, -1, 0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed~ - Inside source: true *** True Line Result - #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body -** Processing line: ~ while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do~ + move_player args, -1, 0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed +** Processing line: ~ move_player args, 1, 0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed~ - Inside source: true *** True Line Result - while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do -** Processing line: ~ 🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]~ + move_player args, 1, 0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed +** Processing line: ~ move_player args, 0, 1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed~ - Inside source: true *** True Line Result - 🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)] -** Processing line: ~ end~ + move_player args, 0, 1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed +** Processing line: ~ move_player args, 0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed~ - Inside source: true *** True Line Result - end + move_player args, 0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -92564,246 +99611,238 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render 🎮, 📺~ +** Processing line: ~ # Sets position, size, and color of the tile~ - Inside source: true *** True Line Result - def render 🎮, 📺 -** Processing line: ~ #Paint the background black~ + # Sets position, size, and color of the tile +** Processing line: ~ def tile args, x, y, *color~ - Inside source: true *** True Line Result - #Paint the background black -** Processing line: ~ 📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]~ + def tile args, x, y, *color +** Processing line: ~ [x * args.state.tile_size, # sets definition for array using method parameters~ - Inside source: true *** True Line Result - 📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255] -** Processing line: ~ #Draw a border for the playing field~ + [x * args.state.tile_size, # sets definition for array using method parameters +** Processing line: ~ y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~ - Inside source: true *** True Line Result - #Draw a border for the playing field -** Processing line: ~ translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]~ + y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values +** Processing line: ~ args.state.tile_size,~ - Inside source: true *** True Line Result - translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255] -** Processing line: ~~ + args.state.tile_size, +** Processing line: ~ args.state.tile_size,~ - Inside source: true *** True Line Result - -** Processing line: ~ #Draw the snake's body~ + args.state.tile_size, +** Processing line: ~ *color]~ - Inside source: true *** True Line Result - #Draw the snake's body -** Processing line: ~ 🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end~ + *color] +** Processing line: ~ end~ - Inside source: true *** True Line Result - 🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end -** Processing line: ~ #Draw the head~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - #Draw the head -** Processing line: ~ 🎮.🤖.draw! 🎮, 📺, BLUE~ + +** Processing line: ~ # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~ - Inside source: true *** True Line Result - 🎮.🤖.draw! 🎮, 📺, BLUE -** Processing line: ~ #Draw the food~ + # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach) +** Processing line: ~ def generate_map args~ - Inside source: true *** True Line Result - #Draw the food -** Processing line: ~ 🎮.🍎.draw! 🎮, 📺, RED~ + def generate_map args +** Processing line: ~ return if args.state.area~ - Inside source: true *** True Line Result - 🎮.🍎.draw! 🎮, 📺, RED + return if args.state.area ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Draw current score~ +** Processing line: ~ # Creates the area of the map. There are 9 rows running horizontally across the screen~ - Inside source: true *** True Line Result - #Draw current score -** Processing line: ~ translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]~ + # Creates the area of the map. There are 9 rows running horizontally across the screen +** Processing line: ~ # and 16 columns running vertically on the screen. Any spot with a "1" is not~ - Inside source: true *** True Line Result - translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD] -** Processing line: ~ #Draw your last score, if any~ + # and 16 columns running vertically on the screen. Any spot with a "1" is not +** Processing line: ~ # open for the player to move into (and is green), and any spot with a "0" is available~ - Inside source: true *** True Line Result - #Draw your last score, if any -** Processing line: ~ translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]~ + # open for the player to move into (and is green), and any spot with a "0" is available +** Processing line: ~ # for the player to move in.~ - Inside source: true *** True Line Result - translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0] -** Processing line: ~ #Draw starting message, only if Direction is 0~ + # for the player to move in. +** Processing line: ~ args.state.area = [~ - Inside source: true *** True Line Result - #Draw starting message, only if Direction is 0 -** Processing line: ~ translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]~ + args.state.area = [ +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~ - Inside source: true *** True Line Result - translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0] -** Processing line: ~ end~ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - -** Processing line: ~ def input 🎮, 🕹~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - def input 🎮, 🕹 -** Processing line: ~ #Left and Right keyboard input, only change if X direction is 0~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - #Left and Right keyboard input, only change if X direction is 0 -** Processing line: ~ if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0 -** Processing line: ~ 🎮.🚦 = [-1, 0]~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ - Inside source: true *** True Line Result - 🎮.🚦 = [-1, 0] -** Processing line: ~ elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0~ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,], +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~ - Inside source: true *** True Line Result - elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0 -** Processing line: ~ 🎮.🚦 = [1, 0]~ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,], +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~ - Inside source: true *** True Line Result - 🎮.🚦 = [1, 0] -** Processing line: ~ end~ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], +** Processing line: ~ ].reverse # reverses the order of the area collection~ - Inside source: true *** True Line Result - end + ].reverse # reverses the order of the area collection ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Up and Down keyboard input, only change if Y direction is 0~ -- Inside source: true -*** True Line Result - #Up and Down keyboard input, only change if Y direction is 0 -** Processing line: ~ if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0~ +** Processing line: ~ # By reversing the order, the way that the area appears above is how it appears~ - Inside source: true *** True Line Result - if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0 -** Processing line: ~ 🎮.🚦 = [0, 1]~ + # By reversing the order, the way that the area appears above is how it appears +** Processing line: ~ # on the screen in the game. If we did not reverse, the map would appear inverted.~ - Inside source: true *** True Line Result - 🎮.🚦 = [0, 1] -** Processing line: ~ elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0~ + # on the screen in the game. If we did not reverse, the map would appear inverted. +** Processing line: ~~ - Inside source: true *** True Line Result - elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0 -** Processing line: ~ 🎮.🚦 = [0, -1]~ + +** Processing line: ~ #The wall starts off with no tiles.~ - Inside source: true *** True Line Result - 🎮.🚦 = [0, -1] -** Processing line: ~ end~ + #The wall starts off with no tiles. +** Processing line: ~ args.state.walls = []~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.walls = [] +** Processing line: ~ args.state.plants = []~ - Inside source: true *** True Line Result - end + args.state.plants = [] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults 🎮~ -- Inside source: true -*** True Line Result - def defaults 🎮 -** Processing line: ~ #Playing field size~ +** Processing line: ~ # If v is 1, a green tile is added to args.state.walls.~ - Inside source: true *** True Line Result - #Playing field size -** Processing line: ~ 🎮.🗺 ||= [20, 20]~ + # If v is 1, a green tile is added to args.state.walls. +** Processing line: ~ # If v is 2, a black tile is created as the goal.~ - Inside source: true *** True Line Result - 🎮.🗺 ||= [20, 20] -** Processing line: ~ #Scale for drawing, screen height / Field height~ + # If v is 2, a black tile is created as the goal. +** Processing line: ~ args.state.area.map_2d do |y, x, v|~ - Inside source: true *** True Line Result - #Scale for drawing, screen height / Field height -** Processing line: ~ 🎮.⚖️ ||= 720 / 🎮.🗺.y~ + args.state.area.map_2d do |y, x, v| +** Processing line: ~ if v == 1~ - Inside source: true *** True Line Result - 🎮.⚖️ ||= 720 / 🎮.🗺.y -** Processing line: ~ #Offset, offset all rendering to the center of the screen~ + if v == 1 +** Processing line: ~ args.state.walls << tile(args, x, y, 255, 160, 156) # green tile~ - Inside source: true *** True Line Result - #Offset, offset all rendering to the center of the screen -** Processing line: ~ 🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]~ + args.state.walls << tile(args, x, y, 255, 160, 156) # green tile +** Processing line: ~ end~ - Inside source: true *** True Line Result - 🎮.⛓ ||= [(1280 - 720).fdiv(2), 0] -** Processing line: ~ #Padding, make the snake body slightly smaller than the scale~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - #Padding, make the snake body slightly smaller than the scale -** Processing line: ~ 🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - 🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i -** Processing line: ~ #Snake Size~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - #Snake Size -** Processing line: ~ 🎮.🛒 ||= 3~ + +** Processing line: ~ # Allows the player to move their box around the screen~ - Inside source: true *** True Line Result - 🎮.🛒 ||= 3 -** Processing line: ~ #Snake head, the only part we are actually controlling~ + # Allows the player to move their box around the screen +** Processing line: ~ def move_player args, *vector~ - Inside source: true *** True Line Result - #Snake head, the only part we are actually controlling -** Processing line: ~ 🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]~ + def move_player args, *vector +** Processing line: ~ box = args.state.player.shift_rect(vector) # box is able to move at an angle~ - Inside source: true *** True Line Result - 🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2] -** Processing line: ~ #Snake body map, follows the head~ + box = args.state.player.shift_rect(vector) # box is able to move at an angle +** Processing line: ~~ - Inside source: true *** True Line Result - #Snake body map, follows the head -** Processing line: ~ 🎮.🐍 ||= []~ + +** Processing line: ~ # If the player's box hits a wall, it is not able to move further in that direction~ - Inside source: true *** True Line Result - 🎮.🐍 ||= [] -** Processing line: ~ #Direction the head moves to~ + # If the player's box hits a wall, it is not able to move further in that direction +** Processing line: ~ return if args.state.walls~ - Inside source: true *** True Line Result - #Direction the head moves to -** Processing line: ~ 🎮.🚗 ||= [0, 0]~ + return if args.state.walls +** Processing line: ~ .any_intersect_rect?(box)~ - Inside source: true *** True Line Result - 🎮.🚗 ||= [0, 0] -** Processing line: ~ #Next_Direction, during input check only change this variable and then when game updates asign this to Direction~ + .any_intersect_rect?(box) +** Processing line: ~~ - Inside source: true *** True Line Result - #Next_Direction, during input check only change this variable and then when game updates asign this to Direction -** Processing line: ~ 🎮.🚦 ||= [*🎮.🚗]~ + +** Processing line: ~ # Player's box is able to move at angles (not just the four general directions) fast~ - Inside source: true *** True Line Result - 🎮.🚦 ||= [*🎮.🚗] -** Processing line: ~ #Your score~ + # Player's box is able to move at angles (not just the four general directions) fast +** Processing line: ~ args.state.player =~ - Inside source: true *** True Line Result - #Your score -** Processing line: ~ 🎮.💰 ||= 0~ + args.state.player = +** Processing line: ~ args.state.player~ - Inside source: true *** True Line Result - 🎮.💰 ||= 0 -** Processing line: ~ #Spawns Food randomly~ + args.state.player +** Processing line: ~ .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~ - Inside source: true *** True Line Result - #Spawns Food randomly -** Processing line: ~ spawn_🍎(🎮) unless 🎮.🍎?~ + .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then +** Processing line: ~ vector.y * args.state.player_speed) # the box will move extremely slow~ - Inside source: true *** True Line Result - spawn_🍎(🎮) unless 🎮.🍎? + vector.y * args.state.player_speed) # the box will move extremely slow ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -92820,250 +99859,250 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Arcade - Solar System - main.rb~ +** Processing line: ~*** Crafting - Farming Game Starting Point - repl.rb~ - Header detected. *** True Line Result *** True Line Result -*** Arcade - Solar System - main.rb +*** Crafting - Farming Game Starting Point - repl.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/solar_system/app/main.rb~ +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/solar_system/app/main.rb -** Processing line: ~ # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4~ + # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4 -** Processing line: ~ # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8~ + # =============================================================== +** Processing line: ~ # Welcome to repl.rb~ - Inside source: true *** True Line Result - # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8 -** Processing line: ~~ + # Welcome to repl.rb +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - -** Processing line: ~ def defaults args~ + # =============================================================== +** Processing line: ~ # You can experiement with code within this file. Code in this~ - Inside source: true *** True Line Result - def defaults args -** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ + # You can experiement with code within this file. Code in this +** Processing line: ~ # file is only executed when you save (and only excecuted ONCE).~ - Inside source: true *** True Line Result - args.outputs.background_color = [0, 0, 0] -** Processing line: ~ args.state.x ||= 640~ + # file is only executed when you save (and only excecuted ONCE). +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - args.state.x ||= 640 -** Processing line: ~ args.state.y ||= 360~ + # =============================================================== +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.y ||= 360 -** Processing line: ~ args.state.stars ||= 100.map do~ + +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - args.state.stars ||= 100.map do -** Processing line: ~ [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]~ + # =============================================================== +** Processing line: ~ # REMOVE the "x" from the word "xrepl" and save the file to RUN~ - Inside source: true *** True Line Result - [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand] -** Processing line: ~ end~ + # REMOVE the "x" from the word "xrepl" and save the file to RUN +** Processing line: ~ # the code in between the do/end block delimiters.~ - Inside source: true *** True Line Result - end + # the code in between the do/end block delimiters. +** Processing line: ~ # ===============================================================~ +- Inside source: true +*** True Line Result + # =============================================================== ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.sun ||= args.state.new_entity(:sun) do |s|~ +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - args.state.sun ||= args.state.new_entity(:sun) do |s| -** Processing line: ~ s.s = 100~ + # =============================================================== +** Processing line: ~ # ADD the "x" to the word "repl" (make it xrepl) and save the~ - Inside source: true *** True Line Result - s.s = 100 -** Processing line: ~ s.path = 'sprites/sun.png'~ + # ADD the "x" to the word "repl" (make it xrepl) and save the +** Processing line: ~ # file to IGNORE the code in between the do/end block delimiters.~ - Inside source: true *** True Line Result - s.path = 'sprites/sun.png' -** Processing line: ~ end~ + # file to IGNORE the code in between the do/end block delimiters. +** Processing line: ~ # ===============================================================~ - Inside source: true *** True Line Result - end + # =============================================================== ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.state.planets = [~ -- Inside source: true -*** True Line Result - args.state.planets = [ -** Processing line: ~ [:mercury, 65, 5, 88],~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - [:mercury, 65, 5, 88], -** Processing line: ~ [:venus, 100, 10, 225],~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - [:venus, 100, 10, 225], -** Processing line: ~ [:earth, 120, 10, 365],~ + xrepl do +** Processing line: ~ puts "The result of 1 + 2 is: #{1 + 2}"~ - Inside source: true *** True Line Result - [:earth, 120, 10, 365], -** Processing line: ~ [:mars, 140, 8, 687],~ + puts "The result of 1 + 2 is: #{1 + 2}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - [:mars, 140, 8, 687], -** Processing line: ~ [:jupiter, 280, 30, 365 * 11.8],~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - [:jupiter, 280, 30, 365 * 11.8], -** Processing line: ~ [:saturn, 350, 20, 365 * 29.5],~ + +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - [:saturn, 350, 20, 365 * 29.5], -** Processing line: ~ [:uranus, 400, 15, 365 * 84],~ + # ==================================================================================== +** Processing line: ~ # Ruby Crash Course:~ - Inside source: true *** True Line Result - [:uranus, 400, 15, 365 * 84], -** Processing line: ~ [:neptune, 440, 15, 365 * 164.8],~ + # Ruby Crash Course: +** Processing line: ~ # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays~ - Inside source: true *** True Line Result - [:neptune, 440, 15, 365 * 164.8], -** Processing line: ~ [:pluto, 480, 5, 365 * 247.8],~ + # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - [:pluto, 480, 5, 365 * 247.8], -** Processing line: ~ ].map do |name, distance, size, year_in_days|~ + # ==================================================================================== +** Processing line: ~~ - Inside source: true *** True Line Result - ].map do |name, distance, size, year_in_days| -** Processing line: ~ args.state.new_entity(name) do |p|~ + +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - args.state.new_entity(name) do |p| -** Processing line: ~ p.path = "sprites/#{name}.png"~ + # ==================================================================================== +** Processing line: ~ # Strings~ - Inside source: true *** True Line Result - p.path = "sprites/#{name}.png" -** Processing line: ~ p.distance = distance * 0.7~ + # Strings +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - p.distance = distance * 0.7 -** Processing line: ~ p.s = size * 0.7~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - p.s = size * 0.7 -** Processing line: ~ p.year_in_days = year_in_days~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - p.year_in_days = year_in_days -** Processing line: ~ end~ + xrepl do +** Processing line: ~ message = "Hello World"~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + message = "Hello World" +** Processing line: ~ puts "The value of message is: " + message~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + puts "The value of message is: " + message +** Processing line: ~ puts "Any value can be interpolated within a string using \#{}."~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.ship ||= args.state.new_entity(:ship) do |s|~ + puts "Any value can be interpolated within a string using \#{}." +** Processing line: ~ puts "Interpolated message: #{message}."~ - Inside source: true *** True Line Result - args.state.ship ||= args.state.new_entity(:ship) do |s| -** Processing line: ~ s.x = 1280 * rand~ + puts "Interpolated message: #{message}." +** Processing line: ~ puts 'This #{message} is not interpolated because the string uses single quotes.'~ - Inside source: true *** True Line Result - s.x = 1280 * rand -** Processing line: ~ s.y = 720 * rand~ + puts 'This #{message} is not interpolated because the string uses single quotes.' +** Processing line: ~ end~ - Inside source: true *** True Line Result - s.y = 720 * rand -** Processing line: ~ s.angle = 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - s.angle = 0 -** Processing line: ~ end~ + +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # ==================================================================================== +** Processing line: ~ # Numerics~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # Numerics +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - -** Processing line: ~ def to_sprite args, entity~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - def to_sprite args, entity -** Processing line: ~ x = 0~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - x = 0 -** Processing line: ~ y = 0~ + xrepl do +** Processing line: ~ a = 10~ - Inside source: true *** True Line Result - y = 0 -** Processing line: ~~ + a = 10 +** Processing line: ~ puts "The value of a is: #{a}"~ - Inside source: true *** True Line Result - -** Processing line: ~ if entity.year_in_days~ + puts "The value of a is: #{a}" +** Processing line: ~ puts "a + 1 is: #{a + 1}"~ - Inside source: true *** True Line Result - if entity.year_in_days -** Processing line: ~ day = args.state.tick_count~ + puts "a + 1 is: #{a + 1}" +** Processing line: ~ puts "a / 3 is: #{a / 3}"~ - Inside source: true *** True Line Result - day = args.state.tick_count -** Processing line: ~ day_in_year = day % entity.year_in_days~ + puts "a / 3 is: #{a / 3}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - day_in_year = day % entity.year_in_days -** Processing line: ~ entity.random_start_day ||= day_in_year * rand~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - entity.random_start_day ||= day_in_year * rand -** Processing line: ~ percentage_of_year = day_in_year.fdiv(entity.year_in_days)~ + +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - percentage_of_year = day_in_year.fdiv(entity.year_in_days) -** Processing line: ~ angle = 365 * percentage_of_year~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - angle = 365 * percentage_of_year -** Processing line: ~ x = angle.vector_x(entity.distance)~ + xrepl do +** Processing line: ~ b = 10.12~ - Inside source: true *** True Line Result - x = angle.vector_x(entity.distance) -** Processing line: ~ y = angle.vector_y(entity.distance)~ + b = 10.12 +** Processing line: ~ puts "The value of b is: #{b}"~ - Inside source: true *** True Line Result - y = angle.vector_y(entity.distance) -** Processing line: ~ end~ + puts "The value of b is: #{b}" +** Processing line: ~ puts "b + 1 is: #{b + 1}"~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + puts "b + 1 is: #{b + 1}" +** Processing line: ~ puts "b as an integer is: #{b.to_i}"~ - Inside source: true *** True Line Result - -** Processing line: ~ [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]~ + puts "b as an integer is: #{b.to_i}" +** Processing line: ~ puts ''~ - Inside source: true *** True Line Result - [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path] + puts '' ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93072,46 +100111,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def render args~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - def render args -** Processing line: ~ args.outputs.solids << [0, 0, 1280, 720]~ + # ==================================================================================== +** Processing line: ~ # Booleans~ - Inside source: true *** True Line Result - args.outputs.solids << [0, 0, 1280, 720] -** Processing line: ~~ + # Booleans +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - -** Processing line: ~ args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b| -** Processing line: ~ [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b] -** Processing line: ~ end~ + xrepl do +** Processing line: ~ c = 30~ - Inside source: true *** True Line Result - end + c = 30 +** Processing line: ~ puts "The value of c is #{c}."~ +- Inside source: true +*** True Line Result + puts "The value of c is #{c}." ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.sprites << to_sprite(args, args.state.sun)~ +** Processing line: ~ if c~ - Inside source: true *** True Line Result - args.outputs.sprites << to_sprite(args, args.state.sun) -** Processing line: ~ args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }~ + if c +** Processing line: ~ puts "This if statement ran because c is truthy."~ - Inside source: true *** True Line Result - args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p } -** Processing line: ~ args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]~ + puts "This if statement ran because c is truthy." +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle] + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93120,34 +100163,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc args~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - def calc args -** Processing line: ~ args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - args.state.stars = args.state.stars.map do |x, y, speed, r, g, b| -** Processing line: ~ x += speed~ + xrepl do +** Processing line: ~ d = false~ - Inside source: true *** True Line Result - x += speed -** Processing line: ~ y += speed~ + d = false +** Processing line: ~ puts "The value of d is #{d}."~ - Inside source: true *** True Line Result - y += speed -** Processing line: ~ x = 0 if x > 1280~ + puts "The value of d is #{d}." +** Processing line: ~~ - Inside source: true *** True Line Result - x = 0 if x > 1280 -** Processing line: ~ y = 0 if y > 720~ + +** Processing line: ~ if !d~ - Inside source: true *** True Line Result - y = 0 if y > 720 -** Processing line: ~ [x, y, speed, r, g, b]~ + if !d +** Processing line: ~ puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."~ - Inside source: true *** True Line Result - [x, y, speed, r, g, b] + puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true." ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93156,14 +100199,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if args.state.tick_count == 0~ +** Processing line: ~ e = nil~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.outputs.sounds << 'sounds/bg.ogg'~ + e = nil +** Processing line: ~ puts "Nil is also considered falsey. The value of e is: #{e}."~ - Inside source: true *** True Line Result - args.outputs.sounds << 'sounds/bg.ogg' + puts "Nil is also considered falsey. The value of e is: #{e}." +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if !e~ +- Inside source: true +*** True Line Result + if !e +** Processing line: ~ puts "This if statement ran because e is nil (a falsey value)."~ +- Inside source: true +*** True Line Result + puts "This if statement ran because e is nil (a falsey value)." ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93176,302 +100231,290 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def process_inputs args~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - def process_inputs args -** Processing line: ~ if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left~ + # ==================================================================================== +** Processing line: ~ # Conditionals~ - Inside source: true *** True Line Result - if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left -** Processing line: ~ args.state.ship.angle += 1~ + # Conditionals +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - args.state.ship.angle += 1 -** Processing line: ~ elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right -** Processing line: ~ args.state.ship.angle -= 1~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - args.state.ship.angle -= 1 -** Processing line: ~ end~ + xrepl do +** Processing line: ~ i_am_true = true~ - Inside source: true *** True Line Result - end + i_am_true = true +** Processing line: ~ i_am_nil = nil~ +- Inside source: true +*** True Line Result + i_am_nil = nil +** Processing line: ~ i_am_false = false~ +- Inside source: true +*** True Line Result + i_am_false = false +** Processing line: ~ i_am_hi = "hi"~ +- Inside source: true +*** True Line Result + i_am_hi = "hi" ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a~ +** Processing line: ~ puts "======== if statement"~ - Inside source: true *** True Line Result - if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a -** Processing line: ~ args.state.ship.x += args.state.ship.angle.x_vector~ + puts "======== if statement" +** Processing line: ~ i_am_one = 1~ - Inside source: true *** True Line Result - args.state.ship.x += args.state.ship.angle.x_vector -** Processing line: ~ args.state.ship.y += args.state.ship.angle.y_vector~ + i_am_one = 1 +** Processing line: ~ if i_am_one~ - Inside source: true *** True Line Result - args.state.ship.y += args.state.ship.angle.y_vector -** Processing line: ~ end~ + if i_am_one +** Processing line: ~ puts "This was printed because i_am_one is truthy."~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + puts "This was printed because i_am_one is truthy." +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ puts "======== if/else statement"~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ defaults args~ + puts "======== if/else statement" +** Processing line: ~ if i_am_false~ - Inside source: true *** True Line Result - defaults args -** Processing line: ~ render args~ + if i_am_false +** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ - Inside source: true *** True Line Result - render args -** Processing line: ~ calc args~ + puts "This will NOT get printed because i_am_false is false." +** Processing line: ~ else~ - Inside source: true *** True Line Result - calc args -** Processing line: ~ process_inputs args~ + else +** Processing line: ~ puts "This was printed because i_am_false is false."~ - Inside source: true *** True Line Result - process_inputs args -** Processing line: ~ end~ + puts "This was printed because i_am_false is false." +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def r~ +** Processing line: ~ puts "======== if/elsif/else statement"~ - Inside source: true *** True Line Result - def r -** Processing line: ~ $gtk.reset~ + puts "======== if/elsif/else statement" +** Processing line: ~ if i_am_false~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ end~ + if i_am_false +** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + puts "This will NOT get printed because i_am_false is false." +** Processing line: ~ elsif i_am_true~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src -** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Arcade - Sound Golf - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Arcade - Sound Golf - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - -*** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/sound_golf/app/main.rb~ + elsif i_am_true +** Processing line: ~ puts "This was printed because i_am_true is true."~ - Inside source: true *** True Line Result - # ./samples/99_genre_arcade/sound_golf/app/main.rb -** Processing line: ~ =begin~ + puts "This was printed because i_am_true is true." +** Processing line: ~ else~ - Inside source: true *** True Line Result - =begin -** Processing line: ~~ + else +** Processing line: ~ puts "This will NOT get printed i_am_true was true."~ - Inside source: true *** True Line Result - -** Processing line: ~ APIs Listing that haven't been encountered in previous sample apps:~ + puts "This will NOT get printed i_am_true was true." +** Processing line: ~ end~ - Inside source: true *** True Line Result - APIs Listing that haven't been encountered in previous sample apps: + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - sample: Chooses random element from array.~ +** Processing line: ~ puts "======== case statement "~ - Inside source: true *** True Line Result - - sample: Chooses random element from array. -** Processing line: ~ In this sample app, the target note is set by taking a sample from the collection~ + puts "======== case statement " +** Processing line: ~ i_am_one = 1~ - Inside source: true *** True Line Result - In this sample app, the target note is set by taking a sample from the collection -** Processing line: ~ of available notes.~ + i_am_one = 1 +** Processing line: ~ case i_am_one~ - Inside source: true *** True Line Result - of available notes. -** Processing line: ~~ + case i_am_one +** Processing line: ~ when 10~ - Inside source: true *** True Line Result - -** Processing line: ~ Reminders:~ + when 10 +** Processing line: ~ puts "case equaled: 10"~ - Inside source: true *** True Line Result - Reminders: -** Processing line: ~ - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~ + puts "case equaled: 10" +** Processing line: ~ when 9~ - Inside source: true *** True Line Result - - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual -** Processing line: ~ 720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~ + when 9 +** Processing line: ~ puts "case equaled: 9"~ - Inside source: true *** True Line Result - 720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720). -** Processing line: ~~ + puts "case equaled: 9" +** Processing line: ~ when 5~ - Inside source: true *** True Line Result - -** Processing line: ~ - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~ + when 5 +** Processing line: ~ puts "case equaled: 5"~ - Inside source: true *** True Line Result - - args.state.new_entity: Used when we want to create a new object, like a sprite or button. -** Processing line: ~ For example, if we want to create a new button, we would declare it as a new entity and~ + puts "case equaled: 5" +** Processing line: ~ when 1~ - Inside source: true *** True Line Result - For example, if we want to create a new button, we would declare it as a new entity and -** Processing line: ~ then define its properties.~ + when 1 +** Processing line: ~ puts "case equaled: 1"~ - Inside source: true *** True Line Result - then define its properties. -** Processing line: ~~ + puts "case equaled: 1" +** Processing line: ~ else~ - Inside source: true *** True Line Result - -** Processing line: ~ - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~ + else +** Processing line: ~ puts "Value wasn't cased."~ - Inside source: true *** True Line Result - - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated -** Processing line: ~ as Ruby code, and the placeholder is replaced with its corresponding value or result.~ + puts "Value wasn't cased." +** Processing line: ~ end~ - Inside source: true *** True Line Result - as Ruby code, and the placeholder is replaced with its corresponding value or result. + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - args.outputs.labels: An array. The values generate a label.~ -- Inside source: true -*** True Line Result - - args.outputs.labels: An array. The values generate a label. -** Processing line: ~ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~ +** Processing line: ~ puts "======== different types of comparisons"~ - Inside source: true *** True Line Result - The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] -** Processing line: ~ For more information about labels, go to mygame/documentation/02-labels.md.~ + puts "======== different types of comparisons" +** Processing line: ~ if 4 == 4~ - Inside source: true *** True Line Result - For more information about labels, go to mygame/documentation/02-labels.md. -** Processing line: ~~ + if 4 == 4 +** Processing line: ~ puts "equal (4 == 4)"~ - Inside source: true *** True Line Result - -** Processing line: ~ - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).~ + puts "equal (4 == 4)" +** Processing line: ~ end~ - Inside source: true *** True Line Result - - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't). + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - first: Returns the first element of an array.~ +** Processing line: ~ if 4 != 3~ - Inside source: true *** True Line Result - - first: Returns the first element of an array. -** Processing line: ~~ + if 4 != 3 +** Processing line: ~ puts "not equal (4 != 3)"~ - Inside source: true *** True Line Result - -** Processing line: ~ - inside_rect: Returns true or false depending on if the point is inside the rect.~ + puts "not equal (4 != 3)" +** Processing line: ~ end~ - Inside source: true *** True Line Result - - inside_rect: Returns true or false depending on if the point is inside the rect. + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - to_sym: Returns symbol corresponding to string. Will create a symbol if it does~ -- Inside source: true -*** True Line Result - - to_sym: Returns symbol corresponding to string. Will create a symbol if it does -** Processing line: ~ not already exist.~ +** Processing line: ~ if 3 < 4~ - Inside source: true *** True Line Result - not already exist. -** Processing line: ~~ + if 3 < 4 +** Processing line: ~ puts "less than (3 < 4)"~ - Inside source: true *** True Line Result - -** Processing line: ~ =end~ + puts "less than (3 < 4)" +** Processing line: ~ end~ - Inside source: true *** True Line Result - =end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # This sample app allows users to test their musical skills by matching the piano sound that plays in each~ +** Processing line: ~ if 4 > 3~ - Inside source: true *** True Line Result - # This sample app allows users to test their musical skills by matching the piano sound that plays in each -** Processing line: ~ # level to the correct note.~ + if 4 > 3 +** Processing line: ~ puts "greater than (4 > 3)"~ - Inside source: true *** True Line Result - # level to the correct note. + puts "greater than (4 > 3)" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Runs all the methods necessary for the game to function properly.~ +** Processing line: ~ if ((4 > 3) || (3 < 4) || false)~ - Inside source: true *** True Line Result - # Runs all the methods necessary for the game to function properly. -** Processing line: ~ def tick args~ + if ((4 > 3) || (3 < 4) || false) +** Processing line: ~ puts "or statement ((4 > 3) || (3 < 4) || false)"~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ defaults args~ + puts "or statement ((4 > 3) || (3 < 4) || false)" +** Processing line: ~ end~ - Inside source: true *** True Line Result - defaults args -** Processing line: ~ render args~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - render args -** Processing line: ~ calc args~ + +** Processing line: ~ if ((4 > 3) && (3 < 4))~ - Inside source: true *** True Line Result - calc args -** Processing line: ~ input_mouse args~ + if ((4 > 3) && (3 < 4)) +** Processing line: ~ puts "and statement ((4 > 3) && (3 < 4))"~ - Inside source: true *** True Line Result - input_mouse args -** Processing line: ~ tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""~ + puts "and statement ((4 > 3) && (3 < 4))" +** Processing line: ~ end~ - Inside source: true *** True Line Result - tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\"" + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93480,126 +100523,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Sets default values and creates empty collections~ -- Inside source: true -*** True Line Result - # Sets default values and creates empty collections -** Processing line: ~ # Initialization happens in the first frame only~ -- Inside source: true -*** True Line Result - # Initialization happens in the first frame only -** Processing line: ~ def defaults args~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - def defaults args -** Processing line: ~ args.state.notes ||= []~ + # ==================================================================================== +** Processing line: ~ # Looping~ - Inside source: true *** True Line Result - args.state.notes ||= [] -** Processing line: ~ args.state.click_feedbacks ||= []~ + # Looping +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - args.state.click_feedbacks ||= [] -** Processing line: ~ args.state.current_level ||= 1~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - args.state.current_level ||= 1 -** Processing line: ~ args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet -** Processing line: ~ end~ + xrepl do +** Processing line: ~ puts "======== times block"~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + puts "======== times block" +** Processing line: ~ 3.times do |i|~ - Inside source: true *** True Line Result - -** Processing line: ~ # Uses a label to display current level, and shows the score~ + 3.times do |i| +** Processing line: ~ puts i~ - Inside source: true *** True Line Result - # Uses a label to display current level, and shows the score -** Processing line: ~ # Creates a button to play the sample note, and displays the available notes that could be a potential match~ + puts i +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Creates a button to play the sample note, and displays the available notes that could be a potential match -** Processing line: ~ def render args~ + end +** Processing line: ~ puts "======== range block exclusive"~ - Inside source: true *** True Line Result - def render args -** Processing line: ~~ + puts "======== range block exclusive" +** Processing line: ~ (0...3).each do |i|~ - Inside source: true *** True Line Result - -** Processing line: ~ # grid.w_half positions the label in the horizontal center of the screen.~ + (0...3).each do |i| +** Processing line: ~ puts i~ - Inside source: true *** True Line Result - # grid.w_half positions the label in the horizontal center of the screen. -** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]~ + puts i +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0] -** Processing line: ~~ + end +** Processing line: ~ puts "======== range block inclusive"~ - Inside source: true *** True Line Result - -** Processing line: ~ render_score args # shows score on screen~ + puts "======== range block inclusive" +** Processing line: ~ (0..3).each do |i|~ - Inside source: true *** True Line Result - render_score args # shows score on screen -** Processing line: ~~ + (0..3).each do |i| +** Processing line: ~ puts i~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title~ + puts i +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title -** Processing line: ~ args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if args.state.game_over # if game is over, a "play again" button is shown~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - if args.state.game_over # if game is over, a "play again" button is shown -** Processing line: ~ # Calculations ensure that Play Again label is displayed in center of border~ + # ==================================================================================== +** Processing line: ~ # Enumerables~ - Inside source: true *** True Line Result - # Calculations ensure that Play Again label is displayed in center of border -** Processing line: ~ # Remove calculations from y parameters and see what happens to border and label placement~ + # Enumerables +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - # Remove calculations from y parameters and see what happens to border and label placement -** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label -** Processing line: ~ args.outputs.borders << args.state.play_again_button # outputs border~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - args.outputs.borders << args.state.play_again_button # outputs border -** Processing line: ~ else # otherwise, if game is not over~ + xrepl do +** Processing line: ~ puts "======== array each"~ - Inside source: true *** True Line Result - else # otherwise, if game is not over -** Processing line: ~ # Calculations ensure that label appears in center of border~ + puts "======== array each" +** Processing line: ~ colors = ["red", "blue", "yellow"]~ - Inside source: true *** True Line Result - # Calculations ensure that label appears in center of border -** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label~ + colors = ["red", "blue", "yellow"] +** Processing line: ~ colors.each do |color|~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label -** Processing line: ~ args.outputs.borders << args.state.play_note_button # outputs border~ + colors.each do |color| +** Processing line: ~ puts color~ - Inside source: true *** True Line Result - args.outputs.borders << args.state.play_note_button # outputs border + puts color ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93608,58 +100643,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ return if args.state.game_over # return if game is over~ -- Inside source: true -*** True Line Result - return if args.state.game_over # return if game is over -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ args.outputs.labels << [args.grid.w_half, 400, "I think the note is a(n)...", 0, 1, 0, 0, 0] # outputs label~ -- Inside source: true -*** True Line Result - args.outputs.labels << [args.grid.w_half, 400, "I think the note is a(n)...", 0, 1, 0, 0, 0] # outputs label -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Shows all of the available notes that can be potential matches.~ -- Inside source: true -*** True Line Result - # Shows all of the available notes that can be potential matches. -** Processing line: ~ available_notes.each_with_index do |note, i|~ +** Processing line: ~ puts '======== array each_with_index'~ - Inside source: true *** True Line Result - available_notes.each_with_index do |note, i| -** Processing line: ~ args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)~ + puts '======== array each_with_index' +** Processing line: ~ colors = ["red", "blue", "yellow"]~ - Inside source: true *** True Line Result - args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border) -** Processing line: ~ args.outputs.labels << args.state.notes[i].label # outputs note on screen with a label and a border~ + colors = ["red", "blue", "yellow"] +** Processing line: ~ colors.each_with_index do |color, i|~ - Inside source: true *** True Line Result - args.outputs.labels << args.state.notes[i].label # outputs note on screen with a label and a border -** Processing line: ~ args.outputs.borders << args.state.notes[i].border~ + colors.each_with_index do |color, i| +** Processing line: ~ puts "#{color} at index #{i}"~ - Inside source: true *** True Line Result - args.outputs.borders << args.state.notes[i].border + puts "#{color} at index #{i}" ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Shows whether or not the user is correct by filling the screen with either red or green~ -- Inside source: true -*** True Line Result - # Shows whether or not the user is correct by filling the screen with either red or green -** Processing line: ~ args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }~ -- Inside source: true -*** True Line Result - args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93668,294 +100671,322 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Shows the score (number of times the user guesses wrong) onto the screen using labels.~ -- Inside source: true -*** True Line Result - # Shows the score (number of times the user guesses wrong) onto the screen using labels. -** Processing line: ~ def render_score args~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - def render_score args -** Processing line: ~ if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par -** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]~ + xrepl do +** Processing line: ~ puts "======== single parameter function"~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0] -** Processing line: ~ else # otherwise, number of times the user has guessed wrong is shown~ + puts "======== single parameter function" +** Processing line: ~ def add_one_to n~ - Inside source: true *** True Line Result - else # otherwise, number of times the user has guessed wrong is shown -** Processing line: ~ args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation~ + def add_one_to n +** Processing line: ~ n + 5~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation + n + 5 ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ puts add_one_to(3)~ +- Inside source: true +*** True Line Result + puts add_one_to(3) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sets the target note for the level and performs calculations on click_feedbacks.~ +** Processing line: ~ puts "======== function with default value"~ - Inside source: true *** True Line Result - # Sets the target note for the level and performs calculations on click_feedbacks. -** Processing line: ~ def calc args~ + puts "======== function with default value" +** Processing line: ~ def function_with_default_value v = 10~ - Inside source: true *** True Line Result - def calc args -** Processing line: ~ args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note~ + def function_with_default_value v = 10 +** Processing line: ~ v * 10~ - Inside source: true *** True Line Result - args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note -** Processing line: ~ args.state.click_feedbacks.each { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely~ + v * 10 +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.click_feedbacks.each { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely -** Processing line: ~ # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection -** Processing line: ~ args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }~ + +** Processing line: ~ puts "passing three: #{function_with_default_value(3)}"~ - Inside source: true *** True Line Result - args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 } -** Processing line: ~ end~ + puts "passing three: #{function_with_default_value(3)}" +** Processing line: ~ puts "passing nil: #{function_with_default_value}"~ - Inside source: true *** True Line Result - end + puts "passing nil: #{function_with_default_value}" ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Uses input from the user to play the target note, as well as the other notes that could be a potential match.~ +** Processing line: ~ puts "======== Or Equal (||=) operator for nil values"~ - Inside source: true *** True Line Result - # Uses input from the user to play the target note, as well as the other notes that could be a potential match. -** Processing line: ~ def input_mouse args~ + puts "======== Or Equal (||=) operator for nil values" +** Processing line: ~ def function_with_nil_default_with_local a = nil~ - Inside source: true *** True Line Result - def input_mouse args -** Processing line: ~ return unless args.inputs.mouse.click # return unless the mouse is clicked~ + def function_with_nil_default_with_local a = nil +** Processing line: ~ result = a~ - Inside source: true *** True Line Result - return unless args.inputs.mouse.click # return unless the mouse is clicked -** Processing line: ~~ + result = a +** Processing line: ~ result ||= "or equal operator was exected and set a default value"~ - Inside source: true *** True Line Result - -** Processing line: ~ # finds button that was clicked by user~ + result ||= "or equal operator was exected and set a default value" +** Processing line: ~ end~ - Inside source: true *** True Line Result - # finds button that was clicked by user -** Processing line: ~ button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements -** Processing line: ~ args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of~ + +** Processing line: ~ puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"~ - Inside source: true *** True Line Result - args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of -** Processing line: ~ end.find_all { |b| b.is_a? Hash }.first # reject, return first element~ + puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}" +** Processing line: ~ puts "passing nil: #{function_with_nil_default_with_local}"~ - Inside source: true *** True Line Result - end.find_all { |b| b.is_a? Hash }.first # reject, return first element + puts "passing nil: #{function_with_nil_default_with_local}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ return unless button_clicked # return unless button_clicked as a value (a button was clicked)~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - return unless button_clicked # return unless button_clicked as a value (a button was clicked) -** Processing line: ~~ + # ==================================================================================== +** Processing line: ~ # Arrays~ - Inside source: true *** True Line Result - -** Processing line: ~ queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked~ + # Arrays +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked -** Processing line: ~ button_clicked.x,~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - button_clicked.x, -** Processing line: ~ button_clicked.y,~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - button_clicked.y, -** Processing line: ~ button_clicked.w,~ + xrepl do +** Processing line: ~ puts "======== Create an array with the numbers 1 to 10."~ - Inside source: true *** True Line Result - button_clicked.w, -** Processing line: ~ button_clicked.h,~ + puts "======== Create an array with the numbers 1 to 10." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - button_clicked.h, -** Processing line: ~ 150, 100, 200 # sets color of button to shade of purple~ + one_to_ten = (1..10).to_a +** Processing line: ~ puts one_to_ten~ - Inside source: true *** True Line Result - 150, 100, 200 # sets color of button to shade of purple + puts one_to_ten ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if button_clicked[:label] == 'play' # if "play note" button is pressed~ +** Processing line: ~ puts "======== Create a new array that only contains even numbers from the previous array."~ - Inside source: true *** True Line Result - if button_clicked[:label] == 'play' # if "play note" button is pressed -** Processing line: ~ args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output~ + puts "======== Create a new array that only contains even numbers from the previous array." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output -** Processing line: ~ elsif button_clicked[:label] == 'again' # if "play game again" button is pressed~ + one_to_ten = (1..10).to_a +** Processing line: ~ evens = one_to_ten.find_all do |number|~ - Inside source: true *** True Line Result - elsif button_clicked[:label] == 'again' # if "play game again" button is pressed -** Processing line: ~ args.state.target_note = nil # no target note~ + evens = one_to_ten.find_all do |number| +** Processing line: ~ number % 2 == 0~ - Inside source: true *** True Line Result - args.state.target_note = nil # no target note -** Processing line: ~ args.state.current_level = 1 # starts at level 1 again~ + number % 2 == 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.current_level = 1 # starts at level 1 again -** Processing line: ~ args.state.times_wrong = 0 # starts off with 0 wrong guesses~ + end +** Processing line: ~ puts evens~ +- Inside source: true +*** True Line Result + puts evens +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ puts "======== Create a new array that rejects odd numbers."~ - Inside source: true *** True Line Result - args.state.times_wrong = 0 # starts off with 0 wrong guesses -** Processing line: ~ args.state.game_over = false # the game is not over (because it has just been restarted)~ + puts "======== Create a new array that rejects odd numbers." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - args.state.game_over = false # the game is not over (because it has just been restarted) -** Processing line: ~ else # otherwise if neither of those buttons were pressed~ + one_to_ten = (1..10).to_a +** Processing line: ~ also_even = one_to_ten.reject do |number|~ - Inside source: true *** True Line Result - else # otherwise if neither of those buttons were pressed -** Processing line: ~ args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played~ + also_even = one_to_ten.reject do |number| +** Processing line: ~ number % 2 != 0~ - Inside source: true *** True Line Result - args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played -** Processing line: ~ if button_clicked[:label] == args.state.target_note # if clicked note is target note~ + number % 2 != 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - if button_clicked[:label] == args.state.target_note # if clicked note is target note -** Processing line: ~ args.state.target_note = nil # target note is emptied~ + end +** Processing line: ~ puts also_even~ - Inside source: true *** True Line Result - args.state.target_note = nil # target note is emptied + puts also_even ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if args.state.current_level < 9 # if game hasn't reached level 9~ +** Processing line: ~ puts "======== Create an array that doubles every number."~ - Inside source: true *** True Line Result - if args.state.current_level < 9 # if game hasn't reached level 9 -** Processing line: ~ args.state.current_level += 1 # game goes to next level~ + puts "======== Create an array that doubles every number." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - args.state.current_level += 1 # game goes to next level -** Processing line: ~ else # otherwise, if game has reached level 9~ + one_to_ten = (1..10).to_a +** Processing line: ~ doubled = one_to_ten.map do |number|~ - Inside source: true *** True Line Result - else # otherwise, if game has reached level 9 -** Processing line: ~ args.state.game_over = true # the game is over~ + doubled = one_to_ten.map do |number| +** Processing line: ~ number * 2~ - Inside source: true *** True Line Result - args.state.game_over = true # the game is over -** Processing line: ~ end~ + number * 2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end +** Processing line: ~ puts doubled~ +- Inside source: true +*** True Line Result + puts doubled ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly~ +** Processing line: ~ puts "======== Create an array that selects only odd numbers and then multiply those by 10."~ - Inside source: true *** True Line Result - queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly -** Processing line: ~ else # otherwise, if clicked note is not target note~ + puts "======== Create an array that selects only odd numbers and then multiply those by 10." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - else # otherwise, if clicked note is not target note -** Processing line: ~ args.state.times_wrong += 1 # increments times user guessed wrong~ + one_to_ten = (1..10).to_a +** Processing line: ~ odd_doubled = one_to_ten.find_all do |number|~ - Inside source: true *** True Line Result - args.state.times_wrong += 1 # increments times user guessed wrong -** Processing line: ~ queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong~ + odd_doubled = one_to_ten.find_all do |number| +** Processing line: ~ number % 2 != 0~ - Inside source: true *** True Line Result - queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong -** Processing line: ~ end~ + number % 2 != 0 +** Processing line: ~ end.map do |odd_number|~ - Inside source: true *** True Line Result - end + end.map do |odd_number| +** Processing line: ~ odd_number * 10~ +- Inside source: true +*** True Line Result + odd_number * 10 ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~ puts odd_doubled~ - Inside source: true *** True Line Result - end + puts odd_doubled ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Creates a collection of all of the available notes as symbols~ +** Processing line: ~ puts "======== All combination of numbers 1 to 10."~ - Inside source: true *** True Line Result - # Creates a collection of all of the available notes as symbols -** Processing line: ~ def available_notes~ + puts "======== All combination of numbers 1 to 10." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - def available_notes -** Processing line: ~ [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]~ + one_to_ten = (1..10).to_a +** Processing line: ~ all_combinations = one_to_ten.product(one_to_ten)~ - Inside source: true *** True Line Result - [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4] -** Processing line: ~ end~ + all_combinations = one_to_ten.product(one_to_ten) +** Processing line: ~ puts all_combinations~ - Inside source: true *** True Line Result - end + puts all_combinations ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.~ +** Processing line: ~ puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."~ - Inside source: true *** True Line Result - # Creates buttons for each note, and sets a label (the note's name) and border for each note's button. -** Processing line: ~ def piano_button args, note, position~ + puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]." +** Processing line: ~ one_to_ten = (1..10).to_a~ - Inside source: true *** True Line Result - def piano_button args, note, position -** Processing line: ~ args.state.new_entity(:button) do |b| # declares button as new entity~ + one_to_ten = (1..10).to_a +** Processing line: ~ uniq_combinations =~ - Inside source: true *** True Line Result - args.state.new_entity(:button) do |b| # declares button as new entity -** Processing line: ~ b.label = [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition~ + uniq_combinations = +** Processing line: ~ one_to_ten.product(one_to_ten)~ - Inside source: true *** True Line Result - b.label = [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition -** Processing line: ~ b.border = { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border~ + one_to_ten.product(one_to_ten) +** Processing line: ~ .map do |unsorted_number|~ - Inside source: true *** True Line Result - b.border = { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border -** Processing line: ~ end~ + .map do |unsorted_number| +** Processing line: ~ unsorted_number.sort~ - Inside source: true *** True Line Result - end + unsorted_number.sort +** Processing line: ~ end.uniq~ +- Inside source: true +*** True Line Result + end.uniq +** Processing line: ~ puts uniq_combinations~ +- Inside source: true +*** True Line Result + puts uniq_combinations ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -93964,74 +100995,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong~ +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong -** Processing line: ~ # If a button is clicked, the inside of button is purple (see input_mouse method)~ + # ==================================================================================== +** Processing line: ~ # Advanced Arrays~ - Inside source: true *** True Line Result - # If a button is clicked, the inside of button is purple (see input_mouse method) -** Processing line: ~ # If correct note is clicked, screen turns green~ + # Advanced Arrays +** Processing line: ~ # ====================================================================================~ - Inside source: true *** True Line Result - # If correct note is clicked, screen turns green -** Processing line: ~ # If incorrect note is clicked, screen turns red (again, see input_mouse method)~ + # ==================================================================================== +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ - Inside source: true *** True Line Result - # If incorrect note is clicked, screen turns red (again, see input_mouse method) -** Processing line: ~ def queue_click_feedback args, x, y, w, h, *color~ + # Remove the x from xrepl to run the code. Add the x back to ignore to code. +** Processing line: ~ xrepl do~ - Inside source: true *** True Line Result - def queue_click_feedback args, x, y, w, h, *color -** Processing line: ~ args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity~ + xrepl do +** Processing line: ~ puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."~ - Inside source: true *** True Line Result - args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity -** Processing line: ~ c.solid = [x, y, w, h, *color, 255] # sets color~ + puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle." +** Processing line: ~~ - Inside source: true *** True Line Result - c.solid = [x, y, w, h, *color, 255] # sets color -** Processing line: ~ end~ + +** Processing line: ~ one_to_hundred = (1..40).to_a~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + one_to_hundred = (1..40).to_a +** Processing line: ~ triples =~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + triples = +** Processing line: ~ one_to_hundred.product(one_to_hundred).map do |width, height|~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick_instructions args, text, y = 715~ + one_to_hundred.product(one_to_hundred).map do |width, height| +** Processing line: ~ [width, height, Math.sqrt(width ** 2 + height ** 2)]~ - Inside source: true *** True Line Result - def tick_instructions args, text, y = 715 -** Processing line: ~ return if args.state.key_event_occurred~ + [width, height, Math.sqrt(width ** 2 + height ** 2)] +** Processing line: ~ end.find_all do |_, _, hypotenuse|~ - Inside source: true *** True Line Result - return if args.state.key_event_occurred -** Processing line: ~ if args.inputs.mouse.click ||~ + end.find_all do |_, _, hypotenuse| +** Processing line: ~ hypotenuse.to_i == hypotenuse~ - Inside source: true *** True Line Result - if args.inputs.mouse.click || -** Processing line: ~ args.inputs.keyboard.directional_vector ||~ + hypotenuse.to_i == hypotenuse +** Processing line: ~ end.map do |triangle|~ - Inside source: true *** True Line Result - args.inputs.keyboard.directional_vector || -** Processing line: ~ args.inputs.keyboard.key_down.enter ||~ + end.map do |triangle| +** Processing line: ~ triangle.map(&:to_i)~ - Inside source: true *** True Line Result - args.inputs.keyboard.key_down.enter || -** Processing line: ~ args.inputs.keyboard.key_down.escape~ + triangle.map(&:to_i) +** Processing line: ~ end.uniq do |triangle|~ - Inside source: true *** True Line Result - args.inputs.keyboard.key_down.escape -** Processing line: ~ args.state.key_event_occurred = true~ + end.uniq do |triangle| +** Processing line: ~ triangle.sort~ - Inside source: true *** True Line Result - args.state.key_event_occurred = true + triangle.sort +** Processing line: ~ end.map do |width, height, hypotenuse|~ +- Inside source: true +*** True Line Result + end.map do |width, height, hypotenuse| +** Processing line: ~ [width, height, hypotenuse, (width * height) / 2]~ +- Inside source: true +*** True Line Result + [width, height, hypotenuse, (width * height) / 2] +** Processing line: ~ end.sort_by do |_, _, _, area|~ +- Inside source: true +*** True Line Result + end.sort_by do |_, _, _, area| +** Processing line: ~ area~ +- Inside source: true +*** True Line Result + area ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -94040,18 +101087,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ +** Processing line: ~ triples.each do |width, height, hypotenuse, area|~ - Inside source: true *** True Line Result - args.outputs.debug << [0, y - 50, 1280, 60].solid -** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ + triples.each do |width, height, hypotenuse, area| +** Processing line: ~ puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"~ - Inside source: true *** True Line Result - args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label -** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ + puts "(#{width}, #{height}, #{hypotenuse}) = #{area}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -94068,122 +101115,114 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Arcade - Twinstick - main.rb~ +** Processing line: ~*** Crafting - Farming Game Starting Point - tests.rb~ - Header detected. *** True Line Result *** True Line Result -*** Arcade - Twinstick - main.rb +*** Crafting - Farming Game Starting Point - tests.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/99_genre_arcade/twinstick/app/main.rb~ -- Inside source: true -*** True Line Result - # ./samples/99_genre_arcade/twinstick/app/main.rb -** Processing line: ~ def tick args~ -- Inside source: true -*** True Line Result - def tick args -** Processing line: ~ args.state.player ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}~ +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb~ - Inside source: true *** True Line Result - args.state.player ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0} -** Processing line: ~ args.state.enemies ||= []~ + # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb +** Processing line: ~ # For advanced users:~ - Inside source: true *** True Line Result - args.state.enemies ||= [] -** Processing line: ~ args.state.player_bullets ||= []~ + # For advanced users: +** Processing line: ~ # You can put some quick verification tests here, any method~ - Inside source: true *** True Line Result - args.state.player_bullets ||= [] -** Processing line: ~ args.state.tick_count ||= -1~ + # You can put some quick verification tests here, any method +** Processing line: ~ # that starts with the `test_` will be run when you save this file.~ - Inside source: true *** True Line Result - args.state.tick_count ||= -1 -** Processing line: ~ args.state.tick_count += 1~ + # that starts with the `test_` will be run when you save this file. +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.tick_count += 1 -** Processing line: ~ spawn_enemies args~ + +** Processing line: ~ # Here is an example test and game~ - Inside source: true *** True Line Result - spawn_enemies args -** Processing line: ~ kill_enemies args~ + # Here is an example test and game +** Processing line: ~~ - Inside source: true *** True Line Result - kill_enemies args -** Processing line: ~ move_enemies args~ + +** Processing line: ~ # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick~ - Inside source: true *** True Line Result - move_enemies args -** Processing line: ~ move_bullets args~ + # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick +** Processing line: ~~ - Inside source: true *** True Line Result - move_bullets args -** Processing line: ~ move_player args~ + +** Processing line: ~ class MySuperHappyFunGame~ - Inside source: true *** True Line Result - move_player args -** Processing line: ~ fire_player args~ + class MySuperHappyFunGame +** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result - fire_player args -** Processing line: ~ args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)~ + attr_gtk +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255) -** Processing line: ~ label_color = args.state.player[:health] <= 5 ? 255 : 0~ + +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - label_color = args.state.player[:health] <= 5 ? 255 : 0 -** Processing line: ~ args.outputs.labels << [~ + def tick +** Processing line: ~ outputs.solids << [100, 100, 300, 300]~ - Inside source: true *** True Line Result - args.outputs.labels << [ -** Processing line: ~ {~ + outputs.solids << [100, 100, 300, 300] +** Processing line: ~ end~ - Inside source: true *** True Line Result - { -** Processing line: ~ x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP", -** Processing line: ~ r: label_color, g: label_color, b: label_color~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - r: label_color, g: label_color, b: label_color -** Processing line: ~ }, {~ + +** Processing line: ~ def test_universe args, assert~ - Inside source: true *** True Line Result - }, { -** Processing line: ~ x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",~ + def test_universe args, assert +** Processing line: ~ game = MySuperHappyFunGame.new~ - Inside source: true *** True Line Result - x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS", -** Processing line: ~ r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,~ + game = MySuperHappyFunGame.new +** Processing line: ~ game.args = args~ - Inside source: true *** True Line Result - r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length, -** Processing line: ~ }~ + game.args = args +** Processing line: ~ game.tick~ - Inside source: true *** True Line Result - } -** Processing line: ~ ]~ + game.tick +** Processing line: ~ assert.true! args.outputs.solids.length == 1, "failure: a solid was not added after tick"~ - Inside source: true *** True Line Result - ] -** Processing line: ~ args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]~ + assert.true! args.outputs.solids.length == 1, "failure: a solid was not added after tick" +** Processing line: ~ assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"~ - Inside source: true *** True Line Result - args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets] -** Processing line: ~ args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero~ + assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending" +** Processing line: ~ puts "test_universe completed successfully"~ - Inside source: true *** True Line Result - args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero + puts "test_universe completed successfully" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -94192,290 +101231,254 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def spawn_enemies args~ -- Inside source: true -*** True Line Result - def spawn_enemies args -** Processing line: ~ # Spawn enemies more frequently as the player's score increases.~ -- Inside source: true -*** True Line Result - # Spawn enemies more frequently as the player's score increases. -** Processing line: ~ if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?~ -- Inside source: true -*** True Line Result - if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero? -** Processing line: ~ theta = rand * Math::PI * 2~ -- Inside source: true -*** True Line Result - theta = rand * Math::PI * 2 -** Processing line: ~ args.state.enemies << {~ -- Inside source: true -*** True Line Result - args.state.enemies << { -** Processing line: ~ x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',~ -- Inside source: true -*** True Line Result - x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png', -** Processing line: ~ r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor~ +** Processing line: ~ puts "running tests"~ - Inside source: true *** True Line Result - r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor -** Processing line: ~ }~ + puts "running tests" +** Processing line: ~ $gtk.reset 100~ - Inside source: true *** True Line Result - } -** Processing line: ~ end~ + $gtk.reset 100 +** Processing line: ~ $gtk.log_level = :off~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + $gtk.log_level = :off +** Processing line: ~ $gtk.tests.start~ - Inside source: true *** True Line Result - end + $gtk.tests.start ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def kill_enemies args~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - def kill_enemies args -** Processing line: ~ args.state.enemies.reject! do |enemy|~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - args.state.enemies.reject! do |enemy| -** Processing line: ~ # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)~ -- Inside source: true + +** Processing line: ~*** Dev Tools - Add Buttons To Console - main.rb~ +- Header detected. *** True Line Result - # Check if enemy and player are within 80 pixels of each other (i.e. overlapping) -** Processing line: ~ if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2~ -- Inside source: true + *** True Line Result - if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2 -** Processing line: ~ # Enemy is touching player. Kill enemy, and reduce player HP by 1.~ -- Inside source: true +*** Dev Tools - Add Buttons To Console - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - # Enemy is touching player. Kill enemy, and reduce player HP by 1. -** Processing line: ~ args.state.player[:health] -= 1~ -- Inside source: true + *** True Line Result - args.state.player[:health] -= 1 -** Processing line: ~ else~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb~ - Inside source: true *** True Line Result - else -** Processing line: ~ args.state.player_bullets.any? do |bullet|~ + # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb +** Processing line: ~ # You can customize the buttons that show up in the Console.~ - Inside source: true *** True Line Result - args.state.player_bullets.any? do |bullet| -** Processing line: ~ # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)~ + # You can customize the buttons that show up in the Console. +** Processing line: ~ class GTK::Console::Menu~ - Inside source: true *** True Line Result - # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping) -** Processing line: ~ if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2~ + class GTK::Console::Menu +** Processing line: ~ # STEP 1: Override the custom_buttons function.~ - Inside source: true *** True Line Result - if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2 -** Processing line: ~ # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP~ + # STEP 1: Override the custom_buttons function. +** Processing line: ~ def custom_buttons~ - Inside source: true *** True Line Result - # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP -** Processing line: ~ args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0~ + def custom_buttons +** Processing line: ~ [~ - Inside source: true *** True Line Result - args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0 -** Processing line: ~ # Keep track of how many enemies have been killed by this particular bullet~ + [ +** Processing line: ~ (button id: :yay,~ - Inside source: true *** True Line Result - # Keep track of how many enemies have been killed by this particular bullet -** Processing line: ~ bullet[:kills] += 1~ + (button id: :yay, +** Processing line: ~ # row for button~ - Inside source: true *** True Line Result - bullet[:kills] += 1 -** Processing line: ~ # Earn more points by killing multiple enemies with one shot.~ + # row for button +** Processing line: ~ row: 3,~ - Inside source: true *** True Line Result - # Earn more points by killing multiple enemies with one shot. -** Processing line: ~ args.state.player[:score] += bullet[:kills]~ + row: 3, +** Processing line: ~ # column for button~ - Inside source: true *** True Line Result - args.state.player[:score] += bullet[:kills] -** Processing line: ~ end~ + # column for button +** Processing line: ~ col: 10,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + col: 10, +** Processing line: ~ # text~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # text +** Processing line: ~ text: "I AM CUSTOM",~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + text: "I AM CUSTOM", +** Processing line: ~ # when clicked call the custom_button_clicked function~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # when clicked call the custom_button_clicked function +** Processing line: ~ method: :custom_button_clicked),~ - Inside source: true *** True Line Result - end + method: :custom_button_clicked), ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def move_enemies args~ +** Processing line: ~ (button id: :yay,~ - Inside source: true *** True Line Result - def move_enemies args -** Processing line: ~ args.state.enemies.each do |enemy|~ + (button id: :yay, +** Processing line: ~ # row for button~ - Inside source: true *** True Line Result - args.state.enemies.each do |enemy| -** Processing line: ~ # Get the angle from the enemy to the player~ + # row for button +** Processing line: ~ row: 3,~ - Inside source: true *** True Line Result - # Get the angle from the enemy to the player -** Processing line: ~ theta = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)~ + row: 3, +** Processing line: ~ # column for button~ - Inside source: true *** True Line Result - theta = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x) -** Processing line: ~ # Convert the angle to a vector pointing at the player~ + # column for button +** Processing line: ~ col: 9,~ - Inside source: true *** True Line Result - # Convert the angle to a vector pointing at the player -** Processing line: ~ dx, dy = theta.to_degrees.vector 5~ + col: 9, +** Processing line: ~ # text~ - Inside source: true *** True Line Result - dx, dy = theta.to_degrees.vector 5 -** Processing line: ~ # Move the enemy towards thr player~ + # text +** Processing line: ~ text: "CUSTOM ALSO",~ - Inside source: true *** True Line Result - # Move the enemy towards thr player -** Processing line: ~ enemy.x -= dx~ + text: "CUSTOM ALSO", +** Processing line: ~ # when clicked call the custom_button_also_clicked function~ - Inside source: true *** True Line Result - enemy.x -= dx -** Processing line: ~ enemy.y -= dy~ + # when clicked call the custom_button_also_clicked function +** Processing line: ~ method: :custom_button_also_clicked)~ - Inside source: true *** True Line Result - enemy.y -= dy -** Processing line: ~ end~ + method: :custom_button_also_clicked) +** Processing line: ~ ]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def move_bullets args~ -- Inside source: true -*** True Line Result - def move_bullets args -** Processing line: ~ args.state.player_bullets.each do |bullet|~ -- Inside source: true -*** True Line Result - args.state.player_bullets.each do |bullet| -** Processing line: ~ # Move the bullets according to the bullet's velocity~ +** Processing line: ~ # STEP 2: Define the function that should be called.~ - Inside source: true *** True Line Result - # Move the bullets according to the bullet's velocity -** Processing line: ~ bullet.x += bullet[:vx]~ + # STEP 2: Define the function that should be called. +** Processing line: ~ def custom_button_clicked~ - Inside source: true *** True Line Result - bullet.x += bullet[:vx] -** Processing line: ~ bullet.y += bullet[:vy]~ + def custom_button_clicked +** Processing line: ~ log "* INFO: I AM CUSTOM was clicked!"~ - Inside source: true *** True Line Result - bullet.y += bullet[:vy] + log "* INFO: I AM CUSTOM was clicked!" ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ args.state.player_bullets.reject! do |bullet|~ +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player_bullets.reject! do |bullet| -** Processing line: ~ # Despawn bullets that are outside the screen area~ + +** Processing line: ~ def custom_button_also_clicked~ - Inside source: true *** True Line Result - # Despawn bullets that are outside the screen area -** Processing line: ~ bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740~ + def custom_button_also_clicked +** Processing line: ~ log "* INFO: Custom Button Clicked at #{Kernel.global_tick_count}!"~ - Inside source: true *** True Line Result - bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740 -** Processing line: ~ end~ + log "* INFO: Custom Button Clicked at #{Kernel.global_tick_count}!" +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ all_buttons_as_string = $gtk.console.menu.buttons.map do |b|~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + all_buttons_as_string = $gtk.console.menu.buttons.map do |b| +** Processing line: ~ <<-S.strip~ - Inside source: true *** True Line Result - -** Processing line: ~ def move_player args~ + <<-S.strip +** Processing line: ~ ** id: #{b[:id]}~ - Inside source: true *** True Line Result - def move_player args -** Processing line: ~ # Get the currently held direction.~ + ** id: #{b[:id]} +** Processing line: ~ :PROPERTIES:~ - Inside source: true *** True Line Result - # Get the currently held direction. -** Processing line: ~ dx, dy = move_directional_vector args~ + :PROPERTIES: +** Processing line: ~ :id: :#{b[:id]}~ - Inside source: true *** True Line Result - dx, dy = move_directional_vector args -** Processing line: ~ # Take the weighted average of the old velocities and the desired velocities.~ + :id: :#{b[:id]} +** Processing line: ~ :method: :#{b[:method]}~ - Inside source: true *** True Line Result - # Take the weighted average of the old velocities and the desired velocities. -** Processing line: ~ # Since move_directional_vector returns values between -1 and 1,~ + :method: :#{b[:method]} +** Processing line: ~ :text: #{b[:text]}~ - Inside source: true *** True Line Result - # Since move_directional_vector returns values between -1 and 1, -** Processing line: ~ # and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75~ + :text: #{b[:text]} +** Processing line: ~ :END:~ - Inside source: true *** True Line Result - # and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75 -** Processing line: ~ args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75~ + :END: +** Processing line: ~ S~ - Inside source: true *** True Line Result - args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75 -** Processing line: ~ args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75~ + S +** Processing line: ~ end.join("\n")~ - Inside source: true *** True Line Result - args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75 -** Processing line: ~ # Move the player~ + end.join("\n") +** Processing line: ~~ - Inside source: true *** True Line Result - # Move the player -** Processing line: ~ args.state.player.x += args.state.player[:vx]~ + +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - args.state.player.x += args.state.player[:vx] -** Processing line: ~ args.state.player.y += args.state.player[:vy]~ + log <<-S +** Processing line: ~ * INFO: Here are all the buttons:~ - Inside source: true *** True Line Result - args.state.player.y += args.state.player[:vy] -** Processing line: ~ # If the player is about to go out of bounds, put them back in bounds.~ + * INFO: Here are all the buttons: +** Processing line: ~ #{all_buttons_as_string}~ - Inside source: true *** True Line Result - # If the player is about to go out of bounds, put them back in bounds. -** Processing line: ~ args.state.player.x = args.state.player.x.clamp(0, 1201)~ + #{all_buttons_as_string} +** Processing line: ~ S~ - Inside source: true *** True Line Result - args.state.player.x = args.state.player.x.clamp(0, 1201) -** Processing line: ~ args.state.player.y = args.state.player.y.clamp(0, 640)~ + S +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.player.y = args.state.player.y.clamp(0, 640) + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -94484,622 +101487,586 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def fire_player args~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def fire_player args -** Processing line: ~ # Reduce the firing cooldown each tick~ + def tick args +** Processing line: ~ args.outputs.labels << [args.grid.center.x, args.grid.center.y,~ - Inside source: true *** True Line Result - # Reduce the firing cooldown each tick -** Processing line: ~ args.state.player[:cooldown] -= 1~ + args.outputs.labels << [args.grid.center.x, args.grid.center.y, +** Processing line: ~ "Open the DragonRuby Console to see the custom menu items.",~ - Inside source: true *** True Line Result - args.state.player[:cooldown] -= 1 -** Processing line: ~ # If the player is allowed to fire~ + "Open the DragonRuby Console to see the custom menu items.", +** Processing line: ~ 0, 1]~ - Inside source: true *** True Line Result - # If the player is allowed to fire -** Processing line: ~ if args.state.player[:cooldown] <= 0~ + 0, 1] +** Processing line: ~ end~ - Inside source: true *** True Line Result - if args.state.player[:cooldown] <= 0 -** Processing line: ~ dx, dy = shoot_directional_vector args # Get the bullet velocity~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - dx, dy = shoot_directional_vector args # Get the bullet velocity -** Processing line: ~ return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early. -** Processing line: ~ # Add a new bullet to the list of player bullets.~ -- Inside source: true +#+end_src +** Processing line: ~~ +- End of paragraph detected. *** True Line Result - # Add a new bullet to the list of player bullets. -** Processing line: ~ args.state.player_bullets << {~ -- Inside source: true + +** Processing line: ~*** Dev Tools - Animation Creator Starting Point - main.rb~ +- Header detected. *** True Line Result - args.state.player_bullets << { -** Processing line: ~ x: args.state.player.x + 30 + 40 * dx,~ -- Inside source: true + *** True Line Result - x: args.state.player.x + 30 + 40 * dx, -** Processing line: ~ y: args.state.player.y + 30 + 40 * dy,~ -- Inside source: true +*** Dev Tools - Animation Creator Starting Point - main.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - y: args.state.player.y + 30 + 40 * dy, -** Processing line: ~ w: 20, h: 20,~ -- Inside source: true + *** True Line Result - w: 20, h: 20, -** Processing line: ~ path: 'sprites/circle-white.png',~ +#+begin_src ruby +** Processing line: ~ # ./samples/99_genre_dev_tools/animation_creator_starting_point/app/main.rb~ - Inside source: true *** True Line Result - path: 'sprites/circle-white.png', -** Processing line: ~ r: 0, g: 0, b: 0,~ + # ./samples/99_genre_dev_tools/animation_creator_starting_point/app/main.rb +** Processing line: ~ class OneBitLowrezPaint~ - Inside source: true *** True Line Result - r: 0, g: 0, b: 0, -** Processing line: ~ vx: 10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity~ + class OneBitLowrezPaint +** Processing line: ~ attr_gtk~ - Inside source: true *** True Line Result - vx: 10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity -** Processing line: ~ kills: 0~ + attr_gtk +** Processing line: ~~ - Inside source: true *** True Line Result - kills: 0 -** Processing line: ~ }~ + +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - } -** Processing line: ~ args.state.player[:cooldown] = 30 # Reset the cooldown~ + def tick +** Processing line: ~ outputs.background_color = [0, 0, 0]~ - Inside source: true *** True Line Result - args.state.player[:cooldown] = 30 # Reset the cooldown -** Processing line: ~ end~ + outputs.background_color = [0, 0, 0] +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + defaults +** Processing line: ~ render_instructions~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + render_instructions +** Processing line: ~ render_canvas~ - Inside source: true *** True Line Result - -** Processing line: ~ # Custom function for getting a directional vector just for movement using WASD~ + render_canvas +** Processing line: ~ render_buttons_frame_selection~ - Inside source: true *** True Line Result - # Custom function for getting a directional vector just for movement using WASD -** Processing line: ~ def move_directional_vector args~ + render_buttons_frame_selection +** Processing line: ~ render_animation_frame_thumbnails~ - Inside source: true *** True Line Result - def move_directional_vector args -** Processing line: ~ dx = 0~ + render_animation_frame_thumbnails +** Processing line: ~ render_animation~ - Inside source: true *** True Line Result - dx = 0 -** Processing line: ~ dx += 1 if args.inputs.keyboard.d~ + render_animation +** Processing line: ~ input_mouse_click~ - Inside source: true *** True Line Result - dx += 1 if args.inputs.keyboard.d -** Processing line: ~ dx -= 1 if args.inputs.keyboard.a~ + input_mouse_click +** Processing line: ~ input_keyboard~ - Inside source: true *** True Line Result - dx -= 1 if args.inputs.keyboard.a -** Processing line: ~ dy = 0~ + input_keyboard +** Processing line: ~ calc_auto_export~ - Inside source: true *** True Line Result - dy = 0 -** Processing line: ~ dy += 1 if args.inputs.keyboard.w~ + calc_auto_export +** Processing line: ~ calc_buttons_frame_selection~ - Inside source: true *** True Line Result - dy += 1 if args.inputs.keyboard.w -** Processing line: ~ dy -= 1 if args.inputs.keyboard.s~ + calc_buttons_frame_selection +** Processing line: ~ calc_animation_frames~ - Inside source: true *** True Line Result - dy -= 1 if args.inputs.keyboard.s -** Processing line: ~ if dx != 0 && dy != 0~ + calc_animation_frames +** Processing line: ~ process_queue_create_sprite~ - Inside source: true *** True Line Result - if dx != 0 && dy != 0 -** Processing line: ~ dx *= 0.7071~ + process_queue_create_sprite +** Processing line: ~ process_queue_reset_sprite~ - Inside source: true *** True Line Result - dx *= 0.7071 -** Processing line: ~ dy *= 0.7071~ + process_queue_reset_sprite +** Processing line: ~ process_queue_update_rt_animation_frame~ - Inside source: true *** True Line Result - dy *= 0.7071 + process_queue_update_rt_animation_frame ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ [dx, dy]~ -- Inside source: true -*** True Line Result - [dx, dy] -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Custom function for getting a directional vector just for shooting using the arrow keys~ -- Inside source: true -*** True Line Result - # Custom function for getting a directional vector just for shooting using the arrow keys -** Processing line: ~ def shoot_directional_vector args~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - def shoot_directional_vector args -** Processing line: ~ dx = 0~ + def defaults +** Processing line: ~ state.animation_frames_per_second = 12~ - Inside source: true *** True Line Result - dx = 0 -** Processing line: ~ dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right~ + state.animation_frames_per_second = 12 +** Processing line: ~ queues.create_sprite ||= []~ - Inside source: true *** True Line Result - dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right -** Processing line: ~ dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left~ + queues.create_sprite ||= [] +** Processing line: ~ queues.reset_sprite ||= []~ - Inside source: true *** True Line Result - dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left -** Processing line: ~ dy = 0~ + queues.reset_sprite ||= [] +** Processing line: ~ queues.update_rt_animation_frame ||= []~ - Inside source: true *** True Line Result - dy = 0 -** Processing line: ~ dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up~ + queues.update_rt_animation_frame ||= [] +** Processing line: ~~ - Inside source: true *** True Line Result - dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up -** Processing line: ~ dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down~ + +** Processing line: ~ if !state.animation_frames~ - Inside source: true *** True Line Result - dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down -** Processing line: ~ if dx != 0 && dy != 0~ + if !state.animation_frames +** Processing line: ~ state.animation_frames ||= []~ - Inside source: true *** True Line Result - if dx != 0 && dy != 0 -** Processing line: ~ dx *= 0.7071~ + state.animation_frames ||= [] +** Processing line: ~ add_animation_frame_to_end~ - Inside source: true *** True Line Result - dx *= 0.7071 -** Processing line: ~ dy *= 0.7071~ + add_animation_frame_to_end +** Processing line: ~ end~ - Inside source: true *** True Line Result - dy *= 0.7071 -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ [dx, dy]~ + +** Processing line: ~ state.last_mouse_down ||= 0~ - Inside source: true *** True Line Result - [dx, dy] -** Processing line: ~ end~ + state.last_mouse_down ||= 0 +** Processing line: ~ state.last_mouse_up ||= 0~ - Inside source: true *** True Line Result - end -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. -*** True Line Result -#+end_src + state.last_mouse_up ||= 0 ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Crafting - Craft Game Starting Point - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Crafting - Craft Game Starting Point - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. -*** True Line Result - -*** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb~ - Inside source: true *** True Line Result - # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb -** Processing line: ~ # ==================================================~ + +** Processing line: ~ state.buttons_frame_selection.left = 10~ - Inside source: true *** True Line Result - # ================================================== -** Processing line: ~ # A NOTE TO JAM CRAFT PARTICIPANTS:~ + state.buttons_frame_selection.left = 10 +** Processing line: ~ state.buttons_frame_selection.top = grid.top - 10~ - Inside source: true *** True Line Result - # A NOTE TO JAM CRAFT PARTICIPANTS: -** Processing line: ~ # The comments and code in here are just as small piece of DragonRuby's capabilities.~ + state.buttons_frame_selection.top = grid.top - 10 +** Processing line: ~ state.buttons_frame_selection.size = 20~ - Inside source: true *** True Line Result - # The comments and code in here are just as small piece of DragonRuby's capabilities. -** Processing line: ~ # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!~ + state.buttons_frame_selection.size = 20 +** Processing line: ~~ - Inside source: true *** True Line Result - # Be sure to check out the rest of the sample apps. Start with README.txt and go from there! -** Processing line: ~ # ==================================================~ + +** Processing line: ~ defaults_canvas_sprite~ - Inside source: true *** True Line Result - # ================================================== + defaults_canvas_sprite ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # def tick args is the entry point into your game. This function is called at~ +** Processing line: ~ state.edit_mode ||= :drawing~ - Inside source: true *** True Line Result - # def tick args is the entry point into your game. This function is called at -** Processing line: ~ # a fixed update time of 60hz (60 fps).~ + state.edit_mode ||= :drawing +** Processing line: ~ end~ - Inside source: true *** True Line Result - # a fixed update time of 60hz (60 fps). -** Processing line: ~ def tick args~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ # The defaults function intitializes the game.~ + +** Processing line: ~ def defaults_canvas_sprite~ - Inside source: true *** True Line Result - # The defaults function intitializes the game. -** Processing line: ~ defaults args~ + def defaults_canvas_sprite +** Processing line: ~ rt_canvas.size = 16~ - Inside source: true *** True Line Result - defaults args -** Processing line: ~~ + rt_canvas.size = 16 +** Processing line: ~ rt_canvas.zoom = 30~ - Inside source: true *** True Line Result - -** Processing line: ~ # After the game is initialized, render it.~ + rt_canvas.zoom = 30 +** Processing line: ~ rt_canvas.width = rt_canvas.size * rt_canvas.zoom~ - Inside source: true *** True Line Result - # After the game is initialized, render it. -** Processing line: ~ render args~ + rt_canvas.width = rt_canvas.size * rt_canvas.zoom +** Processing line: ~ rt_canvas.height = rt_canvas.size * rt_canvas.zoom~ - Inside source: true *** True Line Result - render args -** Processing line: ~~ + rt_canvas.height = rt_canvas.size * rt_canvas.zoom +** Processing line: ~ rt_canvas.sprite = { x: 0,~ - Inside source: true *** True Line Result - -** Processing line: ~ # After rendering the player should be able to respond to input.~ + rt_canvas.sprite = { x: 0, +** Processing line: ~ y: 0,~ - Inside source: true *** True Line Result - # After rendering the player should be able to respond to input. -** Processing line: ~ input args~ + y: 0, +** Processing line: ~ w: rt_canvas.width,~ - Inside source: true *** True Line Result - input args -** Processing line: ~~ + w: rt_canvas.width, +** Processing line: ~ h: rt_canvas.height,~ - Inside source: true *** True Line Result - -** Processing line: ~ # After responding to input, the game performs any additional calculations.~ + h: rt_canvas.height, +** Processing line: ~ path: :rt_canvas }.center_inside_rect(x: 0, y: 0, w: 640, h: 720)~ - Inside source: true *** True Line Result - # After responding to input, the game performs any additional calculations. -** Processing line: ~ calc args~ + path: :rt_canvas }.center_inside_rect(x: 0, y: 0, w: 640, h: 720) +** Processing line: ~~ - Inside source: true *** True Line Result - calc args -** Processing line: ~ end~ + +** Processing line: ~ return unless state.tick_count == 1~ - Inside source: true *** True Line Result - end + return unless state.tick_count == 1 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def defaults args~ +** Processing line: ~ outputs[:rt_canvas].width = rt_canvas.width~ - Inside source: true *** True Line Result - def defaults args -** Processing line: ~ # hide the mouse cursor for this game, we are going to render our own cursor~ + outputs[:rt_canvas].width = rt_canvas.width +** Processing line: ~ outputs[:rt_canvas].height = rt_canvas.height~ - Inside source: true *** True Line Result - # hide the mouse cursor for this game, we are going to render our own cursor -** Processing line: ~ if args.state.tick_count == 0~ + outputs[:rt_canvas].height = rt_canvas.height +** Processing line: ~ outputs[:rt_canvas].sprites << (rt_canvas.size + 1).map_with_index do |x|~ - Inside source: true *** True Line Result - if args.state.tick_count == 0 -** Processing line: ~ args.gtk.hide_cursor~ + outputs[:rt_canvas].sprites << (rt_canvas.size + 1).map_with_index do |x| +** Processing line: ~ (rt_canvas.size + 1).map_with_index do |y|~ - Inside source: true *** True Line Result - args.gtk.hide_cursor -** Processing line: ~ end~ + (rt_canvas.size + 1).map_with_index do |y| +** Processing line: ~ path = 'sprites/square-white.png'~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + path = 'sprites/square-white.png' +** Processing line: ~ path = 'sprites/square-blue.png' if x == 7 || x == 8~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.click_ripples ||= []~ + path = 'sprites/square-blue.png' if x == 7 || x == 8 +** Processing line: ~ { x: x * rt_canvas.zoom,~ - Inside source: true *** True Line Result - args.state.click_ripples ||= [] -** Processing line: ~~ + { x: x * rt_canvas.zoom, +** Processing line: ~ y: y * rt_canvas.zoom,~ - Inside source: true *** True Line Result - -** Processing line: ~ # everything is on a 1280x720 virtual canvas, so you can~ + y: y * rt_canvas.zoom, +** Processing line: ~ w: rt_canvas.zoom,~ - Inside source: true *** True Line Result - # everything is on a 1280x720 virtual canvas, so you can -** Processing line: ~ # hardcode locations~ + w: rt_canvas.zoom, +** Processing line: ~ h: rt_canvas.zoom,~ - Inside source: true *** True Line Result - # hardcode locations -** Processing line: ~~ + h: rt_canvas.zoom, +** Processing line: ~ path: path,~ - Inside source: true *** True Line Result - -** Processing line: ~ # define the borders for where the inventory is located~ + path: path, +** Processing line: ~ a: 50 }~ - Inside source: true *** True Line Result - # define the borders for where the inventory is located -** Processing line: ~ # args.state is a data structure that accepts any arbitrary parameters~ + a: 50 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # args.state is a data structure that accepts any arbitrary parameters -** Processing line: ~ # so you can create an object graph without having to create any classes.~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # so you can create an object graph without having to create any classes. + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Bottom left is 0, 0. Top right is 1280, 720.~ +** Processing line: ~ def render_instructions~ - Inside source: true *** True Line Result - # Bottom left is 0, 0. Top right is 1280, 720. -** Processing line: ~ # The inventory area is at the top of the screen~ + def render_instructions +** Processing line: ~ instructions = [~ - Inside source: true *** True Line Result - # The inventory area is at the top of the screen -** Processing line: ~ # the number 80 is the size of all the sprites, so that is what is being~ + instructions = [ +** Processing line: ~ "* Hotkeys:",~ - Inside source: true *** True Line Result - # the number 80 is the size of all the sprites, so that is what is being -** Processing line: ~ # used to decide the with and height~ + "* Hotkeys:", +** Processing line: ~ "- d: hold to erase, release to draw.",~ - Inside source: true *** True Line Result - # used to decide the with and height -** Processing line: ~ args.state.sprite_size = 80~ + "- d: hold to erase, release to draw.", +** Processing line: ~ "- a: add frame.",~ - Inside source: true *** True Line Result - args.state.sprite_size = 80 -** Processing line: ~~ + "- a: add frame.", +** Processing line: ~ "- c: copy frame.",~ - Inside source: true *** True Line Result - -** Processing line: ~ args.state.inventory_border.w = args.state.sprite_size * 10~ + "- c: copy frame.", +** Processing line: ~ "- v: paste frame.",~ - Inside source: true *** True Line Result - args.state.inventory_border.w = args.state.sprite_size * 10 -** Processing line: ~ args.state.inventory_border.h = args.state.sprite_size * 3~ + "- v: paste frame.", +** Processing line: ~ "- x: delete frame.",~ - Inside source: true *** True Line Result - args.state.inventory_border.h = args.state.sprite_size * 3 -** Processing line: ~ args.state.inventory_border.x = 10~ + "- x: delete frame.", +** Processing line: ~ "- b: go to previous frame.",~ - Inside source: true *** True Line Result - args.state.inventory_border.x = 10 -** Processing line: ~ args.state.inventory_border.y = 710 - args.state.inventory_border.h~ + "- b: go to previous frame.", +** Processing line: ~ "- f: go to next frame.",~ - Inside source: true *** True Line Result - args.state.inventory_border.y = 710 - args.state.inventory_border.h -** Processing line: ~~ + "- f: go to next frame.", +** Processing line: ~ "- w: save to ./canvas directory.",~ - Inside source: true *** True Line Result - -** Processing line: ~ # define the borders for where the crafting area is located~ + "- w: save to ./canvas directory.", +** Processing line: ~ "- l: load from ./canvas."~ - Inside source: true *** True Line Result - # define the borders for where the crafting area is located -** Processing line: ~ # the crafting area is below the inventory area~ + "- l: load from ./canvas." +** Processing line: ~ ]~ - Inside source: true *** True Line Result - # the crafting area is below the inventory area -** Processing line: ~ # the number 80 is the size of all the sprites, so that is what is being~ + ] +** Processing line: ~~ - Inside source: true *** True Line Result - # the number 80 is the size of all the sprites, so that is what is being -** Processing line: ~ # used to decide the with and height~ + +** Processing line: ~ instructions.each.with_index do |l, i|~ - Inside source: true *** True Line Result - # used to decide the with and height -** Processing line: ~ args.state.craft_border.x = 10~ + instructions.each.with_index do |l, i| +** Processing line: ~ outputs.labels << { x: 840, y: 500 - (i * 20), text: "#{l}",~ - Inside source: true *** True Line Result - args.state.craft_border.x = 10 -** Processing line: ~ args.state.craft_border.y = 220~ + outputs.labels << { x: 840, y: 500 - (i * 20), text: "#{l}", +** Processing line: ~ r: 180, g: 180, b: 180, size_enum: 0 }~ - Inside source: true *** True Line Result - args.state.craft_border.y = 220 -** Processing line: ~ args.state.craft_border.w = args.state.sprite_size * 3~ + r: 180, g: 180, b: 180, size_enum: 0 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.craft_border.w = args.state.sprite_size * 3 -** Processing line: ~ args.state.craft_border.h = args.state.sprite_size * 3~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.craft_border.h = args.state.sprite_size * 3 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # define the area where results are located~ -- Inside source: true -*** True Line Result - # define the area where results are located -** Processing line: ~ # the crafting result is to the right of the craft area~ -- Inside source: true -*** True Line Result - # the crafting result is to the right of the craft area -** Processing line: ~ args.state.result_border.x = 10 + args.state.sprite_size * 3 + args.state.sprite_size~ +** Processing line: ~ def render_canvas~ - Inside source: true *** True Line Result - args.state.result_border.x = 10 + args.state.sprite_size * 3 + args.state.sprite_size -** Processing line: ~ args.state.result_border.y = 220 + args.state.sprite_size~ + def render_canvas +** Processing line: ~ return if state.tick_count.zero?~ - Inside source: true *** True Line Result - args.state.result_border.y = 220 + args.state.sprite_size -** Processing line: ~ args.state.result_border.w = args.state.sprite_size~ + return if state.tick_count.zero? +** Processing line: ~ outputs.sprites << rt_canvas.sprite~ - Inside source: true *** True Line Result - args.state.result_border.w = args.state.sprite_size -** Processing line: ~ args.state.result_border.h = args.state.sprite_size~ + outputs.sprites << rt_canvas.sprite +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.result_border.h = args.state.sprite_size + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # initialize items for the first time if they are nil~ +** Processing line: ~ def render_buttons_frame_selection~ - Inside source: true *** True Line Result - # initialize items for the first time if they are nil -** Processing line: ~ # you start with 15 wood, 1 chest, and 5 plank~ + def render_buttons_frame_selection +** Processing line: ~ args.outputs.primitives << state.buttons_frame_selection.items.map_with_index do |b, i|~ +- Inside source: true +*** True Line Result + args.outputs.primitives << state.buttons_frame_selection.items.map_with_index do |b, i| +** Processing line: ~ label = { x: b.x + state.buttons_frame_selection.size.half,~ - Inside source: true *** True Line Result - # you start with 15 wood, 1 chest, and 5 plank -** Processing line: ~ # Ruby has built in syntax for dictionaries (they look a lot like json objects).~ + label = { x: b.x + state.buttons_frame_selection.size.half, +** Processing line: ~ y: b.y,~ - Inside source: true *** True Line Result - # Ruby has built in syntax for dictionaries (they look a lot like json objects). -** Processing line: ~ # Ruby also has a special type called a Symbol denoted with a : followed by a word.~ + y: b.y, +** Processing line: ~ text: "#{i + 1}", r: 180, g: 180, b: 180,~ - Inside source: true *** True Line Result - # Ruby also has a special type called a Symbol denoted with a : followed by a word. -** Processing line: ~ # Symbols are nice because they remove the need for magic strings.~ + text: "#{i + 1}", r: 180, g: 180, b: 180, +** Processing line: ~ size_enum: -4, alignment_enum: 1 }.label!~ - Inside source: true *** True Line Result - # Symbols are nice because they remove the need for magic strings. -** Processing line: ~ if !args.state.items~ + size_enum: -4, alignment_enum: 1 }.label! +** Processing line: ~~ - Inside source: true *** True Line Result - if !args.state.items -** Processing line: ~ args.state.items = [~ + +** Processing line: ~ selection_border = b.merge(r: 40, g: 40, b: 40).border!~ - Inside source: true *** True Line Result - args.state.items = [ -** Processing line: ~ {~ + selection_border = b.merge(r: 40, g: 40, b: 40).border! +** Processing line: ~~ - Inside source: true *** True Line Result - { -** Processing line: ~ id: :wood, # :wood is a Symbol, this is better than using "wood" for the id~ + +** Processing line: ~ if i == state.animation_frames_selected_index~ - Inside source: true *** True Line Result - id: :wood, # :wood is a Symbol, this is better than using "wood" for the id -** Processing line: ~ quantity: 15,~ + if i == state.animation_frames_selected_index +** Processing line: ~ selection_border = b.merge(r: 40, g: 230, b: 200).border!~ - Inside source: true *** True Line Result - quantity: 15, -** Processing line: ~ path: 'sprites/wood.png',~ + selection_border = b.merge(r: 40, g: 230, b: 200).border! +** Processing line: ~ end~ - Inside source: true *** True Line Result - path: 'sprites/wood.png', -** Processing line: ~ location: :inventory,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - location: :inventory, -** Processing line: ~ ordinal_x: 0, ordinal_y: 0~ + +** Processing line: ~ [selection_border, label]~ - Inside source: true *** True Line Result - ordinal_x: 0, ordinal_y: 0 -** Processing line: ~ },~ + [selection_border, label] +** Processing line: ~ end~ - Inside source: true *** True Line Result - }, -** Processing line: ~ {~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - { -** Processing line: ~ id: :chest,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - id: :chest, -** Processing line: ~ quantity: 1,~ + +** Processing line: ~ def render_animation_frame_thumbnails~ - Inside source: true *** True Line Result - quantity: 1, -** Processing line: ~ path: 'sprites/chest.png',~ + def render_animation_frame_thumbnails +** Processing line: ~ return if state.tick_count.zero?~ - Inside source: true *** True Line Result - path: 'sprites/chest.png', -** Processing line: ~ location: :inventory,~ + return if state.tick_count.zero? +** Processing line: ~~ - Inside source: true *** True Line Result - location: :inventory, -** Processing line: ~ ordinal_x: 1, ordinal_y: 0~ + +** Processing line: ~ outputs[:current_animation_frame].width = rt_canvas.size~ - Inside source: true *** True Line Result - ordinal_x: 1, ordinal_y: 0 -** Processing line: ~ },~ + outputs[:current_animation_frame].width = rt_canvas.size +** Processing line: ~ outputs[:current_animation_frame].height = rt_canvas.size~ - Inside source: true *** True Line Result - }, -** Processing line: ~ {~ + outputs[:current_animation_frame].height = rt_canvas.size +** Processing line: ~ outputs[:current_animation_frame].solids << selected_animation_frame[:pixels].map_with_index do |f, i|~ - Inside source: true *** True Line Result - { -** Processing line: ~ id: :plank,~ + outputs[:current_animation_frame].solids << selected_animation_frame[:pixels].map_with_index do |f, i| +** Processing line: ~ { x: f.x,~ - Inside source: true *** True Line Result - id: :plank, -** Processing line: ~ quantity: 5,~ + { x: f.x, +** Processing line: ~ y: f.y,~ - Inside source: true *** True Line Result - quantity: 5, -** Processing line: ~ path: 'sprites/plank.png',~ + y: f.y, +** Processing line: ~ w: 1,~ - Inside source: true *** True Line Result - path: 'sprites/plank.png', -** Processing line: ~ location: :inventory,~ + w: 1, +** Processing line: ~ h: 1, r: 255, g: 255, b: 255 }~ - Inside source: true *** True Line Result - location: :inventory, -** Processing line: ~ ordinal_x: 2, ordinal_y: 0~ + h: 1, r: 255, g: 255, b: 255 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - ordinal_x: 2, ordinal_y: 0 -** Processing line: ~ },~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - }, -** Processing line: ~ ]~ + +** Processing line: ~ outputs.sprites << rt_canvas.sprite.merge(path: :current_animation_frame)~ - Inside source: true *** True Line Result - ] + outputs.sprites << rt_canvas.sprite.merge(path: :current_animation_frame) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ +** Processing line: ~ state.animation_frames.map_with_index do |animation_frame, animation_frame_index|~ - Inside source: true *** True Line Result - # after initializing the oridinal positions, derive the pixel -** Processing line: ~ # locations assuming that the width and height are 80~ + state.animation_frames.map_with_index do |animation_frame, animation_frame_index| +** Processing line: ~ outputs.sprites << state.buttons_frame_selection[:items][animation_frame_index][:inner_rect]~ - Inside source: true *** True Line Result - # locations assuming that the width and height are 80 -** Processing line: ~ args.state.items.each { |item| set_inventory_position args, item }~ + outputs.sprites << state.buttons_frame_selection[:items][animation_frame_index][:inner_rect] +** Processing line: ~ .merge(path: animation_frame[:rt_name])~ - Inside source: true *** True Line Result - args.state.items.each { |item| set_inventory_position args, item } + .merge(path: animation_frame[:rt_name]) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -95108,558 +102075,542 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # define all the oridinal positions of the inventory slots~ +** Processing line: ~ def render_animation~ - Inside source: true *** True Line Result - # define all the oridinal positions of the inventory slots -** Processing line: ~ if !args.state.inventory_area~ + def render_animation +** Processing line: ~ sprite_index = 0.frame_index count: state.animation_frames.length,~ - Inside source: true *** True Line Result - if !args.state.inventory_area -** Processing line: ~ args.state.inventory_area = [~ + sprite_index = 0.frame_index count: state.animation_frames.length, +** Processing line: ~ hold_for: 60 / state.animation_frames_per_second,~ - Inside source: true *** True Line Result - args.state.inventory_area = [ -** Processing line: ~ { ordinal_x: 0, ordinal_y: 0 },~ + hold_for: 60 / state.animation_frames_per_second, +** Processing line: ~ repeat: true~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 0 },~ + repeat: true +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 0 },~ + +** Processing line: ~ args.outputs.sprites << { x: 700 - 8,~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 3, ordinal_y: 0 },~ + args.outputs.sprites << { x: 700 - 8, +** Processing line: ~ y: 120,~ - Inside source: true *** True Line Result - { ordinal_x: 3, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 4, ordinal_y: 0 },~ + y: 120, +** Processing line: ~ w: 16,~ - Inside source: true *** True Line Result - { ordinal_x: 4, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 5, ordinal_y: 0 },~ + w: 16, +** Processing line: ~ h: 16,~ - Inside source: true *** True Line Result - { ordinal_x: 5, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 6, ordinal_y: 0 },~ + h: 16, +** Processing line: ~ path: (sprite_path sprite_index) }~ - Inside source: true *** True Line Result - { ordinal_x: 6, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 7, ordinal_y: 0 },~ + path: (sprite_path sprite_index) } +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 7, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 8, ordinal_y: 0 },~ + +** Processing line: ~ args.outputs.sprites << { x: 700 - 16,~ - Inside source: true *** True Line Result - { ordinal_x: 8, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 9, ordinal_y: 0 },~ + args.outputs.sprites << { x: 700 - 16, +** Processing line: ~ y: 230,~ - Inside source: true *** True Line Result - { ordinal_x: 9, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 0, ordinal_y: 1 },~ + y: 230, +** Processing line: ~ w: 32,~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 1 },~ + w: 32, +** Processing line: ~ h: 32,~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 1 },~ + h: 32, +** Processing line: ~ path: (sprite_path sprite_index) }~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 3, ordinal_y: 1 },~ + path: (sprite_path sprite_index) } +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 3, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 4, ordinal_y: 1 },~ + +** Processing line: ~ args.outputs.sprites << { x: 700 - 32,~ - Inside source: true *** True Line Result - { ordinal_x: 4, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 5, ordinal_y: 1 },~ + args.outputs.sprites << { x: 700 - 32, +** Processing line: ~ y: 360,~ - Inside source: true *** True Line Result - { ordinal_x: 5, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 6, ordinal_y: 1 },~ + y: 360, +** Processing line: ~ w: 64,~ - Inside source: true *** True Line Result - { ordinal_x: 6, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 7, ordinal_y: 1 },~ + w: 64, +** Processing line: ~ h: 64,~ - Inside source: true *** True Line Result - { ordinal_x: 7, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 8, ordinal_y: 1 },~ + h: 64, +** Processing line: ~ path: (sprite_path sprite_index) }~ - Inside source: true *** True Line Result - { ordinal_x: 8, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 9, ordinal_y: 1 },~ + path: (sprite_path sprite_index) } +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 9, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 0, ordinal_y: 2 },~ + +** Processing line: ~ args.outputs.sprites << { x: 700 - 64,~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 2 },~ + args.outputs.sprites << { x: 700 - 64, +** Processing line: ~ y: 520,~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 2 },~ + y: 520, +** Processing line: ~ w: 128,~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 3, ordinal_y: 2 },~ + w: 128, +** Processing line: ~ h: 128,~ - Inside source: true *** True Line Result - { ordinal_x: 3, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 4, ordinal_y: 2 },~ + h: 128, +** Processing line: ~ path: (sprite_path sprite_index) }~ - Inside source: true *** True Line Result - { ordinal_x: 4, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 5, ordinal_y: 2 },~ + path: (sprite_path sprite_index) } +** Processing line: ~ end~ - Inside source: true *** True Line Result - { ordinal_x: 5, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 6, ordinal_y: 2 },~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 6, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 7, ordinal_y: 2 },~ + +** Processing line: ~ def input_mouse_click~ - Inside source: true *** True Line Result - { ordinal_x: 7, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 8, ordinal_y: 2 },~ + def input_mouse_click +** Processing line: ~ if inputs.mouse.up~ - Inside source: true *** True Line Result - { ordinal_x: 8, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 9, ordinal_y: 2 },~ + if inputs.mouse.up +** Processing line: ~ state.last_mouse_up = state.tick_count~ - Inside source: true *** True Line Result - { ordinal_x: 9, ordinal_y: 2 }, -** Processing line: ~ ]~ + state.last_mouse_up = state.tick_count +** Processing line: ~ elsif inputs.mouse.moved && user_is_editing?~ - Inside source: true *** True Line Result - ] -** Processing line: ~~ + elsif inputs.mouse.moved && user_is_editing? +** Processing line: ~ edit_current_animation_frame inputs.mouse.point~ - Inside source: true *** True Line Result - -** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ + edit_current_animation_frame inputs.mouse.point +** Processing line: ~ end~ - Inside source: true *** True Line Result - # after initializing the oridinal positions, derive the pixel -** Processing line: ~ # locations assuming that the width and height are 80~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # locations assuming that the width and height are 80 -** Processing line: ~ args.state.inventory_area.each { |i| set_inventory_position args, i }~ + +** Processing line: ~ return unless inputs.mouse.click~ - Inside source: true *** True Line Result - args.state.inventory_area.each { |i| set_inventory_position args, i } + return unless inputs.mouse.click ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if you want to see the result you can use the Ruby function called "puts".~ +** Processing line: ~ clicked_frame_button = state.buttons_frame_selection.items.find do |b|~ - Inside source: true *** True Line Result - # if you want to see the result you can use the Ruby function called "puts". -** Processing line: ~ # Uncomment this line to see the value.~ + clicked_frame_button = state.buttons_frame_selection.items.find do |b| +** Processing line: ~ inputs.mouse.point.inside_rect? b~ - Inside source: true *** True Line Result - # Uncomment this line to see the value. -** Processing line: ~ # puts args.state.inventory_area~ + inputs.mouse.point.inside_rect? b +** Processing line: ~ end~ - Inside source: true *** True Line Result - # puts args.state.inventory_area + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.~ +** Processing line: ~ if (clicked_frame_button)~ - Inside source: true *** True Line Result - # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt. -** Processing line: ~ # To bring up DragonRuby's Console, press the ~ key within the game.~ + if (clicked_frame_button) +** Processing line: ~ state.animation_frames_selected_index = clicked_frame_button[:index]~ - Inside source: true *** True Line Result - # To bring up DragonRuby's Console, press the ~ key within the game. -** Processing line: ~ end~ + state.animation_frames_selected_index = clicked_frame_button[:index] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # define all the oridinal positions of the craft slots~ -- Inside source: true -*** True Line Result - # define all the oridinal positions of the craft slots -** Processing line: ~ if !args.state.craft_area~ +** Processing line: ~ if (inputs.mouse.point.inside_rect? rt_canvas.sprite)~ - Inside source: true *** True Line Result - if !args.state.craft_area -** Processing line: ~ args.state.craft_area = [~ + if (inputs.mouse.point.inside_rect? rt_canvas.sprite) +** Processing line: ~ state.last_mouse_down = state.tick_count~ - Inside source: true *** True Line Result - args.state.craft_area = [ -** Processing line: ~ { ordinal_x: 0, ordinal_y: 0 },~ + state.last_mouse_down = state.tick_count +** Processing line: ~ edit_current_animation_frame inputs.mouse.point~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 0, ordinal_y: 1 },~ + edit_current_animation_frame inputs.mouse.point +** Processing line: ~ end~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 0, ordinal_y: 2 },~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - { ordinal_x: 0, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 0 },~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 1 },~ + +** Processing line: ~ def input_keyboard~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 1, ordinal_y: 2 },~ + def input_keyboard +** Processing line: ~ # w to save~ - Inside source: true *** True Line Result - { ordinal_x: 1, ordinal_y: 2 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 0 },~ + # w to save +** Processing line: ~ if inputs.keyboard.key_down.w~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 0 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 1 },~ + if inputs.keyboard.key_down.w +** Processing line: ~ t = Time.now~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 1 }, -** Processing line: ~ { ordinal_x: 2, ordinal_y: 2 },~ + t = Time.now +** Processing line: ~ state.save_description = "Time: #{t} (#{t.to_i})"~ - Inside source: true *** True Line Result - { ordinal_x: 2, ordinal_y: 2 }, -** Processing line: ~ ]~ + state.save_description = "Time: #{t} (#{t.to_i})" +** Processing line: ~ gtk.serialize_state 'canvas/state.txt', state~ - Inside source: true *** True Line Result - ] -** Processing line: ~~ + gtk.serialize_state 'canvas/state.txt', state +** Processing line: ~ gtk.serialize_state "tmp/canvas_backups/#{t.to_i}/state.txt", state~ - Inside source: true *** True Line Result - -** Processing line: ~ # after initializing the oridinal positions, derive the pixel~ + gtk.serialize_state "tmp/canvas_backups/#{t.to_i}/state.txt", state +** Processing line: ~ animation_frames.each_with_index do |animation_frame, i|~ - Inside source: true *** True Line Result - # after initializing the oridinal positions, derive the pixel -** Processing line: ~ # locations assuming that the width and height are 80~ + animation_frames.each_with_index do |animation_frame, i| +** Processing line: ~ queues.update_rt_animation_frame << { index: i,~ - Inside source: true *** True Line Result - # locations assuming that the width and height are 80 -** Processing line: ~ args.state.craft_area.each { |c| set_craft_position args, c }~ + queues.update_rt_animation_frame << { index: i, +** Processing line: ~ at: state.tick_count + i,~ - Inside source: true *** True Line Result - args.state.craft_area.each { |c| set_craft_position args, c } -** Processing line: ~ end~ + at: state.tick_count + i, +** Processing line: ~ queue_sprite_creation: true }~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + queue_sprite_creation: true } +** Processing line: ~ queues.create_sprite << { index: i,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + queues.create_sprite << { index: i, +** Processing line: ~ at: state.tick_count + animation_frames.length + i,~ - Inside source: true *** True Line Result - -** Processing line: ~~ + at: state.tick_count + animation_frames.length + i, +** Processing line: ~ path_override: "tmp/canvas_backups/#{t.to_i}/sprite-#{i}.png" }~ - Inside source: true *** True Line Result - -** Processing line: ~ def render args~ + path_override: "tmp/canvas_backups/#{t.to_i}/sprite-#{i}.png" } +** Processing line: ~ end~ - Inside source: true *** True Line Result - def render args -** Processing line: ~ # for the results area, create a sprite that show its boundaries~ + end +** Processing line: ~ gtk.notify! "Canvas saved."~ - Inside source: true *** True Line Result - # for the results area, create a sprite that show its boundaries -** Processing line: ~ args.outputs.primitives << { x: args.state.result_border.x,~ + gtk.notify! "Canvas saved." +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.primitives << { x: args.state.result_border.x, -** Processing line: ~ y: args.state.result_border.y,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - y: args.state.result_border.y, -** Processing line: ~ w: args.state.result_border.w,~ + +** Processing line: ~ # l to load~ - Inside source: true *** True Line Result - w: args.state.result_border.w, -** Processing line: ~ h: args.state.result_border.h,~ + # l to load +** Processing line: ~ if inputs.keyboard.key_down.l~ - Inside source: true *** True Line Result - h: args.state.result_border.h, -** Processing line: ~ path: 'sprites/border-black.png' }~ + if inputs.keyboard.key_down.l +** Processing line: ~ args.state = gtk.deserialize_state 'canvas/state.txt'~ - Inside source: true *** True Line Result - path: 'sprites/border-black.png' } -** Processing line: ~~ + args.state = gtk.deserialize_state 'canvas/state.txt' +** Processing line: ~ animation_frames.each_with_index do |a, i|~ - Inside source: true *** True Line Result - -** Processing line: ~ # for each inventory spot, create a sprite~ + animation_frames.each_with_index do |a, i| +** Processing line: ~ queues.update_rt_animation_frame << { index: i,~ - Inside source: true *** True Line Result - # for each inventory spot, create a sprite -** Processing line: ~ # args.outputs.primitives is how DragonRuby performs a render.~ + queues.update_rt_animation_frame << { index: i, +** Processing line: ~ at: state.tick_count + i,~ - Inside source: true *** True Line Result - # args.outputs.primitives is how DragonRuby performs a render. -** Processing line: ~ # Adding a single hash or multiple hashes to this array will tell~ + at: state.tick_count + i, +** Processing line: ~ queue_sprite_creation: true }~ - Inside source: true *** True Line Result - # Adding a single hash or multiple hashes to this array will tell -** Processing line: ~ # DragonRuby to render those primitives on that frame.~ + queue_sprite_creation: true } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # DragonRuby to render those primitives on that frame. -** Processing line: ~~ + end +** Processing line: ~ gtk.notify! "Canvas loaded."~ - Inside source: true *** True Line Result - -** Processing line: ~ # The .map function on Array is used instead of any kind of looping.~ + gtk.notify! "Canvas loaded." +** Processing line: ~ end~ - Inside source: true *** True Line Result - # The .map function on Array is used instead of any kind of looping. -** Processing line: ~ # .map returns a new object for every object within an Array.~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # .map returns a new object for every object within an Array. -** Processing line: ~ args.outputs.primitives << args.state.inventory_area.map do |a|~ + +** Processing line: ~ # d to go into delete mode, release to paint~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.inventory_area.map do |a| -** Processing line: ~ { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~ + # d to go into delete mode, release to paint +** Processing line: ~ if inputs.keyboard.key_held.d~ - Inside source: true *** True Line Result - { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' } -** Processing line: ~ end~ + if inputs.keyboard.key_held.d +** Processing line: ~ state.edit_mode = :erasing~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.edit_mode = :erasing +** Processing line: ~ gtk.notify! "Erasing." if inputs.keyboard.key_held.d == (state.tick_count - 1)~ - Inside source: true *** True Line Result - -** Processing line: ~ # for each craft spot, create a sprite~ + gtk.notify! "Erasing." if inputs.keyboard.key_held.d == (state.tick_count - 1) +** Processing line: ~ elsif inputs.keyboard.key_up.d~ - Inside source: true *** True Line Result - # for each craft spot, create a sprite -** Processing line: ~ args.outputs.primitives << args.state.craft_area.map do |a|~ + elsif inputs.keyboard.key_up.d +** Processing line: ~ state.edit_mode = :drawing~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.craft_area.map do |a| -** Processing line: ~ { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~ + state.edit_mode = :drawing +** Processing line: ~ gtk.notify! "Drawing."~ - Inside source: true *** True Line Result - { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' } -** Processing line: ~ end~ + gtk.notify! "Drawing." +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # after the borders have been rendered, render the~ -- Inside source: true -*** True Line Result - # after the borders have been rendered, render the -** Processing line: ~ # items within those slots (and allow for highlighting)~ +** Processing line: ~ # a to add a frame to the end~ - Inside source: true *** True Line Result - # items within those slots (and allow for highlighting) -** Processing line: ~ # if an item isn't currently being held~ + # a to add a frame to the end +** Processing line: ~ if inputs.keyboard.key_down.a~ - Inside source: true *** True Line Result - # if an item isn't currently being held -** Processing line: ~ allow_inventory_highlighting = !args.state.held_item~ + if inputs.keyboard.key_down.a +** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - allow_inventory_highlighting = !args.state.held_item -** Processing line: ~~ + queues.create_sprite << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count }~ - Inside source: true *** True Line Result - -** Processing line: ~ # go through each item and render them~ + at: state.tick_count } +** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index + 1,~ - Inside source: true *** True Line Result - # go through each item and render them -** Processing line: ~ # use Array's find_all method to remove any items that are currently being held~ + queues.create_sprite << { index: state.animation_frames_selected_index + 1, +** Processing line: ~ at: state.tick_count }~ - Inside source: true *** True Line Result - # use Array's find_all method to remove any items that are currently being held -** Processing line: ~ args.state.items.find_all { |item| item[:location] != :held }.map do |item|~ + at: state.tick_count } +** Processing line: ~ add_animation_frame_to_end~ - Inside source: true *** True Line Result - args.state.items.find_all { |item| item[:location] != :held }.map do |item| -** Processing line: ~ # if an item is currently being held, don't render it in it's spot within the~ + add_animation_frame_to_end +** Processing line: ~ gtk.notify! "Frame added to end."~ - Inside source: true *** True Line Result - # if an item is currently being held, don't render it in it's spot within the -** Processing line: ~ # inventory or craft area (this is handled via the find_all method).~ + gtk.notify! "Frame added to end." +** Processing line: ~ end~ - Inside source: true *** True Line Result - # inventory or craft area (this is handled via the find_all method). + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # the item_prefab returns a hash containing all the visual components of an item.~ +** Processing line: ~ # c or t to copy~ - Inside source: true *** True Line Result - # the item_prefab returns a hash containing all the visual components of an item. -** Processing line: ~ # the main sprite, the black background, the quantity text, and a hover indication~ + # c or t to copy +** Processing line: ~ if (inputs.keyboard.key_down.c || inputs.keyboard.key_down.t)~ - Inside source: true *** True Line Result - # the main sprite, the black background, the quantity text, and a hover indication -** Processing line: ~ # if the mouse is currently hovering over the item.~ + if (inputs.keyboard.key_down.c || inputs.keyboard.key_down.t) +** Processing line: ~ state.clipboard = [selected_animation_frame[:pixels]].flatten~ - Inside source: true *** True Line Result - # if the mouse is currently hovering over the item. -** Processing line: ~ args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)~ + state.clipboard = [selected_animation_frame[:pixels]].flatten +** Processing line: ~ gtk.notify! "Current frame copied."~ - Inside source: true *** True Line Result - args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse) -** Processing line: ~ end~ + gtk.notify! "Current frame copied." +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # The last thing we want to render is the item currently being held.~ +** Processing line: ~ # v or q to paste~ - Inside source: true *** True Line Result - # The last thing we want to render is the item currently being held. -** Processing line: ~ args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)~ + # v or q to paste +** Processing line: ~ if (inputs.keyboard.key_down.v || inputs.keyboard.key_down.q) && state.clipboard~ - Inside source: true *** True Line Result - args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse) -** Processing line: ~~ + if (inputs.keyboard.key_down.v || inputs.keyboard.key_down.q) && state.clipboard +** Processing line: ~ selected_animation_frame[:pixels] = [state.clipboard].flatten~ - Inside source: true *** True Line Result - -** Processing line: ~ args.outputs.primitives << args.state.click_ripples~ + selected_animation_frame[:pixels] = [state.clipboard].flatten +** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - args.outputs.primitives << args.state.click_ripples -** Processing line: ~~ + queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count,~ - Inside source: true *** True Line Result - -** Processing line: ~ # render a mouse cursor since we have the OS cursor hidden~ + at: state.tick_count, +** Processing line: ~ queue_sprite_creation: true }~ - Inside source: true *** True Line Result - # render a mouse cursor since we have the OS cursor hidden -** Processing line: ~ args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~ + queue_sprite_creation: true } +** Processing line: ~ gtk.notify! "Pasted."~ - Inside source: true *** True Line Result - args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 } -** Processing line: ~ end~ + gtk.notify! "Pasted." +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Alrighty! This is where all the fun happens~ -- Inside source: true -*** True Line Result - # Alrighty! This is where all the fun happens -** Processing line: ~ def input args~ -- Inside source: true -*** True Line Result - def input args -** Processing line: ~ # if the mouse is clicked and not item is currently being held~ +** Processing line: ~ # f to go forward/next frame~ - Inside source: true *** True Line Result - # if the mouse is clicked and not item is currently being held -** Processing line: ~ # args.state.held_item is nil when the game starts.~ + # f to go forward/next frame +** Processing line: ~ if (inputs.keyboard.key_down.f)~ - Inside source: true *** True Line Result - # args.state.held_item is nil when the game starts. -** Processing line: ~ # If the player clicks, the property args.inputs.mouse.click will~ + if (inputs.keyboard.key_down.f) +** Processing line: ~ if (state.animation_frames_selected_index == (state.animation_frames.length - 1))~ - Inside source: true *** True Line Result - # If the player clicks, the property args.inputs.mouse.click will -** Processing line: ~ # be a non nil value, we don't want to process any of the code here~ + if (state.animation_frames_selected_index == (state.animation_frames.length - 1)) +** Processing line: ~ state.animation_frames_selected_index = 0~ - Inside source: true *** True Line Result - # be a non nil value, we don't want to process any of the code here -** Processing line: ~ # if the mouse hasn't been clicked~ + state.animation_frames_selected_index = 0 +** Processing line: ~ else~ - Inside source: true *** True Line Result - # if the mouse hasn't been clicked -** Processing line: ~ return if !args.inputs.mouse.click~ + else +** Processing line: ~ state.animation_frames_selected_index += 1~ - Inside source: true *** True Line Result - return if !args.inputs.mouse.click -** Processing line: ~~ + state.animation_frames_selected_index += 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # if a click occurred, add a ripple to the ripple queue~ + end +** Processing line: ~ gtk.notify! "Next frame."~ - Inside source: true *** True Line Result - # if a click occurred, add a ripple to the ripple queue -** Processing line: ~ args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~ + gtk.notify! "Next frame." +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if the mouse has been clicked, and no item is currently held...~ +** Processing line: ~ # b to go back/previous frame~ - Inside source: true *** True Line Result - # if the mouse has been clicked, and no item is currently held... -** Processing line: ~ if !args.state.held_item~ + # b to go back/previous frame +** Processing line: ~ if (inputs.keyboard.key_down.b)~ - Inside source: true *** True Line Result - if !args.state.held_item -** Processing line: ~ # see if any of the items intersect the pointer using the inside_rect? method~ + if (inputs.keyboard.key_down.b) +** Processing line: ~ if (state.animation_frames_selected_index == 0)~ - Inside source: true *** True Line Result - # see if any of the items intersect the pointer using the inside_rect? method -** Processing line: ~ # the find method will either return the first object that returns true~ + if (state.animation_frames_selected_index == 0) +** Processing line: ~ state.animation_frames_selected_index = state.animation_frames.length - 1~ - Inside source: true *** True Line Result - # the find method will either return the first object that returns true -** Processing line: ~ # for the match clause, or it'll return nil if nothing matches the match clause~ + state.animation_frames_selected_index = state.animation_frames.length - 1 +** Processing line: ~ else~ - Inside source: true *** True Line Result - # for the match clause, or it'll return nil if nothing matches the match clause -** Processing line: ~ found = args.state.items.find do |item|~ + else +** Processing line: ~ state.animation_frames_selected_index -= 1~ - Inside source: true *** True Line Result - found = args.state.items.find do |item| -** Processing line: ~ # for each item in args.state.items, run the following boolean check~ + state.animation_frames_selected_index -= 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # for each item in args.state.items, run the following boolean check -** Processing line: ~ args.inputs.mouse.click.point.inside_rect?(item)~ + end +** Processing line: ~ gtk.notify! "Previous frame."~ - Inside source: true *** True Line Result - args.inputs.mouse.click.point.inside_rect?(item) + gtk.notify! "Previous frame." ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -95668,326 +102619,302 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # if an item intersects the mouse pointer, then set the item's location to :held and~ -- Inside source: true -*** True Line Result - # if an item intersects the mouse pointer, then set the item's location to :held and -** Processing line: ~ # set args.state.held_item to the item for later reference~ +** Processing line: ~ # x to delete frame~ - Inside source: true *** True Line Result - # set args.state.held_item to the item for later reference -** Processing line: ~ if found~ + # x to delete frame +** Processing line: ~ if (inputs.keyboard.key_down.x) && animation_frames.length > 1~ - Inside source: true *** True Line Result - if found -** Processing line: ~ args.state.held_item = found~ + if (inputs.keyboard.key_down.x) && animation_frames.length > 1 +** Processing line: ~ state.clipboard = selected_animation_frame[:pixels]~ - Inside source: true *** True Line Result - args.state.held_item = found -** Processing line: ~ found[:location] = :held~ + state.clipboard = selected_animation_frame[:pixels] +** Processing line: ~ state.animation_frames = animation_frames.find_all { |v| v[:index] != state.animation_frames_selected_index }~ - Inside source: true *** True Line Result - found[:location] = :held -** Processing line: ~ end~ + state.animation_frames = animation_frames.find_all { |v| v[:index] != state.animation_frames_selected_index } +** Processing line: ~ if state.animation_frames_selected_index >= state.animation_frames.length~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if state.animation_frames_selected_index >= state.animation_frames.length +** Processing line: ~ state.animation_frames_selected_index = state.animation_frames.length - 1~ - Inside source: true *** True Line Result - -** Processing line: ~ # if the mouse is clicked and an item is currently beign held....~ + state.animation_frames_selected_index = state.animation_frames.length - 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # if the mouse is clicked and an item is currently beign held.... -** Processing line: ~ elsif args.state.held_item~ + end +** Processing line: ~ gtk.notify! "Frame deleted."~ - Inside source: true *** True Line Result - elsif args.state.held_item -** Processing line: ~ # determine if a slot within the craft area was clicked~ + gtk.notify! "Frame deleted." +** Processing line: ~ end~ - Inside source: true *** True Line Result - # determine if a slot within the craft area was clicked -** Processing line: ~ craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # also determine if a slot within the inventory area was clicked~ -- Inside source: true -*** True Line Result - # also determine if a slot within the inventory area was clicked -** Processing line: ~ inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~ -- Inside source: true -*** True Line Result - inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a } -** Processing line: ~~ +** Processing line: ~ def calc_auto_export~ - Inside source: true *** True Line Result - -** Processing line: ~ # if the click was within a craft area~ + def calc_auto_export +** Processing line: ~ return if user_is_editing?~ - Inside source: true *** True Line Result - # if the click was within a craft area -** Processing line: ~ if craft_area~ + return if user_is_editing? +** Processing line: ~ return if state.last_mouse_up.elapsed_time != 30~ - Inside source: true *** True Line Result - if craft_area -** Processing line: ~ # check to see if an item is already there and ignore the click if an item is found~ + return if state.last_mouse_up.elapsed_time != 30 +** Processing line: ~ # auto export current animation frame if there is no editing for 30 ticks~ - Inside source: true *** True Line Result - # check to see if an item is already there and ignore the click if an item is found -** Processing line: ~ # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal~ + # auto export current animation frame if there is no editing for 30 ticks +** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal -** Processing line: ~ # position~ + queues.create_sprite << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count }~ - Inside source: true *** True Line Result - # position -** Processing line: ~ item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]~ + at: state.tick_count } +** Processing line: ~ end~ - Inside source: true *** True Line Result - item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y] + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if an item *doesn't* exist in the craft area~ -- Inside source: true -*** True Line Result - # if an item *doesn't* exist in the craft area -** Processing line: ~ if !item_already_there~ -- Inside source: true -*** True Line Result - if !item_already_there -** Processing line: ~ # if the quantity they are currently holding is greater than 1~ -- Inside source: true -*** True Line Result - # if the quantity they are currently holding is greater than 1 -** Processing line: ~ if args.state.held_item[:quantity] > 1~ +** Processing line: ~ def calc_buttons_frame_selection~ - Inside source: true *** True Line Result - if args.state.held_item[:quantity] > 1 -** Processing line: ~ # remove one item (creating a seperate item of the same type), and place it~ + def calc_buttons_frame_selection +** Processing line: ~ state.buttons_frame_selection.items = animation_frames.length.map_with_index do |i|~ - Inside source: true *** True Line Result - # remove one item (creating a seperate item of the same type), and place it -** Processing line: ~ # at the oridinal position and location of the craft area~ + state.buttons_frame_selection.items = animation_frames.length.map_with_index do |i| +** Processing line: ~ { x: state.buttons_frame_selection.left + i * state.buttons_frame_selection.size,~ - Inside source: true *** True Line Result - # at the oridinal position and location of the craft area -** Processing line: ~ # the .merge method on Hash creates a new Hash, but updates any values~ + { x: state.buttons_frame_selection.left + i * state.buttons_frame_selection.size, +** Processing line: ~ y: state.buttons_frame_selection.top - state.buttons_frame_selection.size,~ - Inside source: true *** True Line Result - # the .merge method on Hash creates a new Hash, but updates any values -** Processing line: ~ # passed as arguments to merge~ + y: state.buttons_frame_selection.top - state.buttons_frame_selection.size, +** Processing line: ~ inner_rect: {~ - Inside source: true *** True Line Result - # passed as arguments to merge -** Processing line: ~ new_item = args.state.held_item.merge(quantity: 1,~ + inner_rect: { +** Processing line: ~ x: (state.buttons_frame_selection.left + 2) + i * state.buttons_frame_selection.size,~ - Inside source: true *** True Line Result - new_item = args.state.held_item.merge(quantity: 1, -** Processing line: ~ location: :craft,~ + x: (state.buttons_frame_selection.left + 2) + i * state.buttons_frame_selection.size, +** Processing line: ~ y: (state.buttons_frame_selection.top - state.buttons_frame_selection.size + 2),~ - Inside source: true *** True Line Result - location: :craft, -** Processing line: ~ ordinal_x: craft_area[:ordinal_x],~ + y: (state.buttons_frame_selection.top - state.buttons_frame_selection.size + 2), +** Processing line: ~ w: 16,~ - Inside source: true *** True Line Result - ordinal_x: craft_area[:ordinal_x], -** Processing line: ~ ordinal_y: craft_area[:ordinal_y])~ + w: 16, +** Processing line: ~ h: 16,~ - Inside source: true *** True Line Result - ordinal_y: craft_area[:ordinal_y]) -** Processing line: ~~ + h: 16, +** Processing line: ~ },~ - Inside source: true *** True Line Result - -** Processing line: ~ # after the item is crated, place it into the args.state.items collection~ + }, +** Processing line: ~ w: state.buttons_frame_selection.size,~ - Inside source: true *** True Line Result - # after the item is crated, place it into the args.state.items collection -** Processing line: ~ args.state.items << new_item~ + w: state.buttons_frame_selection.size, +** Processing line: ~ h: state.buttons_frame_selection.size,~ - Inside source: true *** True Line Result - args.state.items << new_item -** Processing line: ~~ + h: state.buttons_frame_selection.size, +** Processing line: ~ index: i }~ - Inside source: true *** True Line Result - -** Processing line: ~ # then subtract one from the held item~ + index: i } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # then subtract one from the held item -** Processing line: ~ args.state.held_item[:quantity] -= 1~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.held_item[:quantity] -= 1 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if the craft area is available and there is only one item being held~ -- Inside source: true -*** True Line Result - # if the craft area is available and there is only one item being held -** Processing line: ~ elsif args.state.held_item[:quantity] == 1~ +** Processing line: ~ def calc_animation_frames~ - Inside source: true *** True Line Result - elsif args.state.held_item[:quantity] == 1 -** Processing line: ~ # instead of creating any new items just set the location of the held item~ + def calc_animation_frames +** Processing line: ~ animation_frames.each_with_index do |animation_frame, i|~ - Inside source: true *** True Line Result - # instead of creating any new items just set the location of the held item -** Processing line: ~ # to the oridinal position of the craft area, and then nil out the~ + animation_frames.each_with_index do |animation_frame, i| +** Processing line: ~ animation_frame[:index] = i~ - Inside source: true *** True Line Result - # to the oridinal position of the craft area, and then nil out the -** Processing line: ~ # held item state so that a new item can be picked up~ + animation_frame[:index] = i +** Processing line: ~ animation_frame[:rt_name] = "animation_frame_#{i}"~ - Inside source: true *** True Line Result - # held item state so that a new item can be picked up -** Processing line: ~ args.state.held_item[:location] = :craft~ + animation_frame[:rt_name] = "animation_frame_#{i}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.held_item[:location] = :craft -** Processing line: ~ args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.held_item[:ordinal_x] = craft_area[:ordinal_x] -** Processing line: ~ args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.held_item[:ordinal_y] = craft_area[:ordinal_y] -** Processing line: ~ args.state.held_item = nil~ + +** Processing line: ~ def process_queue_create_sprite~ - Inside source: true *** True Line Result - args.state.held_item = nil -** Processing line: ~ end~ + def process_queue_create_sprite +** Processing line: ~ sprites_to_create = queues.create_sprite~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + sprites_to_create = queues.create_sprite +** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ - Inside source: true *** True Line Result - end + .find_all { |h| h[:at].elapsed? } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if the selected area is an inventory area (as opposed to within the craft area)~ -- Inside source: true -*** True Line Result - # if the selected area is an inventory area (as opposed to within the craft area) -** Processing line: ~ elsif inventory_area~ +** Processing line: ~ queues.create_sprite = queues.create_sprite - sprites_to_create~ - Inside source: true *** True Line Result - elsif inventory_area + queues.create_sprite = queues.create_sprite - sprites_to_create ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # check to see if there is already an item in that inventory slot~ +** Processing line: ~ sprites_to_create.each do |h|~ - Inside source: true *** True Line Result - # check to see if there is already an item in that inventory slot -** Processing line: ~ # the item_at_inventory_slot helper method returns an item or nil~ + sprites_to_create.each do |h| +** Processing line: ~ export_animation_frame h[:index], h[:path_override]~ - Inside source: true *** True Line Result - # the item_at_inventory_slot helper method returns an item or nil -** Processing line: ~ item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]~ + export_animation_frame h[:index], h[:path_override] +** Processing line: ~ end~ - Inside source: true *** True Line Result - item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y] + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if there is already an item there, and the item types/id match~ +** Processing line: ~ def process_queue_reset_sprite~ - Inside source: true *** True Line Result - # if there is already an item there, and the item types/id match -** Processing line: ~ if item_already_there && item_already_there[:id] == args.state.held_item[:id]~ + def process_queue_reset_sprite +** Processing line: ~ sprites_to_reset = queues.reset_sprite~ - Inside source: true *** True Line Result - if item_already_there && item_already_there[:id] == args.state.held_item[:id] -** Processing line: ~ # then merge the item quantities~ + sprites_to_reset = queues.reset_sprite +** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ - Inside source: true *** True Line Result - # then merge the item quantities -** Processing line: ~ held_quantity = args.state.held_item[:quantity]~ + .find_all { |h| h[:at].elapsed? } +** Processing line: ~~ - Inside source: true *** True Line Result - held_quantity = args.state.held_item[:quantity] -** Processing line: ~ item_already_there[:quantity] += held_quantity~ + +** Processing line: ~ queues.reset_sprite -= sprites_to_reset~ - Inside source: true *** True Line Result - item_already_there[:quantity] += held_quantity + queues.reset_sprite -= sprites_to_reset ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # remove the item being held from the items collection (since it's quantity is now 0)~ +** Processing line: ~ sprites_to_reset.each { |h| gtk.reset_sprite (sprite_path h[:index]) }~ - Inside source: true *** True Line Result - # remove the item being held from the items collection (since it's quantity is now 0) -** Processing line: ~ args.state.items.reject! { |i| i[:location] == :held }~ + sprites_to_reset.each { |h| gtk.reset_sprite (sprite_path h[:index]) } +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.items.reject! { |i| i[:location] == :held } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # nil out the held_item so a new item can be picked up~ +** Processing line: ~ def process_queue_update_rt_animation_frame~ - Inside source: true *** True Line Result - # nil out the held_item so a new item can be picked up -** Processing line: ~ args.state.held_item = nil~ + def process_queue_update_rt_animation_frame +** Processing line: ~ animation_frames_to_update = queues.update_rt_animation_frame~ - Inside source: true *** True Line Result - args.state.held_item = nil -** Processing line: ~~ + animation_frames_to_update = queues.update_rt_animation_frame +** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ - Inside source: true *** True Line Result - -** Processing line: ~ # if there currently isn't an item there, then put the held item in the slot~ + .find_all { |h| h[:at].elapsed? } +** Processing line: ~~ - Inside source: true *** True Line Result - # if there currently isn't an item there, then put the held item in the slot -** Processing line: ~ elsif !item_already_there~ + +** Processing line: ~ queues.update_rt_animation_frame -= animation_frames_to_update~ - Inside source: true *** True Line Result - elsif !item_already_there -** Processing line: ~ args.state.held_item[:location] = :inventory~ + queues.update_rt_animation_frame -= animation_frames_to_update +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.held_item[:location] = :inventory -** Processing line: ~ args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]~ + +** Processing line: ~ animation_frames_to_update.each do |h|~ - Inside source: true *** True Line Result - args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x] -** Processing line: ~ args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]~ + animation_frames_to_update.each do |h| +** Processing line: ~ update_animation_frame_render_target animation_frames[h[:index]]~ - Inside source: true *** True Line Result - args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y] + update_animation_frame_render_target animation_frames[h[:index]] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # nil out the held_item so a new item can be picked up~ +** Processing line: ~ if h[:queue_sprite_creation]~ - Inside source: true *** True Line Result - # nil out the held_item so a new item can be picked up -** Processing line: ~ args.state.held_item = nil~ + if h[:queue_sprite_creation] +** Processing line: ~ queues.create_sprite << { index: h[:index],~ - Inside source: true *** True Line Result - args.state.held_item = nil + queues.create_sprite << { index: h[:index], +** Processing line: ~ at: state.tick_count + 1 }~ +- Inside source: true +*** True Line Result + at: state.tick_count + 1 } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96000,82 +102927,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # the calc method is executed after input~ -- Inside source: true -*** True Line Result - # the calc method is executed after input -** Processing line: ~ def calc args~ -- Inside source: true -*** True Line Result - def calc args -** Processing line: ~ # make sure that the real position of the inventory~ +** Processing line: ~ def update_animation_frame_render_target animation_frame~ - Inside source: true *** True Line Result - # make sure that the real position of the inventory -** Processing line: ~ # items are updated every frame to ensure that they~ + def update_animation_frame_render_target animation_frame +** Processing line: ~ return if !animation_frame~ - Inside source: true *** True Line Result - # items are updated every frame to ensure that they -** Processing line: ~ # are placed correctly given their location and oridinal positions~ + return if !animation_frame +** Processing line: ~~ - Inside source: true *** True Line Result - # are placed correctly given their location and oridinal positions -** Processing line: ~ # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)~ + +** Processing line: ~ outputs[animation_frame[:rt_name]].width = state.rt_canvas.size~ - Inside source: true *** True Line Result - # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place) -** Processing line: ~ args.state.items.each do |item|~ + outputs[animation_frame[:rt_name]].width = state.rt_canvas.size +** Processing line: ~ outputs[animation_frame[:rt_name]].height = state.rt_canvas.size~ - Inside source: true *** True Line Result - args.state.items.each do |item| -** Processing line: ~ # based on the location of the item, invoke the correct pixel conversion method~ + outputs[animation_frame[:rt_name]].height = state.rt_canvas.size +** Processing line: ~ outputs[animation_frame[:rt_name]].solids << animation_frame[:pixels].map do |f|~ - Inside source: true *** True Line Result - # based on the location of the item, invoke the correct pixel conversion method -** Processing line: ~ if item[:location] == :inventory~ + outputs[animation_frame[:rt_name]].solids << animation_frame[:pixels].map do |f| +** Processing line: ~ { x: f.x,~ - Inside source: true *** True Line Result - if item[:location] == :inventory -** Processing line: ~ set_inventory_position args, item~ + { x: f.x, +** Processing line: ~ y: f.y,~ - Inside source: true *** True Line Result - set_inventory_position args, item -** Processing line: ~ elsif item[:location] == :craft~ + y: f.y, +** Processing line: ~ w: 1,~ - Inside source: true *** True Line Result - elsif item[:location] == :craft -** Processing line: ~ set_craft_position args, item~ + w: 1, +** Processing line: ~ h: 1, r: 255, g: 255, b: 255 }~ - Inside source: true *** True Line Result - set_craft_position args, item -** Processing line: ~ elsif item[:location] == :held~ + h: 1, r: 255, g: 255, b: 255 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif item[:location] == :held -** Processing line: ~ # if the item is held, center the item around the mouse pointer~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # if the item is held, center the item around the mouse pointer -** Processing line: ~ args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half -** Processing line: ~ args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half~ + +** Processing line: ~ def animation_frames~ - Inside source: true *** True Line Result - args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half -** Processing line: ~ end~ + def animation_frames +** Processing line: ~ state.animation_frames~ - Inside source: true *** True Line Result - end + state.animation_frames ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96084,50 +102999,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # for each hash/sprite in the click ripples queue,~ +** Processing line: ~ def add_animation_frame_to_end~ - Inside source: true *** True Line Result - # for each hash/sprite in the click ripples queue, -** Processing line: ~ # expand its size by 20 percent and decrease its alpha~ + def add_animation_frame_to_end +** Processing line: ~ animation_frames << {~ - Inside source: true *** True Line Result - # expand its size by 20 percent and decrease its alpha -** Processing line: ~ # by 10.~ + animation_frames << { +** Processing line: ~ index: animation_frames.length,~ - Inside source: true *** True Line Result - # by 10. -** Processing line: ~ args.state.click_ripples.each do |ripple|~ + index: animation_frames.length, +** Processing line: ~ pixels: [],~ - Inside source: true *** True Line Result - args.state.click_ripples.each do |ripple| -** Processing line: ~ delta_w = ripple.w * 1.2 - ripple.w~ + pixels: [], +** Processing line: ~ rt_name: "animation_frame_#{animation_frames.length}"~ - Inside source: true *** True Line Result - delta_w = ripple.w * 1.2 - ripple.w -** Processing line: ~ delta_h = ripple.h * 1.2 - ripple.h~ + rt_name: "animation_frame_#{animation_frames.length}" +** Processing line: ~ }~ - Inside source: true *** True Line Result - delta_h = ripple.h * 1.2 - ripple.h -** Processing line: ~ ripple.x -= delta_w.half~ + } +** Processing line: ~~ - Inside source: true *** True Line Result - ripple.x -= delta_w.half -** Processing line: ~ ripple.y -= delta_h.half~ + +** Processing line: ~ state.animation_frames_selected_index = (animation_frames.length - 1)~ - Inside source: true *** True Line Result - ripple.y -= delta_h.half -** Processing line: ~ ripple.w += delta_w~ + state.animation_frames_selected_index = (animation_frames.length - 1) +** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - ripple.w += delta_w -** Processing line: ~ ripple.h += delta_h~ + queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count,~ - Inside source: true *** True Line Result - ripple.h += delta_h -** Processing line: ~ ripple.a -= 10~ + at: state.tick_count, +** Processing line: ~ queue_sprite_creation: true }~ - Inside source: true *** True Line Result - ripple.a -= 10 + queue_sprite_creation: true } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96136,218 +103051,230 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # remove any items from the collection where the alpha value is less than equal to~ +** Processing line: ~ def sprite_path i~ - Inside source: true *** True Line Result - # remove any items from the collection where the alpha value is less than equal to -** Processing line: ~ # zero using the reject! method (reject with an exclamation point at the end changes the~ + def sprite_path i +** Processing line: ~ "canvas/sprite-#{i}.png"~ - Inside source: true *** True Line Result - # zero using the reject! method (reject with an exclamation point at the end changes the -** Processing line: ~ # array value in place, while reject without the exclamation point returns a new array).~ + "canvas/sprite-#{i}.png" +** Processing line: ~ end~ - Inside source: true *** True Line Result - # array value in place, while reject without the exclamation point returns a new array). -** Processing line: ~ args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.click_ripples.reject! { |ripple| ripple.a <= 0 } -** Processing line: ~ end~ + +** Processing line: ~ def export_animation_frame i, path_override = nil~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def export_animation_frame i, path_override = nil +** Processing line: ~ return if !state.animation_frames[i]~ - Inside source: true *** True Line Result - -** Processing line: ~ # helper function for finding an item at a craft slot~ + return if !state.animation_frames[i] +** Processing line: ~~ - Inside source: true *** True Line Result - # helper function for finding an item at a craft slot -** Processing line: ~ def item_at_craft_slot args, ordinal_x, ordinal_y~ + +** Processing line: ~ outputs.screenshots << state.buttons_frame_selection~ - Inside source: true *** True Line Result - def item_at_craft_slot args, ordinal_x, ordinal_y -** Processing line: ~ args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~ + outputs.screenshots << state.buttons_frame_selection +** Processing line: ~ .items[i][:inner_rect]~ - Inside source: true *** True Line Result - args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y } -** Processing line: ~ end~ + .items[i][:inner_rect] +** Processing line: ~ .merge(path: path_override || (sprite_path i))~ - Inside source: true *** True Line Result - end + .merge(path: path_override || (sprite_path i)) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # helper function for finding an item at an inventory slot~ +** Processing line: ~ outputs.screenshots << state.buttons_frame_selection~ - Inside source: true *** True Line Result - # helper function for finding an item at an inventory slot -** Processing line: ~ def item_at_inventory_slot args, ordinal_x, ordinal_y~ + outputs.screenshots << state.buttons_frame_selection +** Processing line: ~ .items[i][:inner_rect]~ - Inside source: true *** True Line Result - def item_at_inventory_slot args, ordinal_x, ordinal_y -** Processing line: ~ args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~ + .items[i][:inner_rect] +** Processing line: ~ .merge(path: "tmp/sprite_backups/#{Time.now.to_i}-sprite-#{i}.png")~ - Inside source: true *** True Line Result - args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y } -** Processing line: ~ end~ + .merge(path: "tmp/sprite_backups/#{Time.now.to_i}-sprite-#{i}.png") +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ queues.reset_sprite << { index: i, at: state.tick_count }~ +- Inside source: true +*** True Line Result + queues.reset_sprite << { index: i, at: state.tick_count } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # helper function that creates a visual representation of an item~ +** Processing line: ~ def selected_animation_frame~ - Inside source: true *** True Line Result - # helper function that creates a visual representation of an item -** Processing line: ~ def item_prefab args, item, should_highlight, mouse~ + def selected_animation_frame +** Processing line: ~ state.animation_frames[state.animation_frames_selected_index]~ - Inside source: true *** True Line Result - def item_prefab args, item, should_highlight, mouse -** Processing line: ~ return nil unless item~ + state.animation_frames[state.animation_frames_selected_index] +** Processing line: ~ end~ - Inside source: true *** True Line Result - return nil unless item + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ overlay = nil~ +** Processing line: ~ def edit_current_animation_frame point~ - Inside source: true *** True Line Result - overlay = nil -** Processing line: ~~ + def edit_current_animation_frame point +** Processing line: ~ draw_area_point = (to_draw_area point)~ - Inside source: true *** True Line Result - -** Processing line: ~ x = item.x~ + draw_area_point = (to_draw_area point) +** Processing line: ~ if state.edit_mode == :drawing && (!selected_animation_frame[:pixels].include? draw_area_point)~ - Inside source: true *** True Line Result - x = item.x -** Processing line: ~ y = item.y~ + if state.edit_mode == :drawing && (!selected_animation_frame[:pixels].include? draw_area_point) +** Processing line: ~ selected_animation_frame[:pixels] << draw_area_point~ - Inside source: true *** True Line Result - y = item.y -** Processing line: ~ w = item.w~ + selected_animation_frame[:pixels] << draw_area_point +** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - w = item.w -** Processing line: ~ h = item.h~ + queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count,~ - Inside source: true *** True Line Result - h = item.h -** Processing line: ~~ + at: state.tick_count, +** Processing line: ~ queue_sprite_creation: !user_is_editing? }~ - Inside source: true *** True Line Result - -** Processing line: ~ if should_highlight && mouse.point.inside_rect?(item)~ + queue_sprite_creation: !user_is_editing? } +** Processing line: ~ elsif state.edit_mode == :erasing && (selected_animation_frame[:pixels].include? draw_area_point)~ - Inside source: true *** True Line Result - if should_highlight && mouse.point.inside_rect?(item) -** Processing line: ~ overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }~ + elsif state.edit_mode == :erasing && (selected_animation_frame[:pixels].include? draw_area_point) +** Processing line: ~ selected_animation_frame[:pixels] = selected_animation_frame[:pixels].reject { |p| p == draw_area_point }~ - Inside source: true *** True Line Result - overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, } -** Processing line: ~ end~ + selected_animation_frame[:pixels] = selected_animation_frame[:pixels].reject { |p| p == draw_area_point } +** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, +** Processing line: ~ at: state.tick_count,~ - Inside source: true *** True Line Result - -** Processing line: ~ [~ + at: state.tick_count, +** Processing line: ~ queue_sprite_creation: !user_is_editing? }~ - Inside source: true *** True Line Result - [ -** Processing line: ~ # sprites are hashes with a path property, this is the main sprite~ + queue_sprite_creation: !user_is_editing? } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # sprites are hashes with a path property, this is the main sprite -** Processing line: ~ { x: x, y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - { x: x, y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], }, + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # this represents the black area in the bottom right corner of the main sprite so that the~ +** Processing line: ~ def user_is_editing?~ - Inside source: true *** True Line Result - # this represents the black area in the bottom right corner of the main sprite so that the -** Processing line: ~ # quantity is visible~ + def user_is_editing? +** Processing line: ~ state.last_mouse_down > state.last_mouse_up~ - Inside source: true *** True Line Result - # quantity is visible -** Processing line: ~ { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property~ + state.last_mouse_down > state.last_mouse_up +** Processing line: ~ end~ - Inside source: true *** True Line Result - { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # labels are hashes with a text property~ +** Processing line: ~ def to_draw_area point~ - Inside source: true *** True Line Result - # labels are hashes with a text property -** Processing line: ~ { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },~ + def to_draw_area point +** Processing line: ~ x, y = point~ - Inside source: true *** True Line Result - { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, }, -** Processing line: ~~ + x, y = point +** Processing line: ~ x -= rt_canvas.sprite.x~ - Inside source: true *** True Line Result - -** Processing line: ~ # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)~ + x -= rt_canvas.sprite.x +** Processing line: ~ y -= rt_canvas.sprite.y~ - Inside source: true *** True Line Result - # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered) -** Processing line: ~ overlay~ + y -= rt_canvas.sprite.y +** Processing line: ~ { x: x.idiv(rt_canvas.zoom),~ - Inside source: true *** True Line Result - overlay -** Processing line: ~ ]~ + { x: x.idiv(rt_canvas.zoom), +** Processing line: ~ y: y.idiv(rt_canvas.zoom) }~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + y: y.idiv(rt_canvas.zoom) } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # helper function for deriving the position of an item within inventory~ +** Processing line: ~ def rt_canvas~ - Inside source: true *** True Line Result - # helper function for deriving the position of an item within inventory -** Processing line: ~ def set_inventory_position args, item~ + def rt_canvas +** Processing line: ~ state.rt_canvas ||= state.new_entity(:rt_canvas)~ - Inside source: true *** True Line Result - def set_inventory_position args, item -** Processing line: ~ item.x = args.state.inventory_border.x + item[:ordinal_x] * 80~ + state.rt_canvas ||= state.new_entity(:rt_canvas) +** Processing line: ~ end~ - Inside source: true *** True Line Result - item.x = args.state.inventory_border.x + item[:ordinal_x] * 80 -** Processing line: ~ item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80 -** Processing line: ~ item.w = 80~ + +** Processing line: ~ def queues~ - Inside source: true *** True Line Result - item.w = 80 -** Processing line: ~ item.h = 80~ + def queues +** Processing line: ~ state.queues ||= state.new_entity(:queues)~ - Inside source: true *** True Line Result - item.h = 80 + state.queues ||= state.new_entity(:queues) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96356,30 +103283,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # helper function for deriving the position of an item within the craft area~ -- Inside source: true -*** True Line Result - # helper function for deriving the position of an item within the craft area -** Processing line: ~ def set_craft_position args, item~ +** Processing line: ~ $game = OneBitLowrezPaint.new~ - Inside source: true *** True Line Result - def set_craft_position args, item -** Processing line: ~ item.x = args.state.craft_border.x + item[:ordinal_x] * 80~ + $game = OneBitLowrezPaint.new +** Processing line: ~~ - Inside source: true *** True Line Result - item.x = args.state.craft_border.x + item[:ordinal_x] * 80 -** Processing line: ~ item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80 -** Processing line: ~ item.w = 80~ + def tick args +** Processing line: ~ $game.args = args~ - Inside source: true *** True Line Result - item.w = 80 -** Processing line: ~ item.h = 80~ + $game.args = args +** Processing line: ~ $game.tick~ - Inside source: true *** True Line Result - item.h = 80 + $game.tick ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96388,22 +103311,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Any lines outside of a function will be executed when the file is reloaded.~ -- Inside source: true -*** True Line Result - # Any lines outside of a function will be executed when the file is reloaded. -** Processing line: ~ # So every time you save main.rb, the game will be reset.~ -- Inside source: true -*** True Line Result - # So every time you save main.rb, the game will be reset. -** Processing line: ~ # Comment out the line below if you don't want this to happen.~ -- Inside source: true -*** True Line Result - # Comment out the line below if you don't want this to happen. -** Processing line: ~ $gtk.reset~ +** Processing line: ~ # $gtk.reset~ - Inside source: true *** True Line Result - $gtk.reset + # $gtk.reset ** Processing line: ~~ - Inside source: true *** True Line Result @@ -96416,358 +103327,346 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** Dev Tools - Add Buttons To Console - main.rb~ +** Processing line: ~*** Dev Tools - Tile Editor Starting Point - main.rb~ - Header detected. *** True Line Result *** True Line Result -*** Dev Tools - Add Buttons To Console - main.rb +*** Dev Tools - Tile Editor Starting Point - main.rb ** Processing line: ~#+begin_src ruby~ - Line was identified as the beginning of a code block. *** True Line Result *** True Line Result #+begin_src ruby -** Processing line: ~ # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb~ -- Inside source: true -*** True Line Result - # ./samples/99_genre_dev_tools/add_buttons_to_console/app/main.rb -** Processing line: ~ # You can customize the buttons that show up in the Console.~ -- Inside source: true -*** True Line Result - # You can customize the buttons that show up in the Console. -** Processing line: ~ class GTK::Console::Menu~ +** Processing line: ~ # ./samples/99_genre_dev_tools/tile_editor_starting_point/app/main.rb~ - Inside source: true *** True Line Result - class GTK::Console::Menu -** Processing line: ~ # STEP 1: Override the custom_buttons function.~ + # ./samples/99_genre_dev_tools/tile_editor_starting_point/app/main.rb +** Processing line: ~ =begin~ - Inside source: true *** True Line Result - # STEP 1: Override the custom_buttons function. -** Processing line: ~ def custom_buttons~ + =begin +** Processing line: ~~ - Inside source: true *** True Line Result - def custom_buttons -** Processing line: ~ [~ + +** Processing line: ~ APIs listing that haven't been encountered in previous sample apps:~ - Inside source: true *** True Line Result - [ -** Processing line: ~ (button id: :yay,~ + APIs listing that haven't been encountered in previous sample apps: +** Processing line: ~~ - Inside source: true *** True Line Result - (button id: :yay, -** Processing line: ~ # row for button~ + +** Processing line: ~ - to_s: Returns a string representation of an object.~ - Inside source: true *** True Line Result - # row for button -** Processing line: ~ row: 3,~ + - to_s: Returns a string representation of an object. +** Processing line: ~ For example, if we had~ - Inside source: true *** True Line Result - row: 3, -** Processing line: ~ # column for button~ + For example, if we had +** Processing line: ~ 500.to_s~ - Inside source: true *** True Line Result - # column for button -** Processing line: ~ col: 10,~ + 500.to_s +** Processing line: ~ the string "500" would be returned.~ - Inside source: true *** True Line Result - col: 10, -** Processing line: ~ # text~ + the string "500" would be returned. +** Processing line: ~ Similar to to_i, which returns an integer representation of an object.~ - Inside source: true *** True Line Result - # text -** Processing line: ~ text: "I AM CUSTOM",~ + Similar to to_i, which returns an integer representation of an object. +** Processing line: ~~ - Inside source: true *** True Line Result - text: "I AM CUSTOM", -** Processing line: ~ # when clicked call the custom_button_clicked function~ + +** Processing line: ~ - Ceil: Returns an integer number greater than or equal to the original~ - Inside source: true *** True Line Result - # when clicked call the custom_button_clicked function -** Processing line: ~ method: :custom_button_clicked),~ + - Ceil: Returns an integer number greater than or equal to the original +** Processing line: ~ with no decimal.~ - Inside source: true *** True Line Result - method: :custom_button_clicked), + with no decimal. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ (button id: :yay,~ +** Processing line: ~ Reminders:~ - Inside source: true *** True Line Result - (button id: :yay, -** Processing line: ~ # row for button~ + Reminders: +** Processing line: ~~ - Inside source: true *** True Line Result - # row for button -** Processing line: ~ row: 3,~ + +** Processing line: ~ - ARRAY#inside_rect?: Returns true or false depending on if the point is inside a rect.~ - Inside source: true *** True Line Result - row: 3, -** Processing line: ~ # column for button~ + - ARRAY#inside_rect?: Returns true or false depending on if the point is inside a rect. +** Processing line: ~~ - Inside source: true *** True Line Result - # column for button -** Processing line: ~ col: 9,~ + +** Processing line: ~ - args.outputs.labels: An array. The values generate a label.~ - Inside source: true *** True Line Result - col: 9, -** Processing line: ~ # text~ + - args.outputs.labels: An array. The values generate a label. +** Processing line: ~ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~ - Inside source: true *** True Line Result - # text -** Processing line: ~ text: "CUSTOM ALSO",~ + The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] +** Processing line: ~ For more information about labels, go to mygame/documentation/02-labels.md.~ - Inside source: true *** True Line Result - text: "CUSTOM ALSO", -** Processing line: ~ # when clicked call the custom_button_also_clicked function~ + For more information about labels, go to mygame/documentation/02-labels.md. +** Processing line: ~~ - Inside source: true *** True Line Result - # when clicked call the custom_button_also_clicked function -** Processing line: ~ method: :custom_button_also_clicked)~ + +** Processing line: ~ - args.outputs.sprites: An array. The values generate a sprite.~ - Inside source: true *** True Line Result - method: :custom_button_also_clicked) -** Processing line: ~ ]~ + - args.outputs.sprites: An array. The values generate a sprite. +** Processing line: ~ The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]~ - Inside source: true *** True Line Result - ] -** Processing line: ~ end~ + The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH] +** Processing line: ~ For more information about sprites, go to mygame/documentation/05-sprites.md.~ - Inside source: true *** True Line Result - end + For more information about sprites, go to mygame/documentation/05-sprites.md. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # STEP 2: Define the function that should be called.~ -- Inside source: true -*** True Line Result - # STEP 2: Define the function that should be called. -** Processing line: ~ def custom_button_clicked~ +** Processing line: ~ - args.outputs.solids: An array. The values generate a solid.~ - Inside source: true *** True Line Result - def custom_button_clicked -** Processing line: ~ log "* INFO: I AM CUSTOM was clicked!"~ + - args.outputs.solids: An array. The values generate a solid. +** Processing line: ~ The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~ - Inside source: true *** True Line Result - log "* INFO: I AM CUSTOM was clicked!" -** Processing line: ~ end~ + The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE] +** Processing line: ~ For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~ - Inside source: true *** True Line Result - end + For more information about solids, go to mygame/documentation/03-solids-and-borders.md. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def custom_button_also_clicked~ +** Processing line: ~ - args.outputs.lines: An array. The values generate a line.~ - Inside source: true *** True Line Result - def custom_button_also_clicked -** Processing line: ~ log "* INFO: Custom Button Clicked at #{Kernel.global_tick_count}!"~ + - args.outputs.lines: An array. The values generate a line. +** Processing line: ~ The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]~ - Inside source: true *** True Line Result - log "* INFO: Custom Button Clicked at #{Kernel.global_tick_count}!" + The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE] +** Processing line: ~ For more information about lines, go to mygame/documentation/04-lines.md.~ +- Inside source: true +*** True Line Result + For more information about lines, go to mygame/documentation/04-lines.md. ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ all_buttons_as_string = $gtk.console.menu.buttons.map do |b|~ +** Processing line: ~ - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~ - Inside source: true *** True Line Result - all_buttons_as_string = $gtk.console.menu.buttons.map do |b| -** Processing line: ~ <<-S.strip~ + - args.state.new_entity: Used when we want to create a new object, like a sprite or button. +** Processing line: ~ In this sample app, new_entity is used to create a new button that clears the grid.~ - Inside source: true *** True Line Result - <<-S.strip -** Processing line: ~ ** id: #{b[:id]}~ + In this sample app, new_entity is used to create a new button that clears the grid. +** Processing line: ~ (Remember, you can use state to define ANY property and it will be retained across frames.)~ - Inside source: true *** True Line Result - ** id: #{b[:id]} -** Processing line: ~ :PROPERTIES:~ + (Remember, you can use state to define ANY property and it will be retained across frames.) +** Processing line: ~~ - Inside source: true *** True Line Result - :PROPERTIES: -** Processing line: ~ :id: :#{b[:id]}~ + +** Processing line: ~ =end~ - Inside source: true *** True Line Result - :id: :#{b[:id]} -** Processing line: ~ :method: :#{b[:method]}~ + =end +** Processing line: ~~ - Inside source: true *** True Line Result - :method: :#{b[:method]} -** Processing line: ~ :text: #{b[:text]}~ + +** Processing line: ~ # This sample app shows an empty grid that the user can paint in. There are different image tiles that~ - Inside source: true *** True Line Result - :text: #{b[:text]} -** Processing line: ~ :END:~ + # This sample app shows an empty grid that the user can paint in. There are different image tiles that +** Processing line: ~ # the user can use to fill the grid, and the "Clear" button can be pressed to clear the grid boxes.~ - Inside source: true *** True Line Result - :END: -** Processing line: ~ S~ + # the user can use to fill the grid, and the "Clear" button can be pressed to clear the grid boxes. +** Processing line: ~~ - Inside source: true *** True Line Result - S -** Processing line: ~ end.join("\n")~ + +** Processing line: ~ class TileEditor~ - Inside source: true *** True Line Result - end.join("\n") + class TileEditor +** Processing line: ~ attr_accessor :inputs, :state, :outputs, :grid, :args~ +- Inside source: true +*** True Line Result + attr_accessor :inputs, :state, :outputs, :grid, :args ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ log <<-S~ +** Processing line: ~ # Runs all the methods necessary for the game to function properly.~ - Inside source: true *** True Line Result - log <<-S -** Processing line: ~ * INFO: Here are all the buttons:~ + # Runs all the methods necessary for the game to function properly. +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - * INFO: Here are all the buttons: -** Processing line: ~ #{all_buttons_as_string}~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - #{all_buttons_as_string} -** Processing line: ~ S~ + defaults +** Processing line: ~ render~ - Inside source: true *** True Line Result - S -** Processing line: ~ end~ + render +** Processing line: ~ check_click~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + check_click +** Processing line: ~ draw_buttons~ - Inside source: true *** True Line Result - end + draw_buttons +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ # Sets default values~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ args.outputs.labels << [args.grid.center.x, args.grid.center.y,~ + # Sets default values +** Processing line: ~ # Initialization only happens in the first frame~ - Inside source: true *** True Line Result - args.outputs.labels << [args.grid.center.x, args.grid.center.y, -** Processing line: ~ "Open the DragonRuby Console to see the custom menu items.",~ + # Initialization only happens in the first frame +** Processing line: ~ # NOTE: The values of some of these variables may seem confusingly large at first.~ - Inside source: true *** True Line Result - "Open the DragonRuby Console to see the custom menu items.", -** Processing line: ~ 0, 1]~ + # NOTE: The values of some of these variables may seem confusingly large at first. +** Processing line: ~ # The gridSize is 1600 but it seems a lot smaller on the screen, for example.~ - Inside source: true *** True Line Result - 0, 1] -** Processing line: ~ end~ + # The gridSize is 1600 but it seems a lot smaller on the screen, for example. +** Processing line: ~ # But keep in mind that by using the "W", "A", "S", and "D" keys, you can~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # But keep in mind that by using the "W", "A", "S", and "D" keys, you can +** Processing line: ~ # move the grid's view in all four directions for more grid spaces.~ - 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: ~*** Dev Tools - Animation Creator Starting Point - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Dev Tools - Animation Creator Starting Point - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + # move the grid's view in all four directions for more grid spaces. +** Processing line: ~ def defaults~ +- Inside source: true *** True Line Result - + def defaults +** Processing line: ~ state.tileCords ||= []~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_dev_tools/animation_creator_starting_point/app/main.rb~ + state.tileCords ||= [] +** Processing line: ~ state.tileQuantity ||= 6~ - Inside source: true *** True Line Result - # ./samples/99_genre_dev_tools/animation_creator_starting_point/app/main.rb -** Processing line: ~ class OneBitLowrezPaint~ + state.tileQuantity ||= 6 +** Processing line: ~ state.tileSize ||= 50~ - Inside source: true *** True Line Result - class OneBitLowrezPaint -** Processing line: ~ attr_gtk~ + state.tileSize ||= 50 +** Processing line: ~ state.tileSelected ||= 1~ - Inside source: true *** True Line Result - attr_gtk -** Processing line: ~~ + state.tileSelected ||= 1 +** Processing line: ~ state.tempX ||= 50~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick~ + state.tempX ||= 50 +** Processing line: ~ state.tempY ||= 500~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ outputs.background_color = [0, 0, 0]~ + state.tempY ||= 500 +** Processing line: ~ state.speed ||= 4~ - Inside source: true *** True Line Result - outputs.background_color = [0, 0, 0] -** Processing line: ~ defaults~ + state.speed ||= 4 +** Processing line: ~ state.centerX ||= 4000~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render_instructions~ + state.centerX ||= 4000 +** Processing line: ~ state.centerY ||= 4000~ - Inside source: true *** True Line Result - render_instructions -** Processing line: ~ render_canvas~ + state.centerY ||= 4000 +** Processing line: ~ state.originalCenter ||= [state.centerX, state.centerY]~ - Inside source: true *** True Line Result - render_canvas -** Processing line: ~ render_buttons_frame_selection~ + state.originalCenter ||= [state.centerX, state.centerY] +** Processing line: ~ state.gridSize ||= 1600~ - Inside source: true *** True Line Result - render_buttons_frame_selection -** Processing line: ~ render_animation_frame_thumbnails~ + state.gridSize ||= 1600 +** Processing line: ~ state.lineQuantity ||= 50~ - Inside source: true *** True Line Result - render_animation_frame_thumbnails -** Processing line: ~ render_animation~ + state.lineQuantity ||= 50 +** Processing line: ~ state.increment ||= state.gridSize / state.lineQuantity~ - Inside source: true *** True Line Result - render_animation -** Processing line: ~ input_mouse_click~ + state.increment ||= state.gridSize / state.lineQuantity +** Processing line: ~ state.gridX ||= []~ - Inside source: true *** True Line Result - input_mouse_click -** Processing line: ~ input_keyboard~ + state.gridX ||= [] +** Processing line: ~ state.gridY ||= []~ - Inside source: true *** True Line Result - input_keyboard -** Processing line: ~ calc_auto_export~ + state.gridY ||= [] +** Processing line: ~ state.filled_squares ||= []~ - Inside source: true *** True Line Result - calc_auto_export -** Processing line: ~ calc_buttons_frame_selection~ + state.filled_squares ||= [] +** Processing line: ~ state.grid_border ||= [390, 140, 500, 500]~ - Inside source: true *** True Line Result - calc_buttons_frame_selection -** Processing line: ~ calc_animation_frames~ + state.grid_border ||= [390, 140, 500, 500] +** Processing line: ~~ - Inside source: true *** True Line Result - calc_animation_frames -** Processing line: ~ process_queue_create_sprite~ + +** Processing line: ~ get_grid unless state.tempX == 0 # calls get_grid in the first frame only~ - Inside source: true *** True Line Result - process_queue_create_sprite -** Processing line: ~ process_queue_reset_sprite~ + get_grid unless state.tempX == 0 # calls get_grid in the first frame only +** Processing line: ~ determineTileCords unless state.tempX == 0 # calls determineTileCords in first frame~ - Inside source: true *** True Line Result - process_queue_reset_sprite -** Processing line: ~ process_queue_update_rt_animation_frame~ + determineTileCords unless state.tempX == 0 # calls determineTileCords in first frame +** Processing line: ~ state.tempX = 0 # sets tempX to 0; the two methods aren't called again~ - Inside source: true *** True Line Result - process_queue_update_rt_animation_frame + state.tempX = 0 # sets tempX to 0; the two methods aren't called again ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96776,42 +103675,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def defaults~ -- Inside source: true -*** True Line Result - def defaults -** Processing line: ~ state.animation_frames_per_second = 12~ -- Inside source: true -*** True Line Result - state.animation_frames_per_second = 12 -** Processing line: ~ queues.create_sprite ||= []~ +** Processing line: ~ # Calculates the placement of lines or separators in the grid~ - Inside source: true *** True Line Result - queues.create_sprite ||= [] -** Processing line: ~ queues.reset_sprite ||= []~ + # Calculates the placement of lines or separators in the grid +** Processing line: ~ def get_grid~ - Inside source: true *** True Line Result - queues.reset_sprite ||= [] -** Processing line: ~ queues.update_rt_animation_frame ||= []~ + def get_grid +** Processing line: ~ curr_x = state.centerX - (state.gridSize / 2) # starts at left of grid~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame ||= [] -** Processing line: ~~ + curr_x = state.centerX - (state.gridSize / 2) # starts at left of grid +** Processing line: ~ deltaX = state.gridSize / state.lineQuantity # finds distance to place vertical lines evenly through width of grid~ - Inside source: true *** True Line Result - -** Processing line: ~ if !state.animation_frames~ + deltaX = state.gridSize / state.lineQuantity # finds distance to place vertical lines evenly through width of grid +** Processing line: ~ (state.lineQuantity + 2).times do~ - Inside source: true *** True Line Result - if !state.animation_frames -** Processing line: ~ state.animation_frames ||= []~ + (state.lineQuantity + 2).times do +** Processing line: ~ state.gridX << curr_x # adds curr_x to gridX collection~ - Inside source: true *** True Line Result - state.animation_frames ||= [] -** Processing line: ~ add_animation_frame_to_end~ + state.gridX << curr_x # adds curr_x to gridX collection +** Processing line: ~ curr_x += deltaX # increment curr_x by the distance between vertical lines~ - Inside source: true *** True Line Result - add_animation_frame_to_end + curr_x += deltaX # increment curr_x by the distance between vertical lines ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -96820,530 +103711,542 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ state.last_mouse_down ||= 0~ -- Inside source: true -*** True Line Result - state.last_mouse_down ||= 0 -** Processing line: ~ state.last_mouse_up ||= 0~ +** Processing line: ~ curr_y = state.centerY - (state.gridSize / 2) # starts at bottom of grid~ - Inside source: true *** True Line Result - state.last_mouse_up ||= 0 -** Processing line: ~~ + curr_y = state.centerY - (state.gridSize / 2) # starts at bottom of grid +** Processing line: ~ deltaY = state.gridSize / state.lineQuantity # finds distance to place horizontal lines evenly through height of grid~ - Inside source: true *** True Line Result - -** Processing line: ~ state.buttons_frame_selection.left = 10~ + deltaY = state.gridSize / state.lineQuantity # finds distance to place horizontal lines evenly through height of grid +** Processing line: ~ (state.lineQuantity + 2).times do~ - Inside source: true *** True Line Result - state.buttons_frame_selection.left = 10 -** Processing line: ~ state.buttons_frame_selection.top = grid.top - 10~ + (state.lineQuantity + 2).times do +** Processing line: ~ state.gridY << curr_y # adds curr_y to gridY collection~ - Inside source: true *** True Line Result - state.buttons_frame_selection.top = grid.top - 10 -** Processing line: ~ state.buttons_frame_selection.size = 20~ + state.gridY << curr_y # adds curr_y to gridY collection +** Processing line: ~ curr_y += deltaY # increments curr_y to distance between horizontal lines~ - Inside source: true *** True Line Result - state.buttons_frame_selection.size = 20 -** Processing line: ~~ + curr_y += deltaY # increments curr_y to distance between horizontal lines +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ defaults_canvas_sprite~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - defaults_canvas_sprite + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.edit_mode ||= :drawing~ +** Processing line: ~ # Determines coordinate positions of patterned tiles (on the left side of the grid)~ - Inside source: true *** True Line Result - state.edit_mode ||= :drawing -** Processing line: ~ end~ + # Determines coordinate positions of patterned tiles (on the left side of the grid) +** Processing line: ~ def determineTileCords~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def determineTileCords +** Processing line: ~ state.tempCounter ||= 1 # initializes tempCounter to 1~ - Inside source: true *** True Line Result - -** Processing line: ~ def defaults_canvas_sprite~ + state.tempCounter ||= 1 # initializes tempCounter to 1 +** Processing line: ~ state.tileQuantity.times do # there are 6 different kinds of tiles~ - Inside source: true *** True Line Result - def defaults_canvas_sprite -** Processing line: ~ rt_canvas.size = 16~ + state.tileQuantity.times do # there are 6 different kinds of tiles +** Processing line: ~ state.tileCords += [[state.tempX, state.tempY, state.tempCounter]] # adds tile definition to collection~ - Inside source: true *** True Line Result - rt_canvas.size = 16 -** Processing line: ~ rt_canvas.zoom = 30~ + state.tileCords += [[state.tempX, state.tempY, state.tempCounter]] # adds tile definition to collection +** Processing line: ~ state.tempX += 75 # increments tempX to put horizontal space between the patterned tiles~ - Inside source: true *** True Line Result - rt_canvas.zoom = 30 -** Processing line: ~ rt_canvas.width = rt_canvas.size * rt_canvas.zoom~ + state.tempX += 75 # increments tempX to put horizontal space between the patterned tiles +** Processing line: ~ state.tempCounter += 1 # increments tempCounter~ - Inside source: true *** True Line Result - rt_canvas.width = rt_canvas.size * rt_canvas.zoom -** Processing line: ~ rt_canvas.height = rt_canvas.size * rt_canvas.zoom~ + state.tempCounter += 1 # increments tempCounter +** Processing line: ~ if state.tempX > 200 # if tempX exceeds 200 pixels~ - Inside source: true *** True Line Result - rt_canvas.height = rt_canvas.size * rt_canvas.zoom -** Processing line: ~ rt_canvas.sprite = { x: 0,~ + if state.tempX > 200 # if tempX exceeds 200 pixels +** Processing line: ~ state.tempX = 50 # a new row of patterned tiles begins~ - Inside source: true *** True Line Result - rt_canvas.sprite = { x: 0, -** Processing line: ~ y: 0,~ + state.tempX = 50 # a new row of patterned tiles begins +** Processing line: ~ state.tempY -= 75 # the new row is 75 pixels lower than the previous row~ - Inside source: true *** True Line Result - y: 0, -** Processing line: ~ w: rt_canvas.width,~ + state.tempY -= 75 # the new row is 75 pixels lower than the previous row +** Processing line: ~ end~ - Inside source: true *** True Line Result - w: rt_canvas.width, -** Processing line: ~ h: rt_canvas.height,~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - h: rt_canvas.height, -** Processing line: ~ path: :rt_canvas }.center_inside_rect(x: 0, y: 0, w: 640, h: 720)~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - path: :rt_canvas }.center_inside_rect(x: 0, y: 0, w: 640, h: 720) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ return unless state.tick_count == 1~ +** Processing line: ~ # Outputs objects (grid, tiles, etc) onto the screen~ - Inside source: true *** True Line Result - return unless state.tick_count == 1 -** Processing line: ~~ + # Outputs objects (grid, tiles, etc) onto the screen +** Processing line: ~ def render~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs[:rt_canvas].width = rt_canvas.width~ + def render +** Processing line: ~ outputs.sprites << state.tileCords.map do # outputs tileCords collection using images in sprites folder~ - Inside source: true *** True Line Result - outputs[:rt_canvas].width = rt_canvas.width -** Processing line: ~ outputs[:rt_canvas].height = rt_canvas.height~ + outputs.sprites << state.tileCords.map do # outputs tileCords collection using images in sprites folder +** Processing line: ~ |x, y, order|~ - Inside source: true *** True Line Result - outputs[:rt_canvas].height = rt_canvas.height -** Processing line: ~ outputs[:rt_canvas].sprites << (rt_canvas.size + 1).map_with_index do |x|~ + |x, y, order| +** Processing line: ~ [x, y, state.tileSize, state.tileSize, 'sprites/image' + order.to_s + ".png"]~ - Inside source: true *** True Line Result - outputs[:rt_canvas].sprites << (rt_canvas.size + 1).map_with_index do |x| -** Processing line: ~ (rt_canvas.size + 1).map_with_index do |y|~ + [x, y, state.tileSize, state.tileSize, 'sprites/image' + order.to_s + ".png"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - (rt_canvas.size + 1).map_with_index do |y| -** Processing line: ~ path = 'sprites/square-white.png'~ + end +** Processing line: ~ outputs.solids << [0, 0, 1280, 720, 255, 255, 255] # outputs white background~ - Inside source: true *** True Line Result - path = 'sprites/square-white.png' -** Processing line: ~ path = 'sprites/square-blue.png' if x == 7 || x == 8~ + outputs.solids << [0, 0, 1280, 720, 255, 255, 255] # outputs white background +** Processing line: ~ add_grid # outputs grid~ - Inside source: true *** True Line Result - path = 'sprites/square-blue.png' if x == 7 || x == 8 -** Processing line: ~ { x: x * rt_canvas.zoom,~ + add_grid # outputs grid +** Processing line: ~ print_title # outputs title and current tile pattern~ - Inside source: true *** True Line Result - { x: x * rt_canvas.zoom, -** Processing line: ~ y: y * rt_canvas.zoom,~ + print_title # outputs title and current tile pattern +** Processing line: ~ end~ - Inside source: true *** True Line Result - y: y * rt_canvas.zoom, -** Processing line: ~ w: rt_canvas.zoom,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - w: rt_canvas.zoom, -** Processing line: ~ h: rt_canvas.zoom,~ + +** Processing line: ~ # Creates a grid by outputting vertical and horizontal grid lines onto the screen.~ - Inside source: true *** True Line Result - h: rt_canvas.zoom, -** Processing line: ~ path: path,~ + # Creates a grid by outputting vertical and horizontal grid lines onto the screen. +** Processing line: ~ # Outputs sprites for the filled_squares collection onto the screen.~ - Inside source: true *** True Line Result - path: path, -** Processing line: ~ a: 50 }~ + # Outputs sprites for the filled_squares collection onto the screen. +** Processing line: ~ def add_grid~ - Inside source: true *** True Line Result - a: 50 } -** Processing line: ~ end~ + def add_grid +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ # Outputs the grid's border.~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # Outputs the grid's border. +** Processing line: ~ outputs.borders << state.grid_border~ - Inside source: true *** True Line Result - end + outputs.borders << state.grid_border +** Processing line: ~ temp = 0~ +- Inside source: true +*** True Line Result + temp = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_instructions~ +** Processing line: ~ # Before looking at the code that outputs the vertical and horizontal lines in the~ - Inside source: true *** True Line Result - def render_instructions -** Processing line: ~ instructions = [~ + # Before looking at the code that outputs the vertical and horizontal lines in the +** Processing line: ~ # grid, take note of the fact that:~ - Inside source: true *** True Line Result - instructions = [ -** Processing line: ~ "* Hotkeys:",~ + # grid, take note of the fact that: +** Processing line: ~ # grid_border[1] refers to the border's bottom line (running horizontally),~ - Inside source: true *** True Line Result - "* Hotkeys:", -** Processing line: ~ "- d: hold to erase, release to draw.",~ + # grid_border[1] refers to the border's bottom line (running horizontally), +** Processing line: ~ # grid_border[2] refers to the border's top line (running (horizontally),~ - Inside source: true *** True Line Result - "- d: hold to erase, release to draw.", -** Processing line: ~ "- a: add frame.",~ + # grid_border[2] refers to the border's top line (running (horizontally), +** Processing line: ~ # grid_border[0] refers to the border's left line (running vertically),~ - Inside source: true *** True Line Result - "- a: add frame.", -** Processing line: ~ "- c: copy frame.",~ + # grid_border[0] refers to the border's left line (running vertically), +** Processing line: ~ # and grid_border[3] refers to the border's right line (running vertically).~ - Inside source: true *** True Line Result - "- c: copy frame.", -** Processing line: ~ "- v: paste frame.",~ + # and grid_border[3] refers to the border's right line (running vertically). +** Processing line: ~~ - Inside source: true *** True Line Result - "- v: paste frame.", -** Processing line: ~ "- x: delete frame.",~ + +** Processing line: ~ # [2]~ - Inside source: true *** True Line Result - "- x: delete frame.", -** Processing line: ~ "- b: go to previous frame.",~ + # [2] +** Processing line: ~ # ----------~ - Inside source: true *** True Line Result - "- b: go to previous frame.", -** Processing line: ~ "- f: go to next frame.",~ + # ---------- +** Processing line: ~ # | |~ - Inside source: true *** True Line Result - "- f: go to next frame.", -** Processing line: ~ "- w: save to ./canvas directory.",~ + # | | +** Processing line: ~ # [0] | | [3]~ - Inside source: true *** True Line Result - "- w: save to ./canvas directory.", -** Processing line: ~ "- l: load from ./canvas."~ + # [0] | | [3] +** Processing line: ~ # | |~ - Inside source: true *** True Line Result - "- l: load from ./canvas." -** Processing line: ~ ]~ + # | | +** Processing line: ~ # ----------~ - Inside source: true *** True Line Result - ] -** Processing line: ~~ + # ---------- +** Processing line: ~ # [1]~ - Inside source: true *** True Line Result - -** Processing line: ~ instructions.each.with_index do |l, i|~ + # [1] +** Processing line: ~~ - Inside source: true *** True Line Result - instructions.each.with_index do |l, i| -** Processing line: ~ outputs.labels << { x: 840, y: 500 - (i * 20), text: "#{l}",~ + +** Processing line: ~ # Calculates the positions and outputs the x grid lines in the color gray.~ - Inside source: true *** True Line Result - outputs.labels << { x: 840, y: 500 - (i * 20), text: "#{l}", -** Processing line: ~ r: 180, g: 180, b: 180, size_enum: 0 }~ + # Calculates the positions and outputs the x grid lines in the color gray. +** Processing line: ~ state.gridX.map do # perform an action on all elements of the gridX collection~ - Inside source: true *** True Line Result - r: 180, g: 180, b: 180, size_enum: 0 } -** Processing line: ~ end~ + state.gridX.map do # perform an action on all elements of the gridX collection +** Processing line: ~ |x|~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + |x| +** Processing line: ~ temp += 1 # increment temp~ - Inside source: true *** True Line Result - end + temp += 1 # increment temp ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_canvas~ -- Inside source: true -*** True Line Result - def render_canvas -** Processing line: ~ return if state.tick_count.zero?~ +** Processing line: ~ # if x's value is greater than (or equal to) the x value of the border's left side~ - Inside source: true *** True Line Result - return if state.tick_count.zero? -** Processing line: ~ outputs.sprites << rt_canvas.sprite~ + # if x's value is greater than (or equal to) the x value of the border's left side +** Processing line: ~ # and less than (or equal to) the x value of the border's right side~ - Inside source: true *** True Line Result - outputs.sprites << rt_canvas.sprite -** Processing line: ~ end~ + # and less than (or equal to) the x value of the border's right side +** Processing line: ~ if x >= state.centerX - (state.grid_border[2] / 2) && x <= state.centerX + (state.grid_border[2] / 2)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if x >= state.centerX - (state.grid_border[2] / 2) && x <= state.centerX + (state.grid_border[2] / 2) +** Processing line: ~ delta = state.centerX - 640~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_buttons_frame_selection~ + delta = state.centerX - 640 +** Processing line: ~ # vertical lines have the same starting and ending x positions~ - Inside source: true *** True Line Result - def render_buttons_frame_selection -** Processing line: ~ args.outputs.primitives << state.buttons_frame_selection.items.map_with_index do |b, i|~ + # vertical lines have the same starting and ending x positions +** Processing line: ~ # starting y and ending y positions lead from the bottom of the border to the top of the border~ - Inside source: true *** True Line Result - args.outputs.primitives << state.buttons_frame_selection.items.map_with_index do |b, i| -** Processing line: ~ label = { x: b.x + state.buttons_frame_selection.size.half,~ + # starting y and ending y positions lead from the bottom of the border to the top of the border +** Processing line: ~ outputs.lines << [x - delta, state.grid_border[1], x - delta, state.grid_border[1] + state.grid_border[2], 150, 150, 150] # sets definition of vertical line and outputs it~ - Inside source: true *** True Line Result - label = { x: b.x + state.buttons_frame_selection.size.half, -** Processing line: ~ y: b.y,~ + outputs.lines << [x - delta, state.grid_border[1], x - delta, state.grid_border[1] + state.grid_border[2], 150, 150, 150] # sets definition of vertical line and outputs it +** Processing line: ~ end~ - Inside source: true *** True Line Result - y: b.y, -** Processing line: ~ text: "#{i + 1}", r: 180, g: 180, b: 180,~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - text: "#{i + 1}", r: 180, g: 180, b: 180, -** Processing line: ~ size_enum: -4, alignment_enum: 1 }.label~ + end +** Processing line: ~ temp = 0~ - Inside source: true *** True Line Result - size_enum: -4, alignment_enum: 1 }.label + temp = 0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ selection_border = b.merge(r: 40, g: 40, b: 40).border~ -- Inside source: true -*** True Line Result - selection_border = b.merge(r: 40, g: 40, b: 40).border -** Processing line: ~~ +** Processing line: ~ # Calculates the positions and outputs the y grid lines in the color gray.~ - Inside source: true *** True Line Result - -** Processing line: ~ if i == state.animation_frames_selected_index~ + # Calculates the positions and outputs the y grid lines in the color gray. +** Processing line: ~ state.gridY.map do # perform an action on all elements of the gridY collection~ - Inside source: true *** True Line Result - if i == state.animation_frames_selected_index -** Processing line: ~ selection_border = b.merge(r: 40, g: 230, b: 200).border~ + state.gridY.map do # perform an action on all elements of the gridY collection +** Processing line: ~ |y|~ - Inside source: true *** True Line Result - selection_border = b.merge(r: 40, g: 230, b: 200).border -** Processing line: ~ end~ + |y| +** Processing line: ~ temp += 1 # increment temp~ - Inside source: true *** True Line Result - end + temp += 1 # increment temp ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ [selection_border, label]~ +** Processing line: ~ # if y's value is greater than (or equal to) the y value of the border's bottom side~ - Inside source: true *** True Line Result - [selection_border, label] -** Processing line: ~ end~ + # if y's value is greater than (or equal to) the y value of the border's bottom side +** Processing line: ~ # and less than (or equal to) the y value of the border's top side~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # and less than (or equal to) the y value of the border's top side +** Processing line: ~ if y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) +** Processing line: ~ delta = state.centerY - 393~ - Inside source: true *** True Line Result - -** Processing line: ~ def render_animation_frame_thumbnails~ + delta = state.centerY - 393 +** Processing line: ~ # horizontal lines have the same starting and ending y positions~ - Inside source: true *** True Line Result - def render_animation_frame_thumbnails -** Processing line: ~ return if state.tick_count.zero?~ + # horizontal lines have the same starting and ending y positions +** Processing line: ~ # starting x and ending x positions lead from the left side of the border to the right side of the border~ - Inside source: true *** True Line Result - return if state.tick_count.zero? + # starting x and ending x positions lead from the left side of the border to the right side of the border +** Processing line: ~ outputs.lines << [state.grid_border[0], y - delta, state.grid_border[0] + state.grid_border[3], y - delta, 150, 150, 150] # sets definition of horizontal line and outputs it~ +- Inside source: true +*** True Line Result + outputs.lines << [state.grid_border[0], y - delta, state.grid_border[0] + state.grid_border[3], y - delta, 150, 150, 150] # sets definition of horizontal line and outputs it +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs[:current_animation_frame].width = rt_canvas.size~ +** Processing line: ~ # Sets values and outputs sprites for the filled_squares collection.~ - Inside source: true *** True Line Result - outputs[:current_animation_frame].width = rt_canvas.size -** Processing line: ~ outputs[:current_animation_frame].height = rt_canvas.size~ + # Sets values and outputs sprites for the filled_squares collection. +** Processing line: ~ state.filled_squares.map do # perform an action on every element of the filled_squares collection~ - Inside source: true *** True Line Result - outputs[:current_animation_frame].height = rt_canvas.size -** Processing line: ~ outputs[:current_animation_frame].solids << selected_animation_frame[:pixels].map_with_index do |f, i|~ + state.filled_squares.map do # perform an action on every element of the filled_squares collection +** Processing line: ~ |x, y, w, h, sprite|~ - Inside source: true *** True Line Result - outputs[:current_animation_frame].solids << selected_animation_frame[:pixels].map_with_index do |f, i| -** Processing line: ~ { x: f.x,~ + |x, y, w, h, sprite| +** Processing line: ~ # if x's value is greater than (or equal to) the x value of 17 pixels to the left of the border's left side~ - Inside source: true *** True Line Result - { x: f.x, -** Processing line: ~ y: f.y,~ + # if x's value is greater than (or equal to) the x value of 17 pixels to the left of the border's left side +** Processing line: ~ # and less than (or equal to) the x value of the border's right side~ - Inside source: true *** True Line Result - y: f.y, -** Processing line: ~ w: 1,~ + # and less than (or equal to) the x value of the border's right side +** Processing line: ~ # and y's value is greater than (or equal to) the y value of the border's bottom side~ - Inside source: true *** True Line Result - w: 1, -** Processing line: ~ h: 1, r: 255, g: 255, b: 255 }~ + # and y's value is greater than (or equal to) the y value of the border's bottom side +** Processing line: ~ # and less than (or equal to) the y value of 25 pixels above the border's top side~ - Inside source: true *** True Line Result - h: 1, r: 255, g: 255, b: 255 } -** Processing line: ~ end~ + # and less than (or equal to) the y value of 25 pixels above the border's top side +** Processing line: ~ # NOTE: The allowance of 17 pixels and 25 pixels is due to the fact that a grid box may be slightly cut off or~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # NOTE: The allowance of 17 pixels and 25 pixels is due to the fact that a grid box may be slightly cut off or +** Processing line: ~ # not entirely visible in the grid's view (until it is moved using "W", "A", "S", "D")~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.sprites << rt_canvas.sprite.merge(path: :current_animation_frame)~ + # not entirely visible in the grid's view (until it is moved using "W", "A", "S", "D") +** Processing line: ~ if x >= state.centerX - (state.grid_border[2] / 2) - 17 && x <= state.centerX + (state.grid_border[2] / 2) &&~ - Inside source: true *** True Line Result - outputs.sprites << rt_canvas.sprite.merge(path: :current_animation_frame) -** Processing line: ~~ + if x >= state.centerX - (state.grid_border[2] / 2) - 17 && x <= state.centerX + (state.grid_border[2] / 2) && +** Processing line: ~ y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) + 25~ - Inside source: true *** True Line Result - -** Processing line: ~ state.animation_frames.map_with_index do |animation_frame, animation_frame_index|~ + y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) + 25 +** Processing line: ~ # calculations done to place sprites in grid spaces that are meant to filled in~ - Inside source: true *** True Line Result - state.animation_frames.map_with_index do |animation_frame, animation_frame_index| -** Processing line: ~ outputs.sprites << state.buttons_frame_selection[:items][animation_frame_index][:inner_rect]~ + # calculations done to place sprites in grid spaces that are meant to filled in +** Processing line: ~ # mess around with the x and y values and see how the sprite placement changes~ - Inside source: true *** True Line Result - outputs.sprites << state.buttons_frame_selection[:items][animation_frame_index][:inner_rect] -** Processing line: ~ .merge(path: animation_frame[:rt_name])~ + # mess around with the x and y values and see how the sprite placement changes +** Processing line: ~ outputs.sprites << [x - state.centerX + 630, y - state.centerY + 360, w, h, sprite]~ - Inside source: true *** True Line Result - .merge(path: animation_frame[:rt_name]) -** Processing line: ~ end~ + outputs.sprites << [x - state.centerX + 630, y - state.centerY + 360, w, h, sprite] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render_animation~ +** Processing line: ~ # outputs a white solid along the left side of the grid (change the color and you'll be able to see it against the white background)~ - Inside source: true *** True Line Result - def render_animation -** Processing line: ~ sprite_index = 0.frame_index count: state.animation_frames.length,~ + # outputs a white solid along the left side of the grid (change the color and you'll be able to see it against the white background) +** Processing line: ~ # state.increment subtracted in x parameter because solid's position is denoted by bottom left corner~ - Inside source: true *** True Line Result - sprite_index = 0.frame_index count: state.animation_frames.length, -** Processing line: ~ hold_for: 60 / state.animation_frames_per_second,~ + # state.increment subtracted in x parameter because solid's position is denoted by bottom left corner +** Processing line: ~ # state.increment subtracted in y parameter to avoid covering the title label~ - Inside source: true *** True Line Result - hold_for: 60 / state.animation_frames_per_second, -** Processing line: ~ repeat: true~ + # state.increment subtracted in y parameter to avoid covering the title label +** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment,~ - Inside source: true *** True Line Result - repeat: true + outputs.primitives << [state.grid_border[0] - state.increment, +** Processing line: ~ state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2),~ +- Inside source: true +*** True Line Result + state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2), +** Processing line: ~ 255, 255, 255].solid~ +- Inside source: true +*** True Line Result + 255, 255, 255].solid ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.sprites << { x: 700 - 8,~ +** Processing line: ~ # outputs a white solid along the right side of the grid~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: 700 - 8, -** Processing line: ~ y: 120,~ + # outputs a white solid along the right side of the grid +** Processing line: ~ # state.increment subtracted from y parameter to avoid covering title label~ - Inside source: true *** True Line Result - y: 120, -** Processing line: ~ w: 16,~ + # state.increment subtracted from y parameter to avoid covering title label +** Processing line: ~ outputs.primitives << [state.grid_border[0] + state.grid_border[2],~ - Inside source: true *** True Line Result - w: 16, -** Processing line: ~ h: 16,~ + outputs.primitives << [state.grid_border[0] + state.grid_border[2], +** Processing line: ~ state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2),~ - Inside source: true *** True Line Result - h: 16, -** Processing line: ~ path: (sprite_path sprite_index) }~ + state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2), +** Processing line: ~ 255, 255, 255].solid~ - Inside source: true *** True Line Result - path: (sprite_path sprite_index) } + 255, 255, 255].solid ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.sprites << { x: 700 - 16,~ -- Inside source: true -*** True Line Result - args.outputs.sprites << { x: 700 - 16, -** Processing line: ~ y: 230,~ +** Processing line: ~ # outputs a white solid along the bottom of the grid~ - Inside source: true *** True Line Result - y: 230, -** Processing line: ~ w: 32,~ + # outputs a white solid along the bottom of the grid +** Processing line: ~ # state.increment subtracted from y parameter to avoid covering last row of grid boxes~ - Inside source: true *** True Line Result - w: 32, -** Processing line: ~ h: 32,~ + # state.increment subtracted from y parameter to avoid covering last row of grid boxes +** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] - state.increment,~ - Inside source: true *** True Line Result - h: 32, -** Processing line: ~ path: (sprite_path sprite_index) }~ + outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] - state.increment, +** Processing line: ~ state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid~ - Inside source: true *** True Line Result - path: (sprite_path sprite_index) } + state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.sprites << { x: 700 - 32,~ +** Processing line: ~ # outputs a white solid along the top of the grid~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: 700 - 32, -** Processing line: ~ y: 360,~ + # outputs a white solid along the top of the grid +** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] + state.grid_border[3],~ - Inside source: true *** True Line Result - y: 360, -** Processing line: ~ w: 64,~ + outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] + state.grid_border[3], +** Processing line: ~ state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid~ - Inside source: true *** True Line Result - w: 64, -** Processing line: ~ h: 64,~ + state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid +** Processing line: ~~ - Inside source: true *** True Line Result - h: 64, -** Processing line: ~ path: (sprite_path sprite_index) }~ + +** Processing line: ~ end~ - Inside source: true *** True Line Result - path: (sprite_path sprite_index) } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.sprites << { x: 700 - 64,~ +** Processing line: ~ # Outputs title and current tile pattern~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: 700 - 64, -** Processing line: ~ y: 520,~ + # Outputs title and current tile pattern +** Processing line: ~ def print_title~ - Inside source: true *** True Line Result - y: 520, -** Processing line: ~ w: 128,~ + def print_title +** Processing line: ~ outputs.labels << [640, 700, 'Mouse to Place Tile, WASD to Move Around', 7, 1] # title label~ - Inside source: true *** True Line Result - w: 128, -** Processing line: ~ h: 128,~ + outputs.labels << [640, 700, 'Mouse to Place Tile, WASD to Move Around', 7, 1] # title label +** Processing line: ~ outputs.lines << horizontal_separator(660, 0, 1280) # outputs horizontal separator~ - Inside source: true *** True Line Result - h: 128, -** Processing line: ~ path: (sprite_path sprite_index) }~ + outputs.lines << horizontal_separator(660, 0, 1280) # outputs horizontal separator +** Processing line: ~ outputs.labels << [1050, 500, 'Current:', 3, 1] # outputs Current label~ - Inside source: true *** True Line Result - path: (sprite_path sprite_index) } + outputs.labels << [1050, 500, 'Current:', 3, 1] # outputs Current label +** Processing line: ~ outputs.sprites << [1110, 474, state.tileSize / 2, state.tileSize / 2, 'sprites/image' + state.tileSelected.to_s + ".png"] # outputs sprite of current tile pattern using images in sprites folder; output is half the size of a tile~ +- Inside source: true +*** True Line Result + outputs.sprites << [1110, 474, state.tileSize / 2, state.tileSize / 2, 'sprites/image' + state.tileSelected.to_s + ".png"] # outputs sprite of current tile pattern using images in sprites folder; output is half the size of a tile ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97352,50 +104255,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def input_mouse_click~ -- Inside source: true -*** True Line Result - def input_mouse_click -** Processing line: ~ if inputs.mouse.up~ -- Inside source: true -*** True Line Result - if inputs.mouse.up -** Processing line: ~ state.last_mouse_up = state.tick_count~ +** Processing line: ~ # Sets the starting position, ending position, and color for the horizontal separator.~ - Inside source: true *** True Line Result - state.last_mouse_up = state.tick_count -** Processing line: ~ elsif inputs.mouse.moved && user_is_editing?~ + # Sets the starting position, ending position, and color for the horizontal separator. +** Processing line: ~ def horizontal_separator y, x, x2~ - Inside source: true *** True Line Result - elsif inputs.mouse.moved && user_is_editing? -** Processing line: ~ edit_current_animation_frame inputs.mouse.point~ + def horizontal_separator y, x, x2 +** Processing line: ~ [x, y, x2, y, 150, 150, 150] # definition of separator; horizontal line means same starting/ending y~ - Inside source: true *** True Line Result - edit_current_animation_frame inputs.mouse.point -** Processing line: ~ end~ + [x, y, x2, y, 150, 150, 150] # definition of separator; horizontal line means same starting/ending y +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ return unless inputs.mouse.click~ +** Processing line: ~ # Checks if the mouse is being clicked or dragged~ - Inside source: true *** True Line Result - return unless inputs.mouse.click -** Processing line: ~~ + # Checks if the mouse is being clicked or dragged +** Processing line: ~ def check_click~ - Inside source: true *** True Line Result - -** Processing line: ~ clicked_frame_button = state.buttons_frame_selection.items.find do |b|~ + def check_click +** Processing line: ~ if inputs.keyboard.key_down.r # if the "r" key is pressed down~ - Inside source: true *** True Line Result - clicked_frame_button = state.buttons_frame_selection.items.find do |b| -** Processing line: ~ inputs.mouse.point.inside_rect? b~ + if inputs.keyboard.key_down.r # if the "r" key is pressed down +** Processing line: ~ $dragon.reset~ - Inside source: true *** True Line Result - inputs.mouse.point.inside_rect? b + $dragon.reset ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97404,110 +104299,110 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if (clicked_frame_button)~ +** Processing line: ~ if inputs.mouse.down #is mouse up or down?~ - Inside source: true *** True Line Result - if (clicked_frame_button) -** Processing line: ~ state.animation_frames_selected_index = clicked_frame_button[:index]~ + if inputs.mouse.down #is mouse up or down? +** Processing line: ~ state.mouse_held = true~ - Inside source: true *** True Line Result - state.animation_frames_selected_index = clicked_frame_button[:index] -** Processing line: ~ end~ + state.mouse_held = true +** Processing line: ~ if inputs.mouse.position.x < state.grid_border[0] # if mouse's x position is inside the grid's borders~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if inputs.mouse.position.x < state.grid_border[0] # if mouse's x position is inside the grid's borders +** Processing line: ~ state.tileCords.map do # perform action on all elements of tileCords collection~ - Inside source: true *** True Line Result - -** Processing line: ~ if (inputs.mouse.point.inside_rect? rt_canvas.sprite)~ + state.tileCords.map do # perform action on all elements of tileCords collection +** Processing line: ~ |x, y, order|~ - Inside source: true *** True Line Result - if (inputs.mouse.point.inside_rect? rt_canvas.sprite) -** Processing line: ~ state.last_mouse_down = state.tick_count~ + |x, y, order| +** Processing line: ~ # if mouse's x position is greater than (or equal to) the starting x position of a tile~ - Inside source: true *** True Line Result - state.last_mouse_down = state.tick_count -** Processing line: ~ edit_current_animation_frame inputs.mouse.point~ + # if mouse's x position is greater than (or equal to) the starting x position of a tile +** Processing line: ~ # and the mouse's x position is also less than (or equal to) the ending x position of that tile,~ - Inside source: true *** True Line Result - edit_current_animation_frame inputs.mouse.point -** Processing line: ~ end~ + # and the mouse's x position is also less than (or equal to) the ending x position of that tile, +** Processing line: ~ # and the mouse's y position is greater than (or equal to) the starting y position of that tile,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # and the mouse's y position is greater than (or equal to) the starting y position of that tile, +** Processing line: ~ # and the mouse's y position is also less than (or equal to) the ending y position of that tile,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + # and the mouse's y position is also less than (or equal to) the ending y position of that tile, +** Processing line: ~ # (BASICALLY, IF THE MOUSE'S POSITION IS WITHIN THE STARTING AND ENDING POSITIONS OF A TILE)~ - Inside source: true *** True Line Result - -** Processing line: ~ def input_keyboard~ + # (BASICALLY, IF THE MOUSE'S POSITION IS WITHIN THE STARTING AND ENDING POSITIONS OF A TILE) +** Processing line: ~ if inputs.mouse.position.x >= x && inputs.mouse.position.x <= x + state.tileSize &&~ - Inside source: true *** True Line Result - def input_keyboard -** Processing line: ~ # w to save~ + if inputs.mouse.position.x >= x && inputs.mouse.position.x <= x + state.tileSize && +** Processing line: ~ inputs.mouse.position.y >= y && inputs.mouse.position.y <= y + state.tileSize~ - Inside source: true *** True Line Result - # w to save -** Processing line: ~ if inputs.keyboard.key_down.w~ + inputs.mouse.position.y >= y && inputs.mouse.position.y <= y + state.tileSize +** Processing line: ~ state.tileSelected = order # that tile is selected~ - Inside source: true *** True Line Result - if inputs.keyboard.key_down.w -** Processing line: ~ t = Time.now~ + state.tileSelected = order # that tile is selected +** Processing line: ~ end~ - Inside source: true *** True Line Result - t = Time.now -** Processing line: ~ state.save_description = "Time: #{t} (#{t.to_i})"~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.save_description = "Time: #{t} (#{t.to_i})" -** Processing line: ~ gtk.serialize_state 'canvas/state.txt', state~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - gtk.serialize_state 'canvas/state.txt', state -** Processing line: ~ gtk.serialize_state "tmp/canvas_backups/#{t.to_i}/state.txt", state~ + end +** Processing line: ~ elsif inputs.mouse.up # otherwise, if the mouse is in the "up" state~ - Inside source: true *** True Line Result - gtk.serialize_state "tmp/canvas_backups/#{t.to_i}/state.txt", state -** Processing line: ~ animation_frames.each_with_index do |animation_frame, i|~ + elsif inputs.mouse.up # otherwise, if the mouse is in the "up" state +** Processing line: ~ state.mouse_held = false # mouse is not held down or dragged~ - Inside source: true *** True Line Result - animation_frames.each_with_index do |animation_frame, i| -** Processing line: ~ queues.update_rt_animation_frame << { index: i,~ + state.mouse_held = false # mouse is not held down or dragged +** Processing line: ~ state.mouse_dragging = false~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: i, -** Processing line: ~ at: state.tick_count + i,~ + state.mouse_dragging = false +** Processing line: ~ end~ - Inside source: true *** True Line Result - at: state.tick_count + i, -** Processing line: ~ queue_sprite_creation: true }~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - queue_sprite_creation: true } -** Processing line: ~ queues.create_sprite << { index: i,~ + +** Processing line: ~ if state.mouse_held && # mouse needs to be down~ - Inside source: true *** True Line Result - queues.create_sprite << { index: i, -** Processing line: ~ at: state.tick_count + animation_frames.length + i,~ + if state.mouse_held && # mouse needs to be down +** Processing line: ~ !inputs.mouse.click && # must not be first click~ - Inside source: true *** True Line Result - at: state.tick_count + animation_frames.length + i, -** Processing line: ~ path_override: "tmp/canvas_backups/#{t.to_i}/sprite-#{i}.png" }~ + !inputs.mouse.click && # must not be first click +** Processing line: ~ ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15 ||~ - Inside source: true *** True Line Result - path_override: "tmp/canvas_backups/#{t.to_i}/sprite-#{i}.png" } -** Processing line: ~ end~ + ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15 || +** Processing line: ~ (inputs.mouse.previous_click.point.y - inputs.mouse.position.y).abs > 15) # Need to move 15 pixels before "drag"~ - Inside source: true *** True Line Result - end -** Processing line: ~ gtk.notify! "Canvas saved."~ + (inputs.mouse.previous_click.point.y - inputs.mouse.position.y).abs > 15) # Need to move 15 pixels before "drag" +** Processing line: ~ state.mouse_dragging = true~ - Inside source: true *** True Line Result - gtk.notify! "Canvas saved." + state.mouse_dragging = true ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97516,42 +104411,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # l to load~ -- Inside source: true -*** True Line Result - # l to load -** Processing line: ~ if inputs.keyboard.key_down.l~ -- Inside source: true -*** True Line Result - if inputs.keyboard.key_down.l -** Processing line: ~ args.state = gtk.deserialize_state 'canvas/state.txt'~ +** Processing line: ~ # if mouse is clicked inside grid's border, search_lines method is called with click input type~ - Inside source: true *** True Line Result - args.state = gtk.deserialize_state 'canvas/state.txt' -** Processing line: ~ animation_frames.each_with_index do |a, i|~ + # if mouse is clicked inside grid's border, search_lines method is called with click input type +** Processing line: ~ if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))~ - Inside source: true *** True Line Result - animation_frames.each_with_index do |a, i| -** Processing line: ~ queues.update_rt_animation_frame << { index: i,~ + if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border)) +** Processing line: ~ search_lines(inputs.mouse.click.point, :click)~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: i, -** Processing line: ~ at: state.tick_count + i,~ + search_lines(inputs.mouse.click.point, :click) +** Processing line: ~~ - Inside source: true *** True Line Result - at: state.tick_count + i, -** Processing line: ~ queue_sprite_creation: true }~ + +** Processing line: ~ # if mouse is dragged inside grid's border, search_lines method is called with drag input type~ - Inside source: true *** True Line Result - queue_sprite_creation: true } -** Processing line: ~ end~ + # if mouse is dragged inside grid's border, search_lines method is called with drag input type +** Processing line: ~ elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))~ - Inside source: true *** True Line Result - end -** Processing line: ~ gtk.notify! "Canvas loaded."~ + elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border)) +** Processing line: ~ search_lines(inputs.mouse.position, :drag)~ - Inside source: true *** True Line Result - gtk.notify! "Canvas loaded." + search_lines(inputs.mouse.position, :drag) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97560,174 +104447,154 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # d to go into delete mode, release to paint~ -- Inside source: true -*** True Line Result - # d to go into delete mode, release to paint -** Processing line: ~ if inputs.keyboard.key_held.d~ +** Processing line: ~ # Changes grid's position on screen by moving it up, down, left, or right.~ - Inside source: true *** True Line Result - if inputs.keyboard.key_held.d -** Processing line: ~ state.edit_mode = :erasing~ + # Changes grid's position on screen by moving it up, down, left, or right. +** Processing line: ~~ - Inside source: true *** True Line Result - state.edit_mode = :erasing -** Processing line: ~ gtk.notify! "Erasing." if inputs.keyboard.key_held.d == (state.tick_count - 1)~ + +** Processing line: ~ # centerX is incremented by speed if the "d" key is pressed and if that sum is less than~ - Inside source: true *** True Line Result - gtk.notify! "Erasing." if inputs.keyboard.key_held.d == (state.tick_count - 1) -** Processing line: ~ elsif inputs.keyboard.key_up.d~ + # centerX is incremented by speed if the "d" key is pressed and if that sum is less than +** Processing line: ~ # the original left side of the center plus half the grid, minus half the top border of grid.~ - Inside source: true *** True Line Result - elsif inputs.keyboard.key_up.d -** Processing line: ~ state.edit_mode = :drawing~ + # the original left side of the center plus half the grid, minus half the top border of grid. +** Processing line: ~ # MOVES GRID RIGHT (increasing x)~ - Inside source: true *** True Line Result - state.edit_mode = :drawing -** Processing line: ~ gtk.notify! "Drawing."~ + # MOVES GRID RIGHT (increasing x) +** Processing line: ~ state.centerX += state.speed if inputs.keyboard.key_held.d &&~ - Inside source: true *** True Line Result - gtk.notify! "Drawing." -** Processing line: ~ end~ + state.centerX += state.speed if inputs.keyboard.key_held.d && +** Processing line: ~ (state.centerX + state.speed) < state.originalCenter[0] + (state.gridSize / 2) - (state.grid_border[2] / 2)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + (state.centerX + state.speed) < state.originalCenter[0] + (state.gridSize / 2) - (state.grid_border[2] / 2) +** Processing line: ~ # centerX is decremented by speed if the "a" key is pressed and if that difference is greater than~ - Inside source: true *** True Line Result - -** Processing line: ~ # a to add a frame to the end~ + # centerX is decremented by speed if the "a" key is pressed and if that difference is greater than +** Processing line: ~ # the original left side of the center minus half the grid, plus half the top border of grid.~ - Inside source: true *** True Line Result - # a to add a frame to the end -** Processing line: ~ if inputs.keyboard.key_down.a~ + # the original left side of the center minus half the grid, plus half the top border of grid. +** Processing line: ~ # MOVES GRID LEFT (decreasing x)~ - Inside source: true *** True Line Result - if inputs.keyboard.key_down.a -** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index,~ + # MOVES GRID LEFT (decreasing x) +** Processing line: ~ state.centerX -= state.speed if inputs.keyboard.key_held.a &&~ - Inside source: true *** True Line Result - queues.create_sprite << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count }~ + state.centerX -= state.speed if inputs.keyboard.key_held.a && +** Processing line: ~ (state.centerX - state.speed) > state.originalCenter[0] - (state.gridSize / 2) + (state.grid_border[2] / 2)~ - Inside source: true *** True Line Result - at: state.tick_count } -** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index + 1,~ + (state.centerX - state.speed) > state.originalCenter[0] - (state.gridSize / 2) + (state.grid_border[2] / 2) +** Processing line: ~ # centerY is incremented by speed if the "w" key is pressed and if that sum is less than~ - Inside source: true *** True Line Result - queues.create_sprite << { index: state.animation_frames_selected_index + 1, -** Processing line: ~ at: state.tick_count }~ + # centerY is incremented by speed if the "w" key is pressed and if that sum is less than +** Processing line: ~ # the original bottom of the center plus half the grid, minus half the right border of grid.~ - Inside source: true *** True Line Result - at: state.tick_count } -** Processing line: ~ add_animation_frame_to_end~ + # the original bottom of the center plus half the grid, minus half the right border of grid. +** Processing line: ~ # MOVES GRID UP (increasing y)~ - Inside source: true *** True Line Result - add_animation_frame_to_end -** Processing line: ~ gtk.notify! "Frame added to end."~ + # MOVES GRID UP (increasing y) +** Processing line: ~ state.centerY += state.speed if inputs.keyboard.key_held.w &&~ - Inside source: true *** True Line Result - gtk.notify! "Frame added to end." -** Processing line: ~ end~ + state.centerY += state.speed if inputs.keyboard.key_held.w && +** Processing line: ~ (state.centerY + state.speed) < state.originalCenter[1] + (state.gridSize / 2) - (state.grid_border[3] / 2)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + (state.centerY + state.speed) < state.originalCenter[1] + (state.gridSize / 2) - (state.grid_border[3] / 2) +** Processing line: ~ # centerY is decremented by speed if the "s" key is pressed and if the difference is greater than~ - Inside source: true *** True Line Result - -** Processing line: ~ # c or t to copy~ + # centerY is decremented by speed if the "s" key is pressed and if the difference is greater than +** Processing line: ~ # the original bottom of the center minus half the grid, plus half the right border of grid.~ - Inside source: true *** True Line Result - # c or t to copy -** Processing line: ~ if (inputs.keyboard.key_down.c || inputs.keyboard.key_down.t)~ + # the original bottom of the center minus half the grid, plus half the right border of grid. +** Processing line: ~ # MOVES GRID DOWN (decreasing y)~ - Inside source: true *** True Line Result - if (inputs.keyboard.key_down.c || inputs.keyboard.key_down.t) -** Processing line: ~ state.clipboard = [selected_animation_frame[:pixels]].flatten~ + # MOVES GRID DOWN (decreasing y) +** Processing line: ~ state.centerY -= state.speed if inputs.keyboard.key_held.s &&~ - Inside source: true *** True Line Result - state.clipboard = [selected_animation_frame[:pixels]].flatten -** Processing line: ~ gtk.notify! "Current frame copied."~ + state.centerY -= state.speed if inputs.keyboard.key_held.s && +** Processing line: ~ (state.centerY - state.speed) > state.originalCenter[1] - (state.gridSize / 2) + (state.grid_border[3] / 2)~ - Inside source: true *** True Line Result - gtk.notify! "Current frame copied." -** Processing line: ~ end~ + (state.centerY - state.speed) > state.originalCenter[1] - (state.gridSize / 2) + (state.grid_border[3] / 2) +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # v or q to paste~ +** Processing line: ~ # Performs calculations on the gridX and gridY collections, and sets values.~ - Inside source: true *** True Line Result - # v or q to paste -** Processing line: ~ if (inputs.keyboard.key_down.v || inputs.keyboard.key_down.q) && state.clipboard~ + # Performs calculations on the gridX and gridY collections, and sets values. +** Processing line: ~ # Sets the definition of a grid box, including the image that it is filled with.~ - Inside source: true *** True Line Result - if (inputs.keyboard.key_down.v || inputs.keyboard.key_down.q) && state.clipboard -** Processing line: ~ selected_animation_frame[:pixels] = [state.clipboard].flatten~ + # Sets the definition of a grid box, including the image that it is filled with. +** Processing line: ~ def search_lines (point, input_type)~ - Inside source: true *** True Line Result - selected_animation_frame[:pixels] = [state.clipboard].flatten -** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ + def search_lines (point, input_type) +** Processing line: ~ point.x += state.centerX - 630 # increments x and y~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count,~ + point.x += state.centerX - 630 # increments x and y +** Processing line: ~ point.y += state.centerY - 360~ - Inside source: true *** True Line Result - at: state.tick_count, -** Processing line: ~ queue_sprite_creation: true }~ + point.y += state.centerY - 360 +** Processing line: ~ findX = 0~ - Inside source: true *** True Line Result - queue_sprite_creation: true } -** Processing line: ~ gtk.notify! "Pasted."~ + findX = 0 +** Processing line: ~ findY = 0~ - Inside source: true *** True Line Result - gtk.notify! "Pasted." -** Processing line: ~ end~ + findY = 0 +** Processing line: ~ increment = state.gridSize / state.lineQuantity # divides grid by number of separators~ - Inside source: true *** True Line Result - end + increment = state.gridSize / state.lineQuantity # divides grid by number of separators ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # f to go forward/next frame~ -- Inside source: true -*** True Line Result - # f to go forward/next frame -** Processing line: ~ if (inputs.keyboard.key_down.f)~ -- Inside source: true -*** True Line Result - if (inputs.keyboard.key_down.f) -** Processing line: ~ if (state.animation_frames_selected_index == (state.animation_frames.length - 1))~ -- Inside source: true -*** True Line Result - if (state.animation_frames_selected_index == (state.animation_frames.length - 1)) -** Processing line: ~ state.animation_frames_selected_index = 0~ -- Inside source: true -*** True Line Result - state.animation_frames_selected_index = 0 -** Processing line: ~ else~ +** Processing line: ~ state.gridX.map do # perform an action on every element of collection~ - Inside source: true *** True Line Result - else -** Processing line: ~ state.animation_frames_selected_index += 1~ + state.gridX.map do # perform an action on every element of collection +** Processing line: ~ |x|~ - Inside source: true *** True Line Result - state.animation_frames_selected_index += 1 -** Processing line: ~ end~ + |x| +** Processing line: ~ # findX increments x by 10 if point.x is less than that sum and findX is currently 0~ - Inside source: true *** True Line Result - end -** Processing line: ~ gtk.notify! "Next frame."~ + # findX increments x by 10 if point.x is less than that sum and findX is currently 0 +** Processing line: ~ findX = x + 10 if point.x < (x + 10) && findX == 0~ - Inside source: true *** True Line Result - gtk.notify! "Next frame." + findX = x + 10 if point.x < (x + 10) && findX == 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97736,202 +104603,194 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # b to go back/previous frame~ -- Inside source: true -*** True Line Result - # b to go back/previous frame -** Processing line: ~ if (inputs.keyboard.key_down.b)~ +** Processing line: ~ state.gridY.map do~ - Inside source: true *** True Line Result - if (inputs.keyboard.key_down.b) -** Processing line: ~ if (state.animation_frames_selected_index == 0)~ + state.gridY.map do +** Processing line: ~ |y|~ - Inside source: true *** True Line Result - if (state.animation_frames_selected_index == 0) -** Processing line: ~ state.animation_frames_selected_index = state.animation_frames.length - 1~ + |y| +** Processing line: ~ # findY is set to y if point.y is less than that value and findY is currently 0~ - Inside source: true *** True Line Result - state.animation_frames_selected_index = state.animation_frames.length - 1 -** Processing line: ~ else~ + # findY is set to y if point.y is less than that value and findY is currently 0 +** Processing line: ~ findY = y if point.y < (y) && findY == 0~ - Inside source: true *** True Line Result - else -** Processing line: ~ state.animation_frames_selected_index -= 1~ + findY = y if point.y < (y) && findY == 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.animation_frames_selected_index -= 1 -** Processing line: ~ end~ + end +** Processing line: ~ # position of a box is denoted by bottom left corner, which is why the increment is being subtracted~ - Inside source: true *** True Line Result - end -** Processing line: ~ gtk.notify! "Previous frame."~ + # position of a box is denoted by bottom left corner, which is why the increment is being subtracted +** Processing line: ~ grid_box = [findX - (increment.ceil), findY - (increment.ceil), increment.ceil, increment.ceil,~ - Inside source: true *** True Line Result - gtk.notify! "Previous frame." -** Processing line: ~ end~ + grid_box = [findX - (increment.ceil), findY - (increment.ceil), increment.ceil, increment.ceil, +** Processing line: ~ "sprites/image" + state.tileSelected.to_s + ".png"] # sets sprite definition~ - Inside source: true *** True Line Result - end + "sprites/image" + state.tileSelected.to_s + ".png"] # sets sprite definition ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # x to delete frame~ -- Inside source: true -*** True Line Result - # x to delete frame -** Processing line: ~ if (inputs.keyboard.key_down.x) && animation_frames.length > 1~ +** Processing line: ~ if input_type == :click # if user clicks their mouse~ - Inside source: true *** True Line Result - if (inputs.keyboard.key_down.x) && animation_frames.length > 1 -** Processing line: ~ state.clipboard = selected_animation_frame[:pixels]~ + if input_type == :click # if user clicks their mouse +** Processing line: ~ if state.filled_squares.include? grid_box # if grid box is already filled in~ - Inside source: true *** True Line Result - state.clipboard = selected_animation_frame[:pixels] -** Processing line: ~ state.animation_frames = animation_frames.find_all { |v| v[:index] != state.animation_frames_selected_index }~ + if state.filled_squares.include? grid_box # if grid box is already filled in +** Processing line: ~ state.filled_squares.delete grid_box # box is cleared and removed from filled_squares~ - Inside source: true *** True Line Result - state.animation_frames = animation_frames.find_all { |v| v[:index] != state.animation_frames_selected_index } -** Processing line: ~ if state.animation_frames_selected_index >= state.animation_frames.length~ + state.filled_squares.delete grid_box # box is cleared and removed from filled_squares +** Processing line: ~ else~ - Inside source: true *** True Line Result - if state.animation_frames_selected_index >= state.animation_frames.length -** Processing line: ~ state.animation_frames_selected_index = state.animation_frames.length - 1~ + else +** Processing line: ~ state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares~ - Inside source: true *** True Line Result - state.animation_frames_selected_index = state.animation_frames.length - 1 + state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ gtk.notify! "Frame deleted."~ +** Processing line: ~ elsif input_type == :drag # if user drags mouse~ - Inside source: true *** True Line Result - gtk.notify! "Frame deleted." -** Processing line: ~ end~ + elsif input_type == :drag # if user drags mouse +** Processing line: ~ unless state.filled_squares.include? grid_box # unless grid box dragged over is already filled in~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + unless state.filled_squares.include? grid_box # unless grid box dragged over is already filled in +** Processing line: ~ state.filled_squares << grid_box # box is filled in and added to filled_squares~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + state.filled_squares << grid_box # box is filled in and added to filled_squares +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def calc_auto_export~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def calc_auto_export -** Processing line: ~ return if user_is_editing?~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - return if user_is_editing? -** Processing line: ~ return if state.last_mouse_up.elapsed_time != 30~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - return if state.last_mouse_up.elapsed_time != 30 -** Processing line: ~ # auto export current animation frame if there is no editing for 30 ticks~ + +** Processing line: ~ # Creates a "Clear" button using labels and borders.~ - Inside source: true *** True Line Result - # auto export current animation frame if there is no editing for 30 ticks -** Processing line: ~ queues.create_sprite << { index: state.animation_frames_selected_index,~ + # Creates a "Clear" button using labels and borders. +** Processing line: ~ def draw_buttons~ - Inside source: true *** True Line Result - queues.create_sprite << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count }~ + def draw_buttons +** Processing line: ~ x, y, w, h = 390, 50, 240, 50~ - Inside source: true *** True Line Result - at: state.tick_count } -** Processing line: ~ end~ + x, y, w, h = 390, 50, 240, 50 +** Processing line: ~ state.clear_button ||= state.new_entity(:button_with_fade)~ - Inside source: true *** True Line Result - end + state.clear_button ||= state.new_entity(:button_with_fade) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_buttons_frame_selection~ -- Inside source: true -*** True Line Result - def calc_buttons_frame_selection -** Processing line: ~ state.buttons_frame_selection.items = animation_frames.length.map_with_index do |i|~ +** Processing line: ~ # x and y positions are set to display "Clear" label in center of the button~ - Inside source: true *** True Line Result - state.buttons_frame_selection.items = animation_frames.length.map_with_index do |i| -** Processing line: ~ { x: state.buttons_frame_selection.left + i * state.buttons_frame_selection.size,~ + # x and y positions are set to display "Clear" label in center of the button +** Processing line: ~ # Try changing first two parameters to simply x, y and see what happens to the text placement~ - Inside source: true *** True Line Result - { x: state.buttons_frame_selection.left + i * state.buttons_frame_selection.size, -** Processing line: ~ y: state.buttons_frame_selection.top - state.buttons_frame_selection.size,~ + # Try changing first two parameters to simply x, y and see what happens to the text placement +** Processing line: ~ state.clear_button.label ||= [x + w.half, y + h.half + 10, "Clear", 0, 1]~ - Inside source: true *** True Line Result - y: state.buttons_frame_selection.top - state.buttons_frame_selection.size, -** Processing line: ~ inner_rect: {~ + state.clear_button.label ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] +** Processing line: ~ state.clear_button.border ||= [x, y, w, h] # definition of button's border~ - Inside source: true *** True Line Result - inner_rect: { -** Processing line: ~ x: (state.buttons_frame_selection.left + 2) + i * state.buttons_frame_selection.size,~ + state.clear_button.border ||= [x, y, w, h] # definition of button's border +** Processing line: ~~ - Inside source: true *** True Line Result - x: (state.buttons_frame_selection.left + 2) + i * state.buttons_frame_selection.size, -** Processing line: ~ y: (state.buttons_frame_selection.top - state.buttons_frame_selection.size + 2),~ + +** Processing line: ~ # If the mouse is clicked inside the borders of the clear button~ - Inside source: true *** True Line Result - y: (state.buttons_frame_selection.top - state.buttons_frame_selection.size + 2), -** Processing line: ~ w: 16,~ + # If the mouse is clicked inside the borders of the clear button +** Processing line: ~ if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)~ - Inside source: true *** True Line Result - w: 16, -** Processing line: ~ h: 16,~ + if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border) +** Processing line: ~ state.clear_button.clicked_at = inputs.mouse.click.created_at # value is frame of mouse click~ - Inside source: true *** True Line Result - h: 16, -** Processing line: ~ },~ + state.clear_button.clicked_at = inputs.mouse.click.created_at # value is frame of mouse click +** Processing line: ~ state.filled_squares.clear # filled squares collection is emptied (squares are cleared)~ - Inside source: true *** True Line Result - }, -** Processing line: ~ w: state.buttons_frame_selection.size,~ + state.filled_squares.clear # filled squares collection is emptied (squares are cleared) +** Processing line: ~ inputs.mouse.previous_click = nil # no previous click~ - Inside source: true *** True Line Result - w: state.buttons_frame_selection.size, -** Processing line: ~ h: state.buttons_frame_selection.size,~ + inputs.mouse.previous_click = nil # no previous click +** Processing line: ~ end~ - Inside source: true *** True Line Result - h: state.buttons_frame_selection.size, -** Processing line: ~ index: i }~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - index: i } -** Processing line: ~ end~ + +** Processing line: ~ outputs.labels << state.clear_button.label # outputs clear button~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + outputs.labels << state.clear_button.label # outputs clear button +** Processing line: ~ outputs.borders << state.clear_button.border~ - Inside source: true *** True Line Result - end + outputs.borders << state.clear_button.border ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def calc_animation_frames~ +** Processing line: ~ # When the clear button is clicked, the color of the button changes~ - Inside source: true *** True Line Result - def calc_animation_frames -** Processing line: ~ animation_frames.each_with_index do |animation_frame, i|~ + # When the clear button is clicked, the color of the button changes +** Processing line: ~ # and the transparency changes, as well. If you change the time from~ - Inside source: true *** True Line Result - animation_frames.each_with_index do |animation_frame, i| -** Processing line: ~ animation_frame[:index] = i~ + # and the transparency changes, as well. If you change the time from +** Processing line: ~ # 0.25.seconds to 1.25.seconds or more, the change will last longer.~ - Inside source: true *** True Line Result - animation_frame[:index] = i -** Processing line: ~ animation_frame[:rt_name] = "animation_frame_#{i}"~ + # 0.25.seconds to 1.25.seconds or more, the change will last longer. +** Processing line: ~ if state.clear_button.clicked_at~ - Inside source: true *** True Line Result - animation_frame[:rt_name] = "animation_frame_#{i}" + if state.clear_button.clicked_at +** Processing line: ~ outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]~ +- Inside source: true +*** True Line Result + outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -97940,82 +104799,90 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def process_queue_create_sprite~ +** Processing line: ~ $tile_editor = TileEditor.new~ - Inside source: true *** True Line Result - def process_queue_create_sprite -** Processing line: ~ sprites_to_create = queues.create_sprite~ + $tile_editor = TileEditor.new +** Processing line: ~~ - Inside source: true *** True Line Result - sprites_to_create = queues.create_sprite -** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ + +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - .find_all { |h| h[:at].elapsed? } -** Processing line: ~~ + def tick args +** Processing line: ~ $tile_editor.inputs = args.inputs~ - Inside source: true *** True Line Result - -** Processing line: ~ queues.create_sprite = queues.create_sprite - sprites_to_create~ + $tile_editor.inputs = args.inputs +** Processing line: ~ $tile_editor.grid = args.grid~ - Inside source: true *** True Line Result - queues.create_sprite = queues.create_sprite - sprites_to_create -** Processing line: ~~ + $tile_editor.grid = args.grid +** Processing line: ~ $tile_editor.args = args~ - Inside source: true *** True Line Result - -** Processing line: ~ sprites_to_create.each do |h|~ + $tile_editor.args = args +** Processing line: ~ $tile_editor.outputs = args.outputs~ - Inside source: true *** True Line Result - sprites_to_create.each do |h| -** Processing line: ~ export_animation_frame h[:index], h[:path_override]~ + $tile_editor.outputs = args.outputs +** Processing line: ~ $tile_editor.state = args.state~ - Inside source: true *** True Line Result - export_animation_frame h[:index], h[:path_override] -** Processing line: ~ end~ + $tile_editor.state = args.state +** Processing line: ~ $tile_editor.tick~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + $tile_editor.tick +** Processing line: ~ tick_instructions args, "Roll your own tile editor. CLICK to select a sprite. CLICK in grid to place sprite. WASD to move around."~ - Inside source: true *** True Line Result - end + tick_instructions args, "Roll your own tile editor. CLICK to select a sprite. CLICK in grid to place sprite. WASD to move around." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def process_queue_reset_sprite~ +** Processing line: ~ def tick_instructions args, text, y = 715~ - Inside source: true *** True Line Result - def process_queue_reset_sprite -** Processing line: ~ sprites_to_reset = queues.reset_sprite~ + def tick_instructions args, text, y = 715 +** Processing line: ~ return if args.state.key_event_occurred~ - Inside source: true *** True Line Result - sprites_to_reset = queues.reset_sprite -** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ + return if args.state.key_event_occurred +** Processing line: ~ if args.inputs.mouse.click ||~ - Inside source: true *** True Line Result - .find_all { |h| h[:at].elapsed? } -** Processing line: ~~ + if args.inputs.mouse.click || +** Processing line: ~ args.inputs.keyboard.directional_vector ||~ - Inside source: true *** True Line Result - -** Processing line: ~ queues.reset_sprite -= sprites_to_reset~ + args.inputs.keyboard.directional_vector || +** Processing line: ~ args.inputs.keyboard.key_down.enter ||~ - Inside source: true *** True Line Result - queues.reset_sprite -= sprites_to_reset -** Processing line: ~~ + args.inputs.keyboard.key_down.enter || +** Processing line: ~ args.inputs.keyboard.key_down.escape~ - Inside source: true *** True Line Result - -** Processing line: ~ sprites_to_reset.each { |h| gtk.reset_sprite (sprite_path h[:index]) }~ + args.inputs.keyboard.key_down.escape +** Processing line: ~ args.state.key_event_occurred = true~ - Inside source: true *** True Line Result - sprites_to_reset.each { |h| gtk.reset_sprite (sprite_path h[:index]) } + args.state.key_event_occurred = true ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98024,62 +104891,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def process_queue_update_rt_animation_frame~ +** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ - Inside source: true *** True Line Result - def process_queue_update_rt_animation_frame -** Processing line: ~ animation_frames_to_update = queues.update_rt_animation_frame~ + args.outputs.debug << [0, y - 50, 1280, 60].solid +** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ - Inside source: true *** True Line Result - animation_frames_to_update = queues.update_rt_animation_frame -** Processing line: ~ .find_all { |h| h[:at].elapsed? }~ + args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label +** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ - Inside source: true *** True Line Result - .find_all { |h| h[:at].elapsed? } + args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ queues.update_rt_animation_frame -= animation_frames_to_update~ -- Inside source: true +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - queues.update_rt_animation_frame -= animation_frames_to_update +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ animation_frames_to_update.each do |h|~ +** Processing line: ~*** Dungeon Crawl - Classics Jam - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** Dungeon Crawl - Classics Jam - 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_dungeon_crawl/classics_jam/app/main.rb~ - Inside source: true *** True Line Result - animation_frames_to_update.each do |h| -** Processing line: ~ update_animation_frame_render_target animation_frames[h[:index]]~ + # ./samples/99_genre_dungeon_crawl/classics_jam/app/main.rb +** Processing line: ~ class Game~ - Inside source: true *** True Line Result - update_animation_frame_render_target animation_frames[h[:index]] + class Game +** Processing line: ~ attr_gtk~ +- Inside source: true +*** True Line Result + attr_gtk ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if h[:queue_sprite_creation]~ +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - if h[:queue_sprite_creation] -** Processing line: ~ queues.create_sprite << { index: h[:index],~ + def tick +** Processing line: ~ defaults~ - Inside source: true *** True Line Result - queues.create_sprite << { index: h[:index], -** Processing line: ~ at: state.tick_count + 1 }~ + defaults +** Processing line: ~ render~ - Inside source: true *** True Line Result - at: state.tick_count + 1 } -** Processing line: ~ end~ + render +** Processing line: ~ input~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + input +** Processing line: ~ calc~ - Inside source: true *** True Line Result - end + calc ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98088,50 +104975,50 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def update_animation_frame_render_target animation_frame~ +** Processing line: ~ def defaults~ - Inside source: true *** True Line Result - def update_animation_frame_render_target animation_frame -** Processing line: ~ return if !animation_frame~ + def defaults +** Processing line: ~ player.x ||= 640~ - Inside source: true *** True Line Result - return if !animation_frame -** Processing line: ~~ + player.x ||= 640 +** Processing line: ~ player.y ||= 360~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs[animation_frame[:rt_name]].width = state.rt_canvas.size~ + player.y ||= 360 +** Processing line: ~ player.w ||= 16~ - Inside source: true *** True Line Result - outputs[animation_frame[:rt_name]].width = state.rt_canvas.size -** Processing line: ~ outputs[animation_frame[:rt_name]].height = state.rt_canvas.size~ + player.w ||= 16 +** Processing line: ~ player.h ||= 16~ - Inside source: true *** True Line Result - outputs[animation_frame[:rt_name]].height = state.rt_canvas.size -** Processing line: ~ outputs[animation_frame[:rt_name]].solids << animation_frame[:pixels].map do |f|~ + player.h ||= 16 +** Processing line: ~ player.attacked_at ||= -1~ - Inside source: true *** True Line Result - outputs[animation_frame[:rt_name]].solids << animation_frame[:pixels].map do |f| -** Processing line: ~ { x: f.x,~ + player.attacked_at ||= -1 +** Processing line: ~ player.angle ||= 0~ - Inside source: true *** True Line Result - { x: f.x, -** Processing line: ~ y: f.y,~ + player.angle ||= 0 +** Processing line: ~ player.future_player ||= future_player_position 0, 0~ - Inside source: true *** True Line Result - y: f.y, -** Processing line: ~ w: 1,~ + player.future_player ||= future_player_position 0, 0 +** Processing line: ~ player.projectiles ||= []~ - Inside source: true *** True Line Result - w: 1, -** Processing line: ~ h: 1, r: 255, g: 255, b: 255 }~ + player.projectiles ||= [] +** Processing line: ~ player.damage ||= 0~ - Inside source: true *** True Line Result - h: 1, r: 255, g: 255, b: 255 } -** Processing line: ~ end~ + player.damage ||= 0 +** Processing line: ~ state.level ||= create_level level_one_template~ - Inside source: true *** True Line Result - end + state.level ||= create_level level_one_template ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98140,82 +105027,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def animation_frames~ +** Processing line: ~ def render~ - Inside source: true *** True Line Result - def animation_frames -** Processing line: ~ state.animation_frames~ + def render +** Processing line: ~ outputs.sprites << level.walls.map do |w|~ - Inside source: true *** True Line Result - state.animation_frames -** Processing line: ~ end~ + outputs.sprites << level.walls.map do |w| +** Processing line: ~ w.merge(path: 'sprites/square/gray.png')~ - Inside source: true *** True Line Result - end + w.merge(path: 'sprites/square/gray.png') +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def add_animation_frame_to_end~ +** Processing line: ~ outputs.sprites << level.spawn_locations.map do |s|~ - Inside source: true *** True Line Result - def add_animation_frame_to_end -** Processing line: ~ animation_frames << {~ + outputs.sprites << level.spawn_locations.map do |s| +** Processing line: ~ s.merge(path: 'sprites/square/blue.png')~ - Inside source: true *** True Line Result - animation_frames << { -** Processing line: ~ index: animation_frames.length,~ + s.merge(path: 'sprites/square/blue.png') +** Processing line: ~ end~ - Inside source: true *** True Line Result - index: animation_frames.length, -** Processing line: ~ pixels: [],~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - pixels: [], -** Processing line: ~ rt_name: "animation_frame_#{animation_frames.length}"~ + +** Processing line: ~ outputs.sprites << player.projectiles.map do |p|~ - Inside source: true *** True Line Result - rt_name: "animation_frame_#{animation_frames.length}" -** Processing line: ~ }~ + outputs.sprites << player.projectiles.map do |p| +** Processing line: ~ p.merge(path: 'sprites/square/blue.png')~ - Inside source: true *** True Line Result - } + p.merge(path: 'sprites/square/blue.png') +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.animation_frames_selected_index = (animation_frames.length - 1)~ +** Processing line: ~ outputs.sprites << level.enemies.map do |e|~ - Inside source: true *** True Line Result - state.animation_frames_selected_index = (animation_frames.length - 1) -** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ + outputs.sprites << level.enemies.map do |e| +** Processing line: ~ e.merge(path: 'sprites/square/red.png')~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count,~ + e.merge(path: 'sprites/square/red.png') +** Processing line: ~ end~ - Inside source: true *** True Line Result - at: state.tick_count, -** Processing line: ~ queue_sprite_creation: true }~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - queue_sprite_creation: true } -** Processing line: ~ end~ + +** Processing line: ~ outputs.sprites << player.merge(path: 'sprites/circle/green.png', angle: player.angle)~ - Inside source: true *** True Line Result - end + outputs.sprites << player.merge(path: 'sprites/circle/green.png', angle: player.angle) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def sprite_path i~ -- Inside source: true -*** True Line Result - def sprite_path i -** Processing line: ~ "canvas/sprite-#{i}.png"~ +** Processing line: ~ outputs.labels << { x: 30, y: 30.from_top, text: "damage: #{player.damage || 0}" }~ - Inside source: true *** True Line Result - "canvas/sprite-#{i}.png" + outputs.labels << { x: 30, y: 30.from_top, text: "damage: #{player.damage || 0}" } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98224,54 +105115,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 export_animation_frame i, path_override = nil~ +** Processing line: ~ def input~ - Inside source: true *** True Line Result - def export_animation_frame i, path_override = nil -** Processing line: ~ return if !state.animation_frames[i]~ + def input +** Processing line: ~ player.angle = inputs.directional_angle || player.angle~ - Inside source: true *** True Line Result - return if !state.animation_frames[i] -** Processing line: ~~ + player.angle = inputs.directional_angle || player.angle +** Processing line: ~ if inputs.controller_one.key_down.a || inputs.keyboard.key_down.space~ - Inside source: true *** True Line Result - -** Processing line: ~ outputs.screenshots << state.buttons_frame_selection~ + if inputs.controller_one.key_down.a || inputs.keyboard.key_down.space +** Processing line: ~ player.attacked_at = state.tick_count~ - Inside source: true *** True Line Result - outputs.screenshots << state.buttons_frame_selection -** Processing line: ~ .items[i][:inner_rect]~ + player.attacked_at = state.tick_count +** Processing line: ~ end~ - Inside source: true *** True Line Result - .items[i][:inner_rect] -** Processing line: ~ .merge(path: path_override || (sprite_path i))~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - .merge(path: path_override || (sprite_path i)) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.screenshots << state.buttons_frame_selection~ +** Processing line: ~ def calc~ - Inside source: true *** True Line Result - outputs.screenshots << state.buttons_frame_selection -** Processing line: ~ .items[i][:inner_rect]~ + def calc +** Processing line: ~ calc_player~ - Inside source: true *** True Line Result - .items[i][:inner_rect] -** Processing line: ~ .merge(path: "tmp/sprite_backups/#{Time.now.to_i}-sprite-#{i}.png")~ + calc_player +** Processing line: ~ calc_projectiles~ - Inside source: true *** True Line Result - .merge(path: "tmp/sprite_backups/#{Time.now.to_i}-sprite-#{i}.png") -** Processing line: ~~ + calc_projectiles +** Processing line: ~ calc_enemies~ - Inside source: true *** True Line Result - -** Processing line: ~ queues.reset_sprite << { index: i, at: state.tick_count }~ + calc_enemies +** Processing line: ~ calc_spawn_locations~ - Inside source: true *** True Line Result - queues.reset_sprite << { index: i, at: state.tick_count } + calc_spawn_locations ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98280,70 +105171,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def selected_animation_frame~ -- Inside source: true -*** True Line Result - def selected_animation_frame -** Processing line: ~ state.animation_frames[state.animation_frames_selected_index]~ +** Processing line: ~ def calc_player~ - Inside source: true *** True Line Result - state.animation_frames[state.animation_frames_selected_index] -** Processing line: ~ end~ + def calc_player +** Processing line: ~ if player.attacked_at == state.tick_count~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if player.attacked_at == state.tick_count +** Processing line: ~ player.projectiles << { at: state.tick_count,~ - Inside source: true *** True Line Result - -** Processing line: ~ def edit_current_animation_frame point~ + player.projectiles << { at: state.tick_count, +** Processing line: ~ x: player.x,~ - Inside source: true *** True Line Result - def edit_current_animation_frame point -** Processing line: ~ draw_area_point = (to_draw_area point)~ + x: player.x, +** Processing line: ~ y: player.y,~ - Inside source: true *** True Line Result - draw_area_point = (to_draw_area point) -** Processing line: ~ if state.edit_mode == :drawing && (!selected_animation_frame[:pixels].include? draw_area_point)~ + y: player.y, +** Processing line: ~ angle: player.angle,~ - Inside source: true *** True Line Result - if state.edit_mode == :drawing && (!selected_animation_frame[:pixels].include? draw_area_point) -** Processing line: ~ selected_animation_frame[:pixels] << draw_area_point~ + angle: player.angle, +** Processing line: ~ w: 4,~ - Inside source: true *** True Line Result - selected_animation_frame[:pixels] << draw_area_point -** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ + w: 4, +** Processing line: ~ h: 4 }.center_inside_rect(player)~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count,~ + h: 4 }.center_inside_rect(player) +** Processing line: ~ end~ - Inside source: true *** True Line Result - at: state.tick_count, -** Processing line: ~ queue_sprite_creation: !user_is_editing? }~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - queue_sprite_creation: !user_is_editing? } -** Processing line: ~ elsif state.edit_mode == :erasing && (selected_animation_frame[:pixels].include? draw_area_point)~ + +** Processing line: ~ if player.attacked_at.elapsed_time > 5~ - Inside source: true *** True Line Result - elsif state.edit_mode == :erasing && (selected_animation_frame[:pixels].include? draw_area_point) -** Processing line: ~ selected_animation_frame[:pixels] = selected_animation_frame[:pixels].reject { |p| p == draw_area_point }~ + if player.attacked_at.elapsed_time > 5 +** Processing line: ~ future_player = future_player_position inputs.left_right * 2, inputs.up_down * 2~ - Inside source: true *** True Line Result - selected_animation_frame[:pixels] = selected_animation_frame[:pixels].reject { |p| p == draw_area_point } -** Processing line: ~ queues.update_rt_animation_frame << { index: state.animation_frames_selected_index,~ + future_player = future_player_position inputs.left_right * 2, inputs.up_down * 2 +** Processing line: ~ future_player_collision = future_collision player, future_player, level.walls~ - Inside source: true *** True Line Result - queues.update_rt_animation_frame << { index: state.animation_frames_selected_index, -** Processing line: ~ at: state.tick_count,~ + future_player_collision = future_collision player, future_player, level.walls +** Processing line: ~ player.x = future_player_collision.x if !future_player_collision.dx_collision~ - Inside source: true *** True Line Result - at: state.tick_count, -** Processing line: ~ queue_sprite_creation: !user_is_editing? }~ + player.x = future_player_collision.x if !future_player_collision.dx_collision +** Processing line: ~ player.y = future_player_collision.y if !future_player_collision.dy_collision~ - Inside source: true *** True Line Result - queue_sprite_creation: !user_is_editing? } + player.y = future_player_collision.y if !future_player_collision.dy_collision ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98356,46 +105243,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def user_is_editing?~ +** Processing line: ~ def calc_projectile_collisions entities~ - Inside source: true *** True Line Result - def user_is_editing? -** Processing line: ~ state.last_mouse_down > state.last_mouse_up~ + def calc_projectile_collisions entities +** Processing line: ~ entities.each do |e|~ - Inside source: true *** True Line Result - state.last_mouse_down > state.last_mouse_up -** Processing line: ~ end~ + entities.each do |e| +** Processing line: ~ e.damage ||= 0~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + e.damage ||= 0 +** Processing line: ~ player.projectiles.each do |p|~ - Inside source: true *** True Line Result - -** Processing line: ~ def to_draw_area point~ + player.projectiles.each do |p| +** Processing line: ~ if !p.collided && (p.intersect_rect? e)~ - Inside source: true *** True Line Result - def to_draw_area point -** Processing line: ~ x, y = point~ + if !p.collided && (p.intersect_rect? e) +** Processing line: ~ p.collided = true~ - Inside source: true *** True Line Result - x, y = point -** Processing line: ~ x -= rt_canvas.sprite.x~ + p.collided = true +** Processing line: ~ e.damage += 1~ - Inside source: true *** True Line Result - x -= rt_canvas.sprite.x -** Processing line: ~ y -= rt_canvas.sprite.y~ + e.damage += 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - y -= rt_canvas.sprite.y -** Processing line: ~ { x: x.idiv(rt_canvas.zoom),~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - { x: x.idiv(rt_canvas.zoom), -** Processing line: ~ y: y.idiv(rt_canvas.zoom) }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - y: y.idiv(rt_canvas.zoom) } + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98404,426 +105291,426 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def rt_canvas~ +** Processing line: ~ def calc_projectiles~ - Inside source: true *** True Line Result - def rt_canvas -** Processing line: ~ state.rt_canvas ||= state.new_entity(:rt_canvas)~ + def calc_projectiles +** Processing line: ~ player.projectiles.map! do |p|~ - Inside source: true *** True Line Result - state.rt_canvas ||= state.new_entity(:rt_canvas) -** Processing line: ~ end~ + player.projectiles.map! do |p| +** Processing line: ~ dx, dy = p.angle.vector 10~ - Inside source: true *** True Line Result - end + dx, dy = p.angle.vector 10 +** Processing line: ~ p.merge(x: p.x + dx, y: p.y + dy)~ +- Inside source: true +*** True Line Result + p.merge(x: p.x + dx, y: p.y + dy) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def queues~ +** Processing line: ~ calc_projectile_collisions level.walls + level.enemies + level.spawn_locations~ - Inside source: true *** True Line Result - def queues -** Processing line: ~ state.queues ||= state.new_entity(:queues)~ + calc_projectile_collisions level.walls + level.enemies + level.spawn_locations +** Processing line: ~ player.projectiles.reject! { |p| p.at.elapsed_time > 10000 }~ - Inside source: true *** True Line Result - state.queues ||= state.new_entity(:queues) -** Processing line: ~ end~ + player.projectiles.reject! { |p| p.at.elapsed_time > 10000 } +** Processing line: ~ player.projectiles.reject! { |p| p.collided }~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + player.projectiles.reject! { |p| p.collided } +** Processing line: ~ level.enemies.reject! { |e| e.damage > e.hp }~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + level.enemies.reject! { |e| e.damage > e.hp } +** Processing line: ~ level.spawn_locations.reject! { |s| s.damage > s.hp }~ - Inside source: true *** True Line Result - -** Processing line: ~ $game = OneBitLowrezPaint.new~ + level.spawn_locations.reject! { |s| s.damage > s.hp } +** Processing line: ~ end~ - Inside source: true *** True Line Result - $game = OneBitLowrezPaint.new + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ def calc_enemies~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $game.args = args~ + def calc_enemies +** Processing line: ~ level.enemies.map! do |e|~ - Inside source: true *** True Line Result - $game.args = args -** Processing line: ~ $game.tick~ + level.enemies.map! do |e| +** Processing line: ~ dx = 0~ - Inside source: true *** True Line Result - $game.tick -** Processing line: ~ end~ + dx = 0 +** Processing line: ~ dx = 1 if e.x < player.x~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + dx = 1 if e.x < player.x +** Processing line: ~ dx = -1 if e.x > player.x~ - Inside source: true *** True Line Result - -** Processing line: ~ # $gtk.reset~ + dx = -1 if e.x > player.x +** Processing line: ~ dy = 0~ - Inside source: true *** True Line Result - # $gtk.reset -** Processing line: ~~ + dy = 0 +** Processing line: ~ dy = 1 if e.y < player.y~ - 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: ~*** Dev Tools - Tile Editor Starting Point - main.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Dev Tools - Tile Editor Starting Point - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + dy = 1 if e.y < player.y +** Processing line: ~ dy = -1 if e.y > player.y~ +- Inside source: true *** True Line Result - + dy = -1 if e.y > player.y +** Processing line: ~ future_e = future_entity_position dx, dy, e~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_dev_tools/tile_editor_starting_point/app/main.rb~ + future_e = future_entity_position dx, dy, e +** Processing line: ~ future_e_collision = future_collision e, future_e, level.enemies + level.walls~ - Inside source: true *** True Line Result - # ./samples/99_genre_dev_tools/tile_editor_starting_point/app/main.rb -** Processing line: ~ =begin~ + future_e_collision = future_collision e, future_e, level.enemies + level.walls +** Processing line: ~ e.next_x = e.x~ - Inside source: true *** True Line Result - =begin -** Processing line: ~~ + e.next_x = e.x +** Processing line: ~ e.next_y = e.y~ - Inside source: true *** True Line Result - -** Processing line: ~ APIs listing that haven't been encountered in previous sample apps:~ + e.next_y = e.y +** Processing line: ~ e.next_x = future_e_collision.x if !future_e_collision.dx_collision~ - Inside source: true *** True Line Result - APIs listing that haven't been encountered in previous sample apps: -** Processing line: ~~ + e.next_x = future_e_collision.x if !future_e_collision.dx_collision +** Processing line: ~ e.next_y = future_e_collision.y if !future_e_collision.dy_collision~ - Inside source: true *** True Line Result - -** Processing line: ~ - to_s: Returns a string representation of an object.~ + e.next_y = future_e_collision.y if !future_e_collision.dy_collision +** Processing line: ~ e~ - Inside source: true *** True Line Result - - to_s: Returns a string representation of an object. -** Processing line: ~ For example, if we had~ + e +** Processing line: ~ end~ - Inside source: true *** True Line Result - For example, if we had -** Processing line: ~ 500.to_s~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - 500.to_s -** Processing line: ~ the string "500" would be returned.~ + +** Processing line: ~ level.enemies.map! do |e|~ - Inside source: true *** True Line Result - the string "500" would be returned. -** Processing line: ~ Similar to to_i, which returns an integer representation of an object.~ + level.enemies.map! do |e| +** Processing line: ~ e.x = e.next_x~ - Inside source: true *** True Line Result - Similar to to_i, which returns an integer representation of an object. -** Processing line: ~~ + e.x = e.next_x +** Processing line: ~ e.y = e.next_y~ - Inside source: true *** True Line Result - -** Processing line: ~ - Ceil: Returns an integer number greater than or equal to the original~ + e.y = e.next_y +** Processing line: ~ e~ - Inside source: true *** True Line Result - - Ceil: Returns an integer number greater than or equal to the original -** Processing line: ~ with no decimal.~ + e +** Processing line: ~ end~ - Inside source: true *** True Line Result - with no decimal. + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ Reminders:~ +** Processing line: ~ level.enemies.each do |e|~ - Inside source: true *** True Line Result - Reminders: -** Processing line: ~~ + level.enemies.each do |e| +** Processing line: ~ player.damage += 1 if e.intersect_rect? player~ - Inside source: true *** True Line Result - -** Processing line: ~ - ARRAY#inside_rect?: Returns true or false depending on if the point is inside a rect.~ + player.damage += 1 if e.intersect_rect? player +** Processing line: ~ end~ - Inside source: true *** True Line Result - - ARRAY#inside_rect?: Returns true or false depending on if the point is inside a rect. + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - args.outputs.labels: An array. The values generate a label.~ +** Processing line: ~ def calc_spawn_locations~ - Inside source: true *** True Line Result - - args.outputs.labels: An array. The values generate a label. -** Processing line: ~ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~ + def calc_spawn_locations +** Processing line: ~ level.spawn_locations.map! do |s|~ - Inside source: true *** True Line Result - The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] -** Processing line: ~ For more information about labels, go to mygame/documentation/02-labels.md.~ + level.spawn_locations.map! do |s| +** Processing line: ~ s.merge(countdown: s.countdown - 1)~ - Inside source: true *** True Line Result - For more information about labels, go to mygame/documentation/02-labels.md. -** Processing line: ~~ + s.merge(countdown: s.countdown - 1) +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ - args.outputs.sprites: An array. The values generate a sprite.~ + end +** Processing line: ~ level.spawn_locations~ - Inside source: true *** True Line Result - - args.outputs.sprites: An array. The values generate a sprite. -** Processing line: ~ The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH]~ + level.spawn_locations +** Processing line: ~ .find_all { |s| s.countdown.neg? }~ - Inside source: true *** True Line Result - The parameters are [X, Y, WIDTH, HEIGHT, IMAGE PATH] -** Processing line: ~ For more information about sprites, go to mygame/documentation/05-sprites.md.~ + .find_all { |s| s.countdown.neg? } +** Processing line: ~ .each do |s|~ - Inside source: true *** True Line Result - For more information about sprites, go to mygame/documentation/05-sprites.md. -** Processing line: ~~ + .each do |s| +** Processing line: ~ s.countdown = s.rate~ - Inside source: true *** True Line Result - -** Processing line: ~ - args.outputs.solids: An array. The values generate a solid.~ + s.countdown = s.rate +** Processing line: ~ s.merge(countdown: s.rate)~ - Inside source: true *** True Line Result - - args.outputs.solids: An array. The values generate a solid. -** Processing line: ~ The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE]~ + s.merge(countdown: s.rate) +** Processing line: ~ new_enemy = create_enemy s~ - Inside source: true *** True Line Result - The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE] -** Processing line: ~ For more information about solids, go to mygame/documentation/03-solids-and-borders.md.~ + new_enemy = create_enemy s +** Processing line: ~ if !(level.enemies.find { |e| e.intersect_rect? new_enemy })~ - Inside source: true *** True Line Result - For more information about solids, go to mygame/documentation/03-solids-and-borders.md. -** Processing line: ~~ + if !(level.enemies.find { |e| e.intersect_rect? new_enemy }) +** Processing line: ~ level.enemies << new_enemy~ - Inside source: true *** True Line Result - -** Processing line: ~ - args.outputs.lines: An array. The values generate a line.~ + level.enemies << new_enemy +** Processing line: ~ end~ - Inside source: true *** True Line Result - - args.outputs.lines: An array. The values generate a line. -** Processing line: ~ The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE] -** Processing line: ~ For more information about lines, go to mygame/documentation/04-lines.md.~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - For more information about lines, go to mygame/documentation/04-lines.md. + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~ +** Processing line: ~ def create_enemy spawn_location~ - Inside source: true *** True Line Result - - args.state.new_entity: Used when we want to create a new object, like a sprite or button. -** Processing line: ~ In this sample app, new_entity is used to create a new button that clears the grid.~ + def create_enemy spawn_location +** Processing line: ~ to_cell(spawn_location.ordinal_x, spawn_location.ordinal_y).merge hp: 2~ - Inside source: true *** True Line Result - In this sample app, new_entity is used to create a new button that clears the grid. -** Processing line: ~ (Remember, you can use state to define ANY property and it will be retained across frames.)~ + to_cell(spawn_location.ordinal_x, spawn_location.ordinal_y).merge hp: 2 +** Processing line: ~ end~ - Inside source: true *** True Line Result - (Remember, you can use state to define ANY property and it will be retained across frames.) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ =end~ +** Processing line: ~ def create_level level_template~ - Inside source: true *** True Line Result - =end -** Processing line: ~~ + def create_level level_template +** Processing line: ~ {~ - Inside source: true *** True Line Result - -** Processing line: ~ # This sample app shows an empty grid that the user can paint in. There are different image tiles that~ + { +** Processing line: ~ walls: level_template.walls.map { |w| to_cell(w.ordinal_x, w.ordinal_y).merge(w) },~ - Inside source: true *** True Line Result - # This sample app shows an empty grid that the user can paint in. There are different image tiles that -** Processing line: ~ # the user can use to fill the grid, and the "Clear" button can be pressed to clear the grid boxes.~ + walls: level_template.walls.map { |w| to_cell(w.ordinal_x, w.ordinal_y).merge(w) }, +** Processing line: ~ enemies: [],~ - Inside source: true *** True Line Result - # the user can use to fill the grid, and the "Clear" button can be pressed to clear the grid boxes. -** Processing line: ~~ + enemies: [], +** Processing line: ~ spawn_locations: level_template.spawn_locations.map { |s| to_cell(s.ordinal_x, s.ordinal_y).merge(s) }~ - Inside source: true *** True Line Result - -** Processing line: ~ class TileEditor~ + spawn_locations: level_template.spawn_locations.map { |s| to_cell(s.ordinal_x, s.ordinal_y).merge(s) } +** Processing line: ~ }~ - Inside source: true *** True Line Result - class TileEditor -** Processing line: ~ attr_accessor :inputs, :state, :outputs, :grid, :args~ + } +** Processing line: ~ end~ - Inside source: true *** True Line Result - attr_accessor :inputs, :state, :outputs, :grid, :args + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Runs all the methods necessary for the game to function properly.~ +** Processing line: ~ def level_one_template~ - Inside source: true *** True Line Result - # Runs all the methods necessary for the game to function properly. -** Processing line: ~ def tick~ + def level_one_template +** Processing line: ~ {~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + { +** Processing line: ~ walls: [{ ordinal_x: 25, ordinal_y: 20},~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render~ + walls: [{ ordinal_x: 25, ordinal_y: 20}, +** Processing line: ~ { ordinal_x: 25, ordinal_y: 21},~ - Inside source: true *** True Line Result - render -** Processing line: ~ check_click~ + { ordinal_x: 25, ordinal_y: 21}, +** Processing line: ~ { ordinal_x: 25, ordinal_y: 22},~ - Inside source: true *** True Line Result - check_click -** Processing line: ~ draw_buttons~ + { ordinal_x: 25, ordinal_y: 22}, +** Processing line: ~ { ordinal_x: 25, ordinal_y: 23}],~ - Inside source: true *** True Line Result - draw_buttons -** Processing line: ~ end~ + { ordinal_x: 25, ordinal_y: 23}], +** Processing line: ~ spawn_locations: [{ ordinal_x: 10, ordinal_y: 10, rate: 120, countdown: 0, hp: 5 }]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + spawn_locations: [{ ordinal_x: 10, ordinal_y: 10, rate: 120, countdown: 0, hp: 5 }] +** Processing line: ~ }~ - Inside source: true *** True Line Result - -** Processing line: ~ # Sets default values~ + } +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Sets default values -** Processing line: ~ # Initialization only happens in the first frame~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Initialization only happens in the first frame -** Processing line: ~ # NOTE: The values of some of these variables may seem confusingly large at first.~ + +** Processing line: ~ def player~ - Inside source: true *** True Line Result - # NOTE: The values of some of these variables may seem confusingly large at first. -** Processing line: ~ # The gridSize is 1600 but it seems a lot smaller on the screen, for example.~ + def player +** Processing line: ~ state.player ||= {}~ - Inside source: true *** True Line Result - # The gridSize is 1600 but it seems a lot smaller on the screen, for example. -** Processing line: ~ # But keep in mind that by using the "W", "A", "S", and "D" keys, you can~ + state.player ||= {} +** Processing line: ~ end~ - Inside source: true *** True Line Result - # But keep in mind that by using the "W", "A", "S", and "D" keys, you can -** Processing line: ~ # move the grid's view in all four directions for more grid spaces.~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # move the grid's view in all four directions for more grid spaces. -** Processing line: ~ def defaults~ + +** Processing line: ~ def level~ - Inside source: true *** True Line Result - def defaults -** Processing line: ~ state.tileCords ||= []~ + def level +** Processing line: ~ state.level ||= {}~ - Inside source: true *** True Line Result - state.tileCords ||= [] -** Processing line: ~ state.tileQuantity ||= 6~ + state.level ||= {} +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.tileQuantity ||= 6 -** Processing line: ~ state.tileSize ||= 50~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.tileSize ||= 50 -** Processing line: ~ state.tileSelected ||= 1~ + +** Processing line: ~ def future_collision entity, future_entity, others~ - Inside source: true *** True Line Result - state.tileSelected ||= 1 -** Processing line: ~ state.tempX ||= 50~ + def future_collision entity, future_entity, others +** Processing line: ~ dx_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dx) }~ - Inside source: true *** True Line Result - state.tempX ||= 50 -** Processing line: ~ state.tempY ||= 500~ + dx_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dx) } +** Processing line: ~ dy_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dy) }~ - Inside source: true *** True Line Result - state.tempY ||= 500 -** Processing line: ~ state.speed ||= 4~ + dy_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dy) } +** Processing line: ~~ - Inside source: true *** True Line Result - state.speed ||= 4 -** Processing line: ~ state.centerX ||= 4000~ + +** Processing line: ~ {~ - Inside source: true *** True Line Result - state.centerX ||= 4000 -** Processing line: ~ state.centerY ||= 4000~ + { +** Processing line: ~ dx_collision: dx_collision,~ - Inside source: true *** True Line Result - state.centerY ||= 4000 -** Processing line: ~ state.originalCenter ||= [state.centerX, state.centerY]~ + dx_collision: dx_collision, +** Processing line: ~ x: future_entity.dx.x,~ - Inside source: true *** True Line Result - state.originalCenter ||= [state.centerX, state.centerY] -** Processing line: ~ state.gridSize ||= 1600~ + x: future_entity.dx.x, +** Processing line: ~ dy_collision: dy_collision,~ - Inside source: true *** True Line Result - state.gridSize ||= 1600 -** Processing line: ~ state.lineQuantity ||= 50~ + dy_collision: dy_collision, +** Processing line: ~ y: future_entity.dy.y~ - Inside source: true *** True Line Result - state.lineQuantity ||= 50 -** Processing line: ~ state.increment ||= state.gridSize / state.lineQuantity~ + y: future_entity.dy.y +** Processing line: ~ }~ - Inside source: true *** True Line Result - state.increment ||= state.gridSize / state.lineQuantity -** Processing line: ~ state.gridX ||= []~ + } +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.gridX ||= [] -** Processing line: ~ state.gridY ||= []~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.gridY ||= [] -** Processing line: ~ state.filled_squares ||= []~ + +** Processing line: ~ def future_entity_position dx, dy, entity~ - Inside source: true *** True Line Result - state.filled_squares ||= [] -** Processing line: ~ state.grid_border ||= [390, 140, 500, 500]~ + def future_entity_position dx, dy, entity +** Processing line: ~ {~ - Inside source: true *** True Line Result - state.grid_border ||= [390, 140, 500, 500] -** Processing line: ~~ + { +** Processing line: ~ dx: entity.merge(x: entity.x + dx),~ - Inside source: true *** True Line Result - -** Processing line: ~ get_grid unless state.tempX == 0 # calls get_grid in the first frame only~ + dx: entity.merge(x: entity.x + dx), +** Processing line: ~ dy: entity.merge(y: entity.y + dy),~ - Inside source: true *** True Line Result - get_grid unless state.tempX == 0 # calls get_grid in the first frame only -** Processing line: ~ determineTileCords unless state.tempX == 0 # calls determineTileCords in first frame~ + dy: entity.merge(y: entity.y + dy), +** Processing line: ~ both: entity.merge(x: entity.x + dx, y: entity.y + dy)~ - Inside source: true *** True Line Result - determineTileCords unless state.tempX == 0 # calls determineTileCords in first frame -** Processing line: ~ state.tempX = 0 # sets tempX to 0; the two methods aren't called again~ + both: entity.merge(x: entity.x + dx, y: entity.y + dy) +** Processing line: ~ }~ - Inside source: true *** True Line Result - state.tempX = 0 # sets tempX to 0; the two methods aren't called again + } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -98832,622 +105719,662 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the placement of lines or separators in the grid~ +** Processing line: ~ def future_player_position dx, dy~ - Inside source: true *** True Line Result - # Calculates the placement of lines or separators in the grid -** Processing line: ~ def get_grid~ + def future_player_position dx, dy +** Processing line: ~ future_entity_position dx, dy, player~ - Inside source: true *** True Line Result - def get_grid -** Processing line: ~ curr_x = state.centerX - (state.gridSize / 2) # starts at left of grid~ + future_entity_position dx, dy, player +** Processing line: ~ end~ - Inside source: true *** True Line Result - curr_x = state.centerX - (state.gridSize / 2) # starts at left of grid -** Processing line: ~ deltaX = state.gridSize / state.lineQuantity # finds distance to place vertical lines evenly through width of grid~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - deltaX = state.gridSize / state.lineQuantity # finds distance to place vertical lines evenly through width of grid -** Processing line: ~ (state.lineQuantity + 2).times do~ + +** Processing line: ~ def to_cell ordinal_x, ordinal_y~ - Inside source: true *** True Line Result - (state.lineQuantity + 2).times do -** Processing line: ~ state.gridX << curr_x # adds curr_x to gridX collection~ + def to_cell ordinal_x, ordinal_y +** Processing line: ~ { x: ordinal_x * 16, y: ordinal_y * 16, w: 16, h: 16 }~ - Inside source: true *** True Line Result - state.gridX << curr_x # adds curr_x to gridX collection -** Processing line: ~ curr_x += deltaX # increment curr_x by the distance between vertical lines~ + { x: ordinal_x * 16, y: ordinal_y * 16, w: 16, h: 16 } +** Processing line: ~ end~ - Inside source: true *** True Line Result - curr_x += deltaX # increment curr_x by the distance between vertical lines -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ curr_y = state.centerY - (state.gridSize / 2) # starts at bottom of grid~ +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - curr_y = state.centerY - (state.gridSize / 2) # starts at bottom of grid -** Processing line: ~ deltaY = state.gridSize / state.lineQuantity # finds distance to place horizontal lines evenly through height of grid~ + def tick args +** Processing line: ~ $game ||= Game.new~ - Inside source: true *** True Line Result - deltaY = state.gridSize / state.lineQuantity # finds distance to place horizontal lines evenly through height of grid -** Processing line: ~ (state.lineQuantity + 2).times do~ + $game ||= Game.new +** Processing line: ~ $game.args = args~ - Inside source: true *** True Line Result - (state.lineQuantity + 2).times do -** Processing line: ~ state.gridY << curr_y # adds curr_y to gridY collection~ + $game.args = args +** Processing line: ~ $game.tick~ - Inside source: true *** True Line Result - state.gridY << curr_y # adds curr_y to gridY collection -** Processing line: ~ curr_y += deltaY # increments curr_y to distance between horizontal lines~ + $game.tick +** Processing line: ~ end~ - Inside source: true *** True Line Result - curr_y += deltaY # increments curr_y to distance between horizontal lines -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ $gtk.reset~ - Inside source: true *** True Line Result - end + $gtk.reset +** Processing line: ~ $game = nil~ +- Inside source: true +*** True Line Result + $game = nil ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Determines coordinate positions of patterned tiles (on the left side of the grid)~ +** 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: ~*** Fighting - Special Move Inputs - main.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** Fighting - Special Move Inputs - 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_fighting/01_special_move_inputs/app/main.rb~ - Inside source: true *** True Line Result - # Determines coordinate positions of patterned tiles (on the left side of the grid) -** Processing line: ~ def determineTileCords~ + # ./samples/99_genre_fighting/01_special_move_inputs/app/main.rb +** Processing line: ~ def tick args~ - Inside source: true *** True Line Result - def determineTileCords -** Processing line: ~ state.tempCounter ||= 1 # initializes tempCounter to 1~ + def tick args +** Processing line: ~ #tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."~ - Inside source: true *** True Line Result - state.tempCounter ||= 1 # initializes tempCounter to 1 -** Processing line: ~ state.tileQuantity.times do # there are 6 different kinds of tiles~ + #tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump." +** Processing line: ~ defaults args~ - Inside source: true *** True Line Result - state.tileQuantity.times do # there are 6 different kinds of tiles -** Processing line: ~ state.tileCords += [[state.tempX, state.tempY, state.tempCounter]] # adds tile definition to collection~ + defaults args +** Processing line: ~ render args~ - Inside source: true *** True Line Result - state.tileCords += [[state.tempX, state.tempY, state.tempCounter]] # adds tile definition to collection -** Processing line: ~ state.tempX += 75 # increments tempX to put horizontal space between the patterned tiles~ + render args +** Processing line: ~ input args~ - Inside source: true *** True Line Result - state.tempX += 75 # increments tempX to put horizontal space between the patterned tiles -** Processing line: ~ state.tempCounter += 1 # increments tempCounter~ + input args +** Processing line: ~ calc args~ - Inside source: true *** True Line Result - state.tempCounter += 1 # increments tempCounter -** Processing line: ~ if state.tempX > 200 # if tempX exceeds 200 pixels~ + calc args +** Processing line: ~ end~ - Inside source: true *** True Line Result - if state.tempX > 200 # if tempX exceeds 200 pixels -** Processing line: ~ state.tempX = 50 # a new row of patterned tiles begins~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.tempX = 50 # a new row of patterned tiles begins -** Processing line: ~ state.tempY -= 75 # the new row is 75 pixels lower than the previous row~ + +** Processing line: ~ # sets default values and creates empty collections~ - Inside source: true *** True Line Result - state.tempY -= 75 # the new row is 75 pixels lower than the previous row -** Processing line: ~ end~ + # sets default values and creates empty collections +** Processing line: ~ # initialization only happens in the first frame~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + # initialization only happens in the first frame +** Processing line: ~ def defaults args~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + def defaults args +** Processing line: ~ fiddle args~ - Inside source: true *** True Line Result - end + fiddle args ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Outputs objects (grid, tiles, etc) onto the screen~ +** Processing line: ~ args.state.tick_count = args.state.tick_count~ - Inside source: true *** True Line Result - # Outputs objects (grid, tiles, etc) onto the screen -** Processing line: ~ def render~ + args.state.tick_count = args.state.tick_count +** Processing line: ~ args.state.bridge_top = 128~ - Inside source: true *** True Line Result - def render -** Processing line: ~ outputs.sprites << state.tileCords.map do # outputs tileCords collection using images in sprites folder~ + args.state.bridge_top = 128 +** Processing line: ~ args.state.player.x ||= 0 # initializes player's properties~ - Inside source: true *** True Line Result - outputs.sprites << state.tileCords.map do # outputs tileCords collection using images in sprites folder -** Processing line: ~ |x, y, order|~ + args.state.player.x ||= 0 # initializes player's properties +** Processing line: ~ args.state.player.y ||= args.state.bridge_top~ - Inside source: true *** True Line Result - |x, y, order| -** Processing line: ~ [x, y, state.tileSize, state.tileSize, 'sprites/image' + order.to_s + ".png"]~ + args.state.player.y ||= args.state.bridge_top +** Processing line: ~ args.state.player.w ||= 64~ - Inside source: true *** True Line Result - [x, y, state.tileSize, state.tileSize, 'sprites/image' + order.to_s + ".png"] -** Processing line: ~ end~ + args.state.player.w ||= 64 +** Processing line: ~ args.state.player.h ||= 64~ - Inside source: true *** True Line Result - end -** Processing line: ~ outputs.solids << [0, 0, 1280, 720, 255, 255, 255] # outputs white background~ + args.state.player.h ||= 64 +** Processing line: ~ args.state.player.dy ||= 0~ - Inside source: true *** True Line Result - outputs.solids << [0, 0, 1280, 720, 255, 255, 255] # outputs white background -** Processing line: ~ add_grid # outputs grid~ + args.state.player.dy ||= 0 +** Processing line: ~ args.state.player.dx ||= 0~ - Inside source: true *** True Line Result - add_grid # outputs grid -** Processing line: ~ print_title # outputs title and current tile pattern~ + args.state.player.dx ||= 0 +** Processing line: ~ args.state.player.r ||= 0~ - Inside source: true *** True Line Result - print_title # outputs title and current tile pattern -** Processing line: ~ end~ + args.state.player.r ||= 0 +** Processing line: ~ args.state.game_over_at ||= 0~ - Inside source: true *** True Line Result - end + args.state.game_over_at ||= 0 +** Processing line: ~ args.state.animation_time ||=0~ +- Inside source: true +*** True Line Result + args.state.animation_time ||=0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Creates a grid by outputting vertical and horizontal grid lines onto the screen.~ +** Processing line: ~ args.state.timeleft ||=0~ - Inside source: true *** True Line Result - # Creates a grid by outputting vertical and horizontal grid lines onto the screen. -** Processing line: ~ # Outputs sprites for the filled_squares collection onto the screen.~ + args.state.timeleft ||=0 +** Processing line: ~ args.state.timeright ||=0~ - Inside source: true *** True Line Result - # Outputs sprites for the filled_squares collection onto the screen. -** Processing line: ~ def add_grid~ + args.state.timeright ||=0 +** Processing line: ~ args.state.lastpush ||=0~ - Inside source: true *** True Line Result - def add_grid + args.state.lastpush ||=0 ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Outputs the grid's border.~ -- Inside source: true -*** True Line Result - # Outputs the grid's border. -** Processing line: ~ outputs.borders << state.grid_border~ +** Processing line: ~ args.state.inputlist ||= ["j","k","l"]~ - Inside source: true *** True Line Result - outputs.borders << state.grid_border -** Processing line: ~ temp = 0~ + args.state.inputlist ||= ["j","k","l"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - temp = 0 + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Before looking at the code that outputs the vertical and horizontal lines in the~ +** Processing line: ~ # sets enemy, player, hammer values~ - Inside source: true *** True Line Result - # Before looking at the code that outputs the vertical and horizontal lines in the -** Processing line: ~ # grid, take note of the fact that:~ + # sets enemy, player, hammer values +** Processing line: ~ def fiddle args~ - Inside source: true *** True Line Result - # grid, take note of the fact that: -** Processing line: ~ # grid_border[1] refers to the border's bottom line (running horizontally),~ + def fiddle args +** Processing line: ~ args.state.gravity = -0.5~ - Inside source: true *** True Line Result - # grid_border[1] refers to the border's bottom line (running horizontally), -** Processing line: ~ # grid_border[2] refers to the border's top line (running (horizontally),~ + args.state.gravity = -0.5 +** Processing line: ~ args.state.player_jump_power = 10 # sets player values~ - Inside source: true *** True Line Result - # grid_border[2] refers to the border's top line (running (horizontally), -** Processing line: ~ # grid_border[0] refers to the border's left line (running vertically),~ + args.state.player_jump_power = 10 # sets player values +** Processing line: ~ args.state.player_jump_power_duration = 5~ - Inside source: true *** True Line Result - # grid_border[0] refers to the border's left line (running vertically), -** Processing line: ~ # and grid_border[3] refers to the border's right line (running vertically).~ + args.state.player_jump_power_duration = 5 +** Processing line: ~ args.state.player_max_run_speed = 20~ - Inside source: true *** True Line Result - # and grid_border[3] refers to the border's right line (running vertically). -** Processing line: ~~ + args.state.player_max_run_speed = 20 +** Processing line: ~ args.state.player_speed_slowdown_rate = 0.9~ - Inside source: true *** True Line Result - -** Processing line: ~ # [2]~ + args.state.player_speed_slowdown_rate = 0.9 +** Processing line: ~ args.state.player_acceleration = 0.9~ - Inside source: true *** True Line Result - # [2] -** Processing line: ~ # ----------~ + args.state.player_acceleration = 0.9 +** Processing line: ~ end~ - Inside source: true *** True Line Result - # ---------- -** Processing line: ~ # | |~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # | | -** Processing line: ~ # [0] | | [3]~ + +** Processing line: ~ # outputs objects onto the screen~ - Inside source: true *** True Line Result - # [0] | | [3] -** Processing line: ~ # | |~ + # outputs objects onto the screen +** Processing line: ~ def render args~ - Inside source: true *** True Line Result - # | | -** Processing line: ~ # ----------~ + def render args +** Processing line: ~ if (args.state.player.dx < 0.01) && (args.state.player.dx > -0.01)~ - Inside source: true *** True Line Result - # ---------- -** Processing line: ~ # [1]~ + if (args.state.player.dx < 0.01) && (args.state.player.dx > -0.01) +** Processing line: ~ args.state.player.dx = 0~ - Inside source: true *** True Line Result - # [1] -** Processing line: ~~ + args.state.player.dx = 0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ # Calculates the positions and outputs the x grid lines in the color gray.~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # Calculates the positions and outputs the x grid lines in the color gray. -** Processing line: ~ state.gridX.map do # perform an action on all elements of the gridX collection~ + +** Processing line: ~ #move list~ - Inside source: true *** True Line Result - state.gridX.map do # perform an action on all elements of the gridX collection -** Processing line: ~ |x|~ + #move list +** Processing line: ~ (args.layout.rect_group row: 0, col_from_right: 8, drow: 0.3,~ - Inside source: true *** True Line Result - |x| -** Processing line: ~ temp += 1 # increment temp~ + (args.layout.rect_group row: 0, col_from_right: 8, drow: 0.3, +** Processing line: ~ merge: { vertical_alignment_enum: 0, size_enum: -2 },~ - Inside source: true *** True Line Result - temp += 1 # increment temp -** Processing line: ~~ + merge: { vertical_alignment_enum: 0, size_enum: -2 }, +** Processing line: ~ group: [~ - Inside source: true *** True Line Result - -** Processing line: ~ # if x's value is greater than (or equal to) the x value of the border's left side~ + group: [ +** Processing line: ~ { text: "move: WASD" },~ - Inside source: true *** True Line Result - # if x's value is greater than (or equal to) the x value of the border's left side -** Processing line: ~ # and less than (or equal to) the x value of the border's right side~ + { text: "move: WASD" }, +** Processing line: ~ { text: "jump: Space" },~ - Inside source: true *** True Line Result - # and less than (or equal to) the x value of the border's right side -** Processing line: ~ if x >= state.centerX - (state.grid_border[2] / 2) && x <= state.centerX + (state.grid_border[2] / 2)~ + { text: "jump: Space" }, +** Processing line: ~ { text: "attack forwards: J (while on ground" },~ - Inside source: true *** True Line Result - if x >= state.centerX - (state.grid_border[2] / 2) && x <= state.centerX + (state.grid_border[2] / 2) -** Processing line: ~ delta = state.centerX - 640~ + { text: "attack forwards: J (while on ground" }, +** Processing line: ~ { text: "attack upwards: K (while on groud)" },~ - Inside source: true *** True Line Result - delta = state.centerX - 640 -** Processing line: ~ # vertical lines have the same starting and ending x positions~ + { text: "attack upwards: K (while on groud)" }, +** Processing line: ~ { text: "attack backwards: J (while on ground and holding A)" },~ - Inside source: true *** True Line Result - # vertical lines have the same starting and ending x positions -** Processing line: ~ # starting y and ending y positions lead from the bottom of the border to the top of the border~ + { text: "attack backwards: J (while on ground and holding A)" }, +** Processing line: ~ { text: "attack downwards: K (while in air)" },~ - Inside source: true *** True Line Result - # starting y and ending y positions lead from the bottom of the border to the top of the border -** Processing line: ~ outputs.lines << [x - delta, state.grid_border[1], x - delta, state.grid_border[1] + state.grid_border[2], 150, 150, 150] # sets definition of vertical line and outputs it~ + { text: "attack downwards: K (while in air)" }, +** Processing line: ~ { text: "dash attack: J, K in quick succession." },~ - Inside source: true *** True Line Result - outputs.lines << [x - delta, state.grid_border[1], x - delta, state.grid_border[1] + state.grid_border[2], 150, 150, 150] # sets definition of vertical line and outputs it -** Processing line: ~ end~ + { text: "dash attack: J, K in quick succession." }, +** Processing line: ~ { text: "shield: hold J, K at the same time." },~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + { text: "shield: hold J, K at the same time." }, +** Processing line: ~ { text: "dash backwards: A, A in quick succession." },~ - Inside source: true *** True Line Result - end -** Processing line: ~ temp = 0~ + { text: "dash backwards: A, A in quick succession." }, +** Processing line: ~ ]).into args.outputs.labels~ - Inside source: true *** True Line Result - temp = 0 + ]).into args.outputs.labels ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Calculates the positions and outputs the y grid lines in the color gray.~ -- Inside source: true -*** True Line Result - # Calculates the positions and outputs the y grid lines in the color gray. -** Processing line: ~ state.gridY.map do # perform an action on all elements of the gridY collection~ +** Processing line: ~ # registered moves~ - Inside source: true *** True Line Result - state.gridY.map do # perform an action on all elements of the gridY collection -** Processing line: ~ |y|~ + # registered moves +** Processing line: ~ args.outputs.labels << { x: 0.to_layout_col,~ - Inside source: true *** True Line Result - |y| -** Processing line: ~ temp += 1 # increment temp~ + args.outputs.labels << { x: 0.to_layout_col, +** Processing line: ~ y: 0.to_layout_row,~ - Inside source: true *** True Line Result - temp += 1 # increment temp -** Processing line: ~~ + y: 0.to_layout_row, +** Processing line: ~ text: "input history",~ - Inside source: true *** True Line Result - -** Processing line: ~ # if y's value is greater than (or equal to) the y value of the border's bottom side~ + text: "input history", +** Processing line: ~ size_enum: -2,~ - Inside source: true *** True Line Result - # if y's value is greater than (or equal to) the y value of the border's bottom side -** Processing line: ~ # and less than (or equal to) the y value of the border's top side~ + size_enum: -2, +** Processing line: ~ vertical_alignment_enum: 0 }~ - Inside source: true *** True Line Result - # and less than (or equal to) the y value of the border's top side -** Processing line: ~ if y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2)~ + vertical_alignment_enum: 0 } +** Processing line: ~~ - Inside source: true *** True Line Result - if y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) -** Processing line: ~ delta = state.centerY - 393~ + +** Processing line: ~ (args.state.inputlist.take(5)).map do |s|~ - Inside source: true *** True Line Result - delta = state.centerY - 393 -** Processing line: ~ # horizontal lines have the same starting and ending y positions~ + (args.state.inputlist.take(5)).map do |s| +** Processing line: ~ { text: s, size_enum: -2, vertical_alignment_enum: 0 }~ - Inside source: true *** True Line Result - # horizontal lines have the same starting and ending y positions -** Processing line: ~ # starting x and ending x positions lead from the left side of the border to the right side of the border~ + { text: s, size_enum: -2, vertical_alignment_enum: 0 } +** Processing line: ~ end.yield_self do |group|~ - Inside source: true *** True Line Result - # starting x and ending x positions lead from the left side of the border to the right side of the border -** Processing line: ~ outputs.lines << [state.grid_border[0], y - delta, state.grid_border[0] + state.grid_border[3], y - delta, 150, 150, 150] # sets definition of horizontal line and outputs it~ + end.yield_self do |group| +** Processing line: ~ (args.layout.rect_group row: 0.3, col: 0, drow: 0.3, group: group).into args.outputs.labels~ - Inside source: true *** True Line Result - outputs.lines << [state.grid_border[0], y - delta, state.grid_border[0] + state.grid_border[3], y - delta, 150, 150, 150] # sets definition of horizontal line and outputs it -** Processing line: ~ end~ + (args.layout.rect_group row: 0.3, col: 0, drow: 0.3, group: group).into args.outputs.labels +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sets values and outputs sprites for the filled_squares collection.~ +** Processing line: ~ #sprites~ - Inside source: true *** True Line Result - # Sets values and outputs sprites for the filled_squares collection. -** Processing line: ~ state.filled_squares.map do # perform an action on every element of the filled_squares collection~ + #sprites +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ - Inside source: true *** True Line Result - state.filled_squares.map do # perform an action on every element of the filled_squares collection -** Processing line: ~ |x, y, w, h, sprite|~ + player = [args.state.player.x, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - |x, y, w, h, sprite| -** Processing line: ~ # if x's value is greater than (or equal to) the x value of 17 pixels to the left of the border's left side~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/square/white.png",~ - Inside source: true *** True Line Result - # if x's value is greater than (or equal to) the x value of 17 pixels to the left of the border's left side -** Processing line: ~ # and less than (or equal to) the x value of the border's right side~ + "sprites/square/white.png", +** Processing line: ~ args.state.player.r]~ - Inside source: true *** True Line Result - # and less than (or equal to) the x value of the border's right side -** Processing line: ~ # and y's value is greater than (or equal to) the y value of the border's bottom side~ + args.state.player.r] +** Processing line: ~~ - Inside source: true *** True Line Result - # and y's value is greater than (or equal to) the y value of the border's bottom side -** Processing line: ~ # and less than (or equal to) the y value of 25 pixels above the border's top side~ + +** Processing line: ~ playershield = [args.state.player.x - 20, args.state.player.y - 10,~ - Inside source: true *** True Line Result - # and less than (or equal to) the y value of 25 pixels above the border's top side -** Processing line: ~ # NOTE: The allowance of 17 pixels and 25 pixels is due to the fact that a grid box may be slightly cut off or~ + playershield = [args.state.player.x - 20, args.state.player.y - 10, +** Processing line: ~ args.state.player.w + 20, args.state.player.h + 20,~ - Inside source: true *** True Line Result - # NOTE: The allowance of 17 pixels and 25 pixels is due to the fact that a grid box may be slightly cut off or -** Processing line: ~ # not entirely visible in the grid's view (until it is moved using "W", "A", "S", "D")~ + args.state.player.w + 20, args.state.player.h + 20, +** Processing line: ~ "sprites/square/blue.png",~ - Inside source: true *** True Line Result - # not entirely visible in the grid's view (until it is moved using "W", "A", "S", "D") -** Processing line: ~ if x >= state.centerX - (state.grid_border[2] / 2) - 17 && x <= state.centerX + (state.grid_border[2] / 2) &&~ + "sprites/square/blue.png", +** Processing line: ~ args.state.player.r,~ - Inside source: true *** True Line Result - if x >= state.centerX - (state.grid_border[2] / 2) - 17 && x <= state.centerX + (state.grid_border[2] / 2) && -** Processing line: ~ y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) + 25~ + args.state.player.r, +** Processing line: ~ 0]~ - Inside source: true *** True Line Result - y >= state.centerY - (state.grid_border[3] / 2) && y <= state.centerY + (state.grid_border[3] / 2) + 25 -** Processing line: ~ # calculations done to place sprites in grid spaces that are meant to filled in~ + 0] +** Processing line: ~~ - Inside source: true *** True Line Result - # calculations done to place sprites in grid spaces that are meant to filled in -** Processing line: ~ # mess around with the x and y values and see how the sprite placement changes~ + +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ - Inside source: true *** True Line Result - # mess around with the x and y values and see how the sprite placement changes -** Processing line: ~ outputs.sprites << [x - state.centerX + 630, y - state.centerY + 360, w, h, sprite]~ + playerjab = [args.state.player.x + 32, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - outputs.sprites << [x - state.centerX + 630, y - state.centerY + 360, w, h, sprite] -** Processing line: ~ end~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png",~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + "sprites/isometric/indigo.png", +** Processing line: ~ args.state.player.r,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + args.state.player.r, +** Processing line: ~ 0]~ - Inside source: true *** True Line Result - -** Processing line: ~ # outputs a white solid along the left side of the grid (change the color and you'll be able to see it against the white background)~ + 0] +** Processing line: ~~ - Inside source: true *** True Line Result - # outputs a white solid along the left side of the grid (change the color and you'll be able to see it against the white background) -** Processing line: ~ # state.increment subtracted in x parameter because solid's position is denoted by bottom left corner~ + +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ - Inside source: true *** True Line Result - # state.increment subtracted in x parameter because solid's position is denoted by bottom left corner -** Processing line: ~ # state.increment subtracted in y parameter to avoid covering the title label~ + playerupper = [args.state.player.x, args.state.player.y + 32, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - # state.increment subtracted in y parameter to avoid covering the title label -** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment,~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png",~ - Inside source: true *** True Line Result - outputs.primitives << [state.grid_border[0] - state.increment, -** Processing line: ~ state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2),~ + "sprites/isometric/indigo.png", +** Processing line: ~ args.state.player.r+90,~ - Inside source: true *** True Line Result - state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2), -** Processing line: ~ 255, 255, 255].solid~ + args.state.player.r+90, +** Processing line: ~ 0]~ - Inside source: true *** True Line Result - 255, 255, 255].solid + 0] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # outputs a white solid along the right side of the grid~ +** Processing line: ~ if ((args.state.tick_count - args.state.lastpush) <= 15)~ - Inside source: true *** True Line Result - # outputs a white solid along the right side of the grid -** Processing line: ~ # state.increment subtracted from y parameter to avoid covering title label~ + if ((args.state.tick_count - args.state.lastpush) <= 15) +** Processing line: ~ if (args.state.inputlist[0] == "<<")~ - Inside source: true *** True Line Result - # state.increment subtracted from y parameter to avoid covering title label -** Processing line: ~ outputs.primitives << [state.grid_border[0] + state.grid_border[2],~ + if (args.state.inputlist[0] == "<<") +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ - Inside source: true *** True Line Result - outputs.primitives << [state.grid_border[0] + state.grid_border[2], -** Processing line: ~ state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2),~ + player = [args.state.player.x, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - state.grid_border[1] - state.increment, state.increment, state.grid_border[3] + (state.increment * 2), -** Processing line: ~ 255, 255, 255].solid~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/square/yellow.png", args.state.player.r]~ - Inside source: true *** True Line Result - 255, 255, 255].solid + "sprites/square/yellow.png", args.state.player.r] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # outputs a white solid along the bottom of the grid~ +** Processing line: ~ if (args.state.inputlist[0] == "shield")~ - Inside source: true *** True Line Result - # outputs a white solid along the bottom of the grid -** Processing line: ~ # state.increment subtracted from y parameter to avoid covering last row of grid boxes~ + if (args.state.inputlist[0] == "shield") +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ - Inside source: true *** True Line Result - # state.increment subtracted from y parameter to avoid covering last row of grid boxes -** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] - state.increment,~ + player = [args.state.player.x, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] - state.increment, -** Processing line: ~ state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/square/indigo.png", args.state.player.r]~ - Inside source: true *** True Line Result - state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid + "sprites/square/indigo.png", args.state.player.r] ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # outputs a white solid along the top of the grid~ +** Processing line: ~ playershield = [args.state.player.x - 10, args.state.player.y - 10,~ - Inside source: true *** True Line Result - # outputs a white solid along the top of the grid -** Processing line: ~ outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] + state.grid_border[3],~ + playershield = [args.state.player.x - 10, args.state.player.y - 10, +** Processing line: ~ args.state.player.w + 20, args.state.player.h + 20,~ - Inside source: true *** True Line Result - outputs.primitives << [state.grid_border[0] - state.increment, state.grid_border[1] + state.grid_border[3], -** Processing line: ~ state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid~ + args.state.player.w + 20, args.state.player.h + 20, +** Processing line: ~ "sprites/square/blue.png", args.state.player.r, 50]~ - Inside source: true *** True Line Result - state.grid_border[2] + (2 * state.increment), state.increment, 255, 255, 255].solid + "sprites/square/blue.png", args.state.player.r, 50] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ end~ +** Processing line: ~ if (args.state.inputlist[0] == "back-attack")~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + if (args.state.inputlist[0] == "back-attack") +** Processing line: ~ playerjab = [args.state.player.x - 20, args.state.player.y,~ - Inside source: true *** True Line Result - -** Processing line: ~ # Outputs title and current tile pattern~ + playerjab = [args.state.player.x - 20, args.state.player.y, +** Processing line: ~ args.state.player.w - 10, args.state.player.h,~ - Inside source: true *** True Line Result - # Outputs title and current tile pattern -** Processing line: ~ def print_title~ + args.state.player.w - 10, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r, 255]~ - Inside source: true *** True Line Result - def print_title -** Processing line: ~ outputs.labels << [640, 700, 'Mouse to Place Tile, WASD to Move Around', 7, 1] # title label~ + "sprites/isometric/indigo.png", args.state.player.r, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - outputs.labels << [640, 700, 'Mouse to Place Tile, WASD to Move Around', 7, 1] # title label -** Processing line: ~ outputs.lines << horizontal_separator(660, 0, 1280) # outputs horizontal separator~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.lines << horizontal_separator(660, 0, 1280) # outputs horizontal separator -** Processing line: ~ outputs.labels << [1050, 500, 'Current:', 3, 1] # outputs Current label~ + +** Processing line: ~ if (args.state.inputlist[0] == "forward-attack")~ - Inside source: true *** True Line Result - outputs.labels << [1050, 500, 'Current:', 3, 1] # outputs Current label -** Processing line: ~ outputs.sprites << [1110, 474, state.tileSize / 2, state.tileSize / 2, 'sprites/image' + state.tileSelected.to_s + ".png"] # outputs sprite of current tile pattern using images in sprites folder; output is half the size of a tile~ + if (args.state.inputlist[0] == "forward-attack") +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ - Inside source: true *** True Line Result - outputs.sprites << [1110, 474, state.tileSize / 2, state.tileSize / 2, 'sprites/image' + state.tileSelected.to_s + ".png"] # outputs sprite of current tile pattern using images in sprites folder; output is half the size of a tile -** Processing line: ~ end~ + playerjab = [args.state.player.x + 32, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - end + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r, 255]~ +- Inside source: true +*** True Line Result + "sprites/isometric/indigo.png", args.state.player.r, 255] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Sets the starting position, ending position, and color for the horizontal separator.~ +** Processing line: ~ if (args.state.inputlist[0] == "up-attack")~ - Inside source: true *** True Line Result - # Sets the starting position, ending position, and color for the horizontal separator. -** Processing line: ~ def horizontal_separator y, x, x2~ + if (args.state.inputlist[0] == "up-attack") +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ - Inside source: true *** True Line Result - def horizontal_separator y, x, x2 -** Processing line: ~ [x, y, x2, y, 150, 150, 150] # definition of separator; horizontal line means same starting/ending y~ + playerupper = [args.state.player.x, args.state.player.y + 32, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - [x, y, x2, y, 150, 150, 150] # definition of separator; horizontal line means same starting/ending y -** Processing line: ~ end~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r + 90, 255]~ - Inside source: true *** True Line Result - end + "sprites/isometric/indigo.png", args.state.player.r + 90, 255] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Checks if the mouse is being clicked or dragged~ +** Processing line: ~ if (args.state.inputlist[0] == "dair")~ - Inside source: true *** True Line Result - # Checks if the mouse is being clicked or dragged -** Processing line: ~ def check_click~ + if (args.state.inputlist[0] == "dair") +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y - 32,~ - Inside source: true *** True Line Result - def check_click -** Processing line: ~ if inputs.keyboard.key_down.r # if the "r" key is pressed down~ + playerupper = [args.state.player.x, args.state.player.y - 32, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - if inputs.keyboard.key_down.r # if the "r" key is pressed down -** Processing line: ~ $dragon.reset~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r + 90, 255]~ - Inside source: true *** True Line Result - $dragon.reset + "sprites/isometric/indigo.png", args.state.player.r + 90, 255] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -99456,242 +106383,242 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if inputs.mouse.down #is mouse up or down?~ +** Processing line: ~ if (args.state.inputlist[0] == "dash-attack")~ - Inside source: true *** True Line Result - if inputs.mouse.down #is mouse up or down? -** Processing line: ~ state.mouse_held = true~ + if (args.state.inputlist[0] == "dash-attack") +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ - Inside source: true *** True Line Result - state.mouse_held = true -** Processing line: ~ if inputs.mouse.position.x < state.grid_border[0] # if mouse's x position is inside the grid's borders~ + playerupper = [args.state.player.x, args.state.player.y + 32, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - if inputs.mouse.position.x < state.grid_border[0] # if mouse's x position is inside the grid's borders -** Processing line: ~ state.tileCords.map do # perform action on all elements of tileCords collection~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/violet.png", args.state.player.r + 90, 255]~ - Inside source: true *** True Line Result - state.tileCords.map do # perform action on all elements of tileCords collection -** Processing line: ~ |x, y, order|~ + "sprites/isometric/violet.png", args.state.player.r + 90, 255] +** Processing line: ~~ - Inside source: true *** True Line Result - |x, y, order| -** Processing line: ~ # if mouse's x position is greater than (or equal to) the starting x position of a tile~ + +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ - Inside source: true *** True Line Result - # if mouse's x position is greater than (or equal to) the starting x position of a tile -** Processing line: ~ # and the mouse's x position is also less than (or equal to) the ending x position of that tile,~ + playerjab = [args.state.player.x + 32, args.state.player.y, +** Processing line: ~ args.state.player.w, args.state.player.h,~ - Inside source: true *** True Line Result - # and the mouse's x position is also less than (or equal to) the ending x position of that tile, -** Processing line: ~ # and the mouse's y position is greater than (or equal to) the starting y position of that tile,~ + args.state.player.w, args.state.player.h, +** Processing line: ~ "sprites/isometric/violet.png", args.state.player.r, 255]~ - Inside source: true *** True Line Result - # and the mouse's y position is greater than (or equal to) the starting y position of that tile, -** Processing line: ~ # and the mouse's y position is also less than (or equal to) the ending y position of that tile,~ + "sprites/isometric/violet.png", args.state.player.r, 255] +** Processing line: ~ end~ - Inside source: true *** True Line Result - # and the mouse's y position is also less than (or equal to) the ending y position of that tile, -** Processing line: ~ # (BASICALLY, IF THE MOUSE'S POSITION IS WITHIN THE STARTING AND ENDING POSITIONS OF A TILE)~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - # (BASICALLY, IF THE MOUSE'S POSITION IS WITHIN THE STARTING AND ENDING POSITIONS OF A TILE) -** Processing line: ~ if inputs.mouse.position.x >= x && inputs.mouse.position.x <= x + state.tileSize &&~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if inputs.mouse.position.x >= x && inputs.mouse.position.x <= x + state.tileSize && -** Processing line: ~ inputs.mouse.position.y >= y && inputs.mouse.position.y <= y + state.tileSize~ + +** Processing line: ~ args.outputs.sprites << playerjab~ - Inside source: true *** True Line Result - inputs.mouse.position.y >= y && inputs.mouse.position.y <= y + state.tileSize -** Processing line: ~ state.tileSelected = order # that tile is selected~ + args.outputs.sprites << playerjab +** Processing line: ~ args.outputs.sprites << playerupper~ - Inside source: true *** True Line Result - state.tileSelected = order # that tile is selected -** Processing line: ~ end~ + args.outputs.sprites << playerupper +** Processing line: ~ args.outputs.sprites << player~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.outputs.sprites << player +** Processing line: ~ args.outputs.sprites << playershield~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.outputs.sprites << playershield +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ elsif inputs.mouse.up # otherwise, if the mouse is in the "up" state~ + +** Processing line: ~ args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge~ - Inside source: true *** True Line Result - elsif inputs.mouse.up # otherwise, if the mouse is in the "up" state -** Processing line: ~ state.mouse_held = false # mouse is not held down or dragged~ + args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge +** Processing line: ~ [i * 64, args.state.bridge_top - 64, 64, 64]~ - Inside source: true *** True Line Result - state.mouse_held = false # mouse is not held down or dragged -** Processing line: ~ state.mouse_dragging = false~ + [i * 64, args.state.bridge_top - 64, 64, 64] +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.mouse_dragging = false -** Processing line: ~ end~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if state.mouse_held && # mouse needs to be down~ -- Inside source: true -*** True Line Result - if state.mouse_held && # mouse needs to be down -** Processing line: ~ !inputs.mouse.click && # must not be first click~ +** Processing line: ~ # Performs calculations to move objects on the screen~ - Inside source: true *** True Line Result - !inputs.mouse.click && # must not be first click -** Processing line: ~ ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15 ||~ + # Performs calculations to move objects on the screen +** Processing line: ~ def calc args~ - Inside source: true *** True Line Result - ((inputs.mouse.previous_click.point.x - inputs.mouse.position.x).abs > 15 || -** Processing line: ~ (inputs.mouse.previous_click.point.y - inputs.mouse.position.y).abs > 15) # Need to move 15 pixels before "drag"~ + def calc args +** Processing line: ~ # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.~ - Inside source: true *** True Line Result - (inputs.mouse.previous_click.point.y - inputs.mouse.position.y).abs > 15) # Need to move 15 pixels before "drag" -** Processing line: ~ state.mouse_dragging = true~ + # Since velocity is the change in position, the change in x increases by dx. Same with y and dy. +** Processing line: ~ args.state.player.x += args.state.player.dx~ - Inside source: true *** True Line Result - state.mouse_dragging = true -** Processing line: ~ end~ + args.state.player.x += args.state.player.dx +** Processing line: ~ args.state.player.y += args.state.player.dy~ - Inside source: true *** True Line Result - end + args.state.player.y += args.state.player.dy ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if mouse is clicked inside grid's border, search_lines method is called with click input type~ -- Inside source: true -*** True Line Result - # if mouse is clicked inside grid's border, search_lines method is called with click input type -** Processing line: ~ if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border))~ +** Processing line: ~ # Since acceleration is the change in velocity, the change in y (dy) increases every frame~ - Inside source: true *** True Line Result - if ((inputs.mouse.click) && (inputs.mouse.click.point.inside_rect? state.grid_border)) -** Processing line: ~ search_lines(inputs.mouse.click.point, :click)~ + # Since acceleration is the change in velocity, the change in y (dy) increases every frame +** Processing line: ~ args.state.player.dy += args.state.gravity~ - Inside source: true *** True Line Result - search_lines(inputs.mouse.click.point, :click) + args.state.player.dy += args.state.gravity ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if mouse is dragged inside grid's border, search_lines method is called with drag input type~ +** Processing line: ~ # player's y position is either current y position or y position of top of~ - Inside source: true *** True Line Result - # if mouse is dragged inside grid's border, search_lines method is called with drag input type -** Processing line: ~ elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border))~ + # player's y position is either current y position or y position of top of +** Processing line: ~ # bridge, whichever has a greater value~ - Inside source: true *** True Line Result - elsif ((state.mouse_dragging) && (inputs.mouse.position.inside_rect? state.grid_border)) -** Processing line: ~ search_lines(inputs.mouse.position, :drag)~ + # bridge, whichever has a greater value +** Processing line: ~ # ensures that the player never goes below the bridge~ - Inside source: true *** True Line Result - search_lines(inputs.mouse.position, :drag) -** Processing line: ~ end~ + # ensures that the player never goes below the bridge +** Processing line: ~ args.state.player.y = args.state.player.y.greater(args.state.bridge_top)~ - Inside source: true *** True Line Result - end + args.state.player.y = args.state.player.y.greater(args.state.bridge_top) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Changes grid's position on screen by moving it up, down, left, or right.~ +** Processing line: ~ # player's x position is either the current x position or 0, whichever has a greater value~ - Inside source: true *** True Line Result - # Changes grid's position on screen by moving it up, down, left, or right. + # player's x position is either the current x position or 0, whichever has a greater value +** Processing line: ~ # ensures that the player doesn't go too far left (out of the screen's scope)~ +- Inside source: true +*** True Line Result + # ensures that the player doesn't go too far left (out of the screen's scope) +** Processing line: ~ args.state.player.x = args.state.player.x.greater(0)~ +- Inside source: true +*** True Line Result + args.state.player.x = args.state.player.x.greater(0) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # centerX is incremented by speed if the "d" key is pressed and if that sum is less than~ +** Processing line: ~ # player is not falling if it is located on the top of the bridge~ - Inside source: true *** True Line Result - # centerX is incremented by speed if the "d" key is pressed and if that sum is less than -** Processing line: ~ # the original left side of the center plus half the grid, minus half the top border of grid.~ + # player is not falling if it is located on the top of the bridge +** Processing line: ~ args.state.player.falling = false if args.state.player.y == args.state.bridge_top~ - Inside source: true *** True Line Result - # the original left side of the center plus half the grid, minus half the top border of grid. -** Processing line: ~ # MOVES GRID RIGHT (increasing x)~ + args.state.player.falling = false if args.state.player.y == args.state.bridge_top +** Processing line: ~ #args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player~ - Inside source: true *** True Line Result - # MOVES GRID RIGHT (increasing x) -** Processing line: ~ state.centerX += state.speed if inputs.keyboard.key_held.d &&~ + #args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.centerX += state.speed if inputs.keyboard.key_held.d && -** Processing line: ~ (state.centerX + state.speed) < state.originalCenter[0] + (state.gridSize / 2) - (state.grid_border[2] / 2)~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - (state.centerX + state.speed) < state.originalCenter[0] + (state.gridSize / 2) - (state.grid_border[2] / 2) -** Processing line: ~ # centerX is decremented by speed if the "a" key is pressed and if that difference is greater than~ + +** Processing line: ~ # Resets the player by changing its properties back to the values they had at initialization~ - Inside source: true *** True Line Result - # centerX is decremented by speed if the "a" key is pressed and if that difference is greater than -** Processing line: ~ # the original left side of the center minus half the grid, plus half the top border of grid.~ + # Resets the player by changing its properties back to the values they had at initialization +** Processing line: ~ def reset_player args~ - Inside source: true *** True Line Result - # the original left side of the center minus half the grid, plus half the top border of grid. -** Processing line: ~ # MOVES GRID LEFT (decreasing x)~ + def reset_player args +** Processing line: ~ args.state.player.x = 0~ - Inside source: true *** True Line Result - # MOVES GRID LEFT (decreasing x) -** Processing line: ~ state.centerX -= state.speed if inputs.keyboard.key_held.a &&~ + args.state.player.x = 0 +** Processing line: ~ args.state.player.y = args.state.bridge_top~ - Inside source: true *** True Line Result - state.centerX -= state.speed if inputs.keyboard.key_held.a && -** Processing line: ~ (state.centerX - state.speed) > state.originalCenter[0] - (state.gridSize / 2) + (state.grid_border[2] / 2)~ + args.state.player.y = args.state.bridge_top +** Processing line: ~ args.state.player.dy = 0~ - Inside source: true *** True Line Result - (state.centerX - state.speed) > state.originalCenter[0] - (state.gridSize / 2) + (state.grid_border[2] / 2) -** Processing line: ~ # centerY is incremented by speed if the "w" key is pressed and if that sum is less than~ + args.state.player.dy = 0 +** Processing line: ~ args.state.player.dx = 0~ - Inside source: true *** True Line Result - # centerY is incremented by speed if the "w" key is pressed and if that sum is less than -** Processing line: ~ # the original bottom of the center plus half the grid, minus half the right border of grid.~ + args.state.player.dx = 0 +** Processing line: ~ args.state.enemy.hammers.clear # empties hammer collection~ - Inside source: true *** True Line Result - # the original bottom of the center plus half the grid, minus half the right border of grid. -** Processing line: ~ # MOVES GRID UP (increasing y)~ + args.state.enemy.hammers.clear # empties hammer collection +** Processing line: ~ args.state.enemy.hammer_queue.clear # empties hammer_queue~ - Inside source: true *** True Line Result - # MOVES GRID UP (increasing y) -** Processing line: ~ state.centerY += state.speed if inputs.keyboard.key_held.w &&~ + args.state.enemy.hammer_queue.clear # empties hammer_queue +** Processing line: ~ args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)~ - Inside source: true *** True Line Result - state.centerY += state.speed if inputs.keyboard.key_held.w && -** Processing line: ~ (state.centerY + state.speed) < state.originalCenter[1] + (state.gridSize / 2) - (state.grid_border[3] / 2)~ + args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time) +** Processing line: ~ end~ - Inside source: true *** True Line Result - (state.centerY + state.speed) < state.originalCenter[1] + (state.gridSize / 2) - (state.grid_border[3] / 2) -** Processing line: ~ # centerY is decremented by speed if the "s" key is pressed and if the difference is greater than~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - # centerY is decremented by speed if the "s" key is pressed and if the difference is greater than -** Processing line: ~ # the original bottom of the center minus half the grid, plus half the right border of grid.~ + +** Processing line: ~ # Processes input from the user to move the player~ - Inside source: true *** True Line Result - # the original bottom of the center minus half the grid, plus half the right border of grid. -** Processing line: ~ # MOVES GRID DOWN (decreasing y)~ + # Processes input from the user to move the player +** Processing line: ~ def input args~ - Inside source: true *** True Line Result - # MOVES GRID DOWN (decreasing y) -** Processing line: ~ state.centerY -= state.speed if inputs.keyboard.key_held.s &&~ + def input args +** Processing line: ~ if args.state.inputlist.length > 5~ - Inside source: true *** True Line Result - state.centerY -= state.speed if inputs.keyboard.key_held.s && -** Processing line: ~ (state.centerY - state.speed) > state.originalCenter[1] - (state.gridSize / 2) + (state.grid_border[3] / 2)~ + if args.state.inputlist.length > 5 +** Processing line: ~ args.state.inputlist.pop~ - Inside source: true *** True Line Result - (state.centerY - state.speed) > state.originalCenter[1] - (state.gridSize / 2) + (state.grid_border[3] / 2) + args.state.inputlist.pop ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -99700,310 +106627,318 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Performs calculations on the gridX and gridY collections, and sets values.~ +** Processing line: ~ should_process_special_move = (args.inputs.keyboard.key_down.j) ||~ - Inside source: true *** True Line Result - # Performs calculations on the gridX and gridY collections, and sets values. -** Processing line: ~ # Sets the definition of a grid box, including the image that it is filled with.~ + should_process_special_move = (args.inputs.keyboard.key_down.j) || +** Processing line: ~ (args.inputs.keyboard.key_down.k) ||~ - Inside source: true *** True Line Result - # Sets the definition of a grid box, including the image that it is filled with. -** Processing line: ~ def search_lines (point, input_type)~ + (args.inputs.keyboard.key_down.k) || +** Processing line: ~ (args.inputs.keyboard.key_down.a) ||~ - Inside source: true *** True Line Result - def search_lines (point, input_type) -** Processing line: ~ point.x += state.centerX - 630 # increments x and y~ + (args.inputs.keyboard.key_down.a) || +** Processing line: ~ (args.inputs.keyboard.key_down.d) ||~ - Inside source: true *** True Line Result - point.x += state.centerX - 630 # increments x and y -** Processing line: ~ point.y += state.centerY - 360~ + (args.inputs.keyboard.key_down.d) || +** Processing line: ~ (args.inputs.controller_one.key_down.y) ||~ - Inside source: true *** True Line Result - point.y += state.centerY - 360 -** Processing line: ~ findX = 0~ + (args.inputs.controller_one.key_down.y) || +** Processing line: ~ (args.inputs.controller_one.key_down.x) ||~ - Inside source: true *** True Line Result - findX = 0 -** Processing line: ~ findY = 0~ + (args.inputs.controller_one.key_down.x) || +** Processing line: ~ (args.inputs.controller_one.key_down.left) ||~ - Inside source: true *** True Line Result - findY = 0 -** Processing line: ~ increment = state.gridSize / state.lineQuantity # divides grid by number of separators~ + (args.inputs.controller_one.key_down.left) || +** Processing line: ~ (args.inputs.controller_one.key_down.right)~ - Inside source: true *** True Line Result - increment = state.gridSize / state.lineQuantity # divides grid by number of separators + (args.inputs.controller_one.key_down.right) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ state.gridX.map do # perform an action on every element of collection~ +** Processing line: ~ if (should_process_special_move)~ - Inside source: true *** True Line Result - state.gridX.map do # perform an action on every element of collection -** Processing line: ~ |x|~ + if (should_process_special_move) +** Processing line: ~ if (args.inputs.keyboard.key_down.j && args.inputs.keyboard.key_down.k) ||~ - Inside source: true *** True Line Result - |x| -** Processing line: ~ # findX increments x by 10 if point.x is less than that sum and findX is currently 0~ + if (args.inputs.keyboard.key_down.j && args.inputs.keyboard.key_down.k) || +** Processing line: ~ (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.y)~ - Inside source: true *** True Line Result - # findX increments x by 10 if point.x is less than that sum and findX is currently 0 -** Processing line: ~ findX = x + 10 if point.x < (x + 10) && findX == 0~ + (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.y) +** Processing line: ~ args.state.inputlist.unshift("shield")~ - Inside source: true *** True Line Result - findX = x + 10 if point.x < (x + 10) && findX == 0 -** Processing line: ~ end~ + args.state.inputlist.unshift("shield") +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) && +** Processing line: ~ (args.state.inputlist[0] == "forward-attack") && ((args.state.tick_count - args.state.lastpush) <= 15)~ - Inside source: true *** True Line Result - -** Processing line: ~ state.gridY.map do~ + (args.state.inputlist[0] == "forward-attack") && ((args.state.tick_count - args.state.lastpush) <= 15) +** Processing line: ~ args.state.inputlist.unshift("dash-attack")~ - Inside source: true *** True Line Result - state.gridY.map do -** Processing line: ~ |y|~ + args.state.inputlist.unshift("dash-attack") +** Processing line: ~ args.state.player.dx = 20~ - Inside source: true *** True Line Result - |y| -** Processing line: ~ # findY is set to y if point.y is less than that value and findY is currently 0~ + args.state.player.dx = 20 +** Processing line: ~ elsif (args.inputs.keyboard.key_down.j && args.inputs.keyboard.a) ||~ - Inside source: true *** True Line Result - # findY is set to y if point.y is less than that value and findY is currently 0 -** Processing line: ~ findY = y if point.y < (y) && findY == 0~ + elsif (args.inputs.keyboard.key_down.j && args.inputs.keyboard.a) || +** Processing line: ~ (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.left)~ - Inside source: true *** True Line Result - findY = y if point.y < (y) && findY == 0 -** Processing line: ~ end~ + (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.left) +** Processing line: ~ args.state.inputlist.unshift("back-attack")~ - Inside source: true *** True Line Result - end -** Processing line: ~ # position of a box is denoted by bottom left corner, which is why the increment is being subtracted~ + args.state.inputlist.unshift("back-attack") +** Processing line: ~ elsif ( args.inputs.controller_one.key_down.x || args.inputs.keyboard.key_down.j)~ - Inside source: true *** True Line Result - # position of a box is denoted by bottom left corner, which is why the increment is being subtracted -** Processing line: ~ grid_box = [findX - (increment.ceil), findY - (increment.ceil), increment.ceil, increment.ceil,~ + elsif ( args.inputs.controller_one.key_down.x || args.inputs.keyboard.key_down.j) +** Processing line: ~ args.state.inputlist.unshift("forward-attack")~ - Inside source: true *** True Line Result - grid_box = [findX - (increment.ceil), findY - (increment.ceil), increment.ceil, increment.ceil, -** Processing line: ~ "sprites/image" + state.tileSelected.to_s + ".png"] # sets sprite definition~ + args.state.inputlist.unshift("forward-attack") +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&~ - Inside source: true *** True Line Result - "sprites/image" + state.tileSelected.to_s + ".png"] # sets sprite definition -** Processing line: ~~ + elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) && +** Processing line: ~ (args.state.player.y > 128)~ - Inside source: true *** True Line Result - -** Processing line: ~ if input_type == :click # if user clicks their mouse~ + (args.state.player.y > 128) +** Processing line: ~ args.state.inputlist.unshift("dair")~ - Inside source: true *** True Line Result - if input_type == :click # if user clicks their mouse -** Processing line: ~ if state.filled_squares.include? grid_box # if grid box is already filled in~ + args.state.inputlist.unshift("dair") +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y)~ - Inside source: true *** True Line Result - if state.filled_squares.include? grid_box # if grid box is already filled in -** Processing line: ~ state.filled_squares.delete grid_box # box is cleared and removed from filled_squares~ + elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) +** Processing line: ~ args.state.inputlist.unshift("up-attack")~ - Inside source: true *** True Line Result - state.filled_squares.delete grid_box # box is cleared and removed from filled_squares -** Processing line: ~ else~ + args.state.inputlist.unshift("up-attack") +** Processing line: ~ elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) &&~ - Inside source: true *** True Line Result - else -** Processing line: ~ state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares~ + elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) && +** Processing line: ~ (args.state.inputlist[0] == "<") &&~ - Inside source: true *** True Line Result - state.filled_squares << grid_box # otherwise, box is filled in and added to filled_squares -** Processing line: ~ end~ + (args.state.inputlist[0] == "<") && +** Processing line: ~ ((args.state.tick_count - args.state.lastpush) <= 10)~ - Inside source: true *** True Line Result - end -** Processing line: ~ elsif input_type == :drag # if user drags mouse~ + ((args.state.tick_count - args.state.lastpush) <= 10) +** Processing line: ~ args.state.inputlist.unshift("<<")~ - Inside source: true *** True Line Result - elsif input_type == :drag # if user drags mouse -** Processing line: ~ unless state.filled_squares.include? grid_box # unless grid box dragged over is already filled in~ + args.state.inputlist.unshift("<<") +** Processing line: ~ args.state.player.dx = -15~ - Inside source: true *** True Line Result - unless state.filled_squares.include? grid_box # unless grid box dragged over is already filled in -** Processing line: ~ state.filled_squares << grid_box # box is filled in and added to filled_squares~ + args.state.player.dx = -15 +** Processing line: ~ elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a)~ - Inside source: true *** True Line Result - state.filled_squares << grid_box # box is filled in and added to filled_squares -** Processing line: ~ end~ + elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) +** Processing line: ~ args.state.inputlist.unshift("<")~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.inputlist.unshift("<") +** Processing line: ~ args.state.timeleft = args.state.tick_count~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.state.timeleft = args.state.tick_count +** Processing line: ~ elsif (args.inputs.controller_one.key_down.right || args.inputs.keyboard.key_down.d)~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif (args.inputs.controller_one.key_down.right || args.inputs.keyboard.key_down.d) +** Processing line: ~ args.state.inputlist.unshift(">")~ - Inside source: true *** True Line Result - -** Processing line: ~ # Creates a "Clear" button using labels and borders.~ + args.state.inputlist.unshift(">") +** Processing line: ~ end~ - Inside source: true *** True Line Result - # Creates a "Clear" button using labels and borders. -** Processing line: ~ def draw_buttons~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def draw_buttons -** Processing line: ~ x, y, w, h = 390, 50, 240, 50~ + +** Processing line: ~ args.state.lastpush = args.state.tick_count~ - Inside source: true *** True Line Result - x, y, w, h = 390, 50, 240, 50 -** Processing line: ~ state.clear_button ||= state.new_entity(:button_with_fade)~ + args.state.lastpush = args.state.tick_count +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.clear_button ||= state.new_entity(:button_with_fade) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # x and y positions are set to display "Clear" label in center of the button~ -- Inside source: true -*** True Line Result - # x and y positions are set to display "Clear" label in center of the button -** Processing line: ~ # Try changing first two parameters to simply x, y and see what happens to the text placement~ -- Inside source: true -*** True Line Result - # Try changing first two parameters to simply x, y and see what happens to the text placement -** Processing line: ~ state.clear_button.label ||= [x + w.half, y + h.half + 10, "Clear", 0, 1]~ +** Processing line: ~ if args.inputs.keyboard.space || args.inputs.controller_one.r2 # if the user presses the space bar~ - Inside source: true *** True Line Result - state.clear_button.label ||= [x + w.half, y + h.half + 10, "Clear", 0, 1] -** Processing line: ~ state.clear_button.border ||= [x, y, w, h] # definition of button's border~ + if args.inputs.keyboard.space || args.inputs.controller_one.r2 # if the user presses the space bar +** Processing line: ~ args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame~ - Inside source: true *** True Line Result - state.clear_button.border ||= [x, y, w, h] # definition of button's border + args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # If the mouse is clicked inside the borders of the clear button~ -- Inside source: true -*** True Line Result - # If the mouse is clicked inside the borders of the clear button -** Processing line: ~ if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border)~ +** Processing line: ~ # if the time that has passed since the jump is less than the player's jump duration and~ - Inside source: true *** True Line Result - if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.clear_button.border) -** Processing line: ~ state.clear_button.clicked_at = inputs.mouse.click.created_at # value is frame of mouse click~ + # if the time that has passed since the jump is less than the player's jump duration and +** Processing line: ~ # the player is not falling~ - Inside source: true *** True Line Result - state.clear_button.clicked_at = inputs.mouse.click.created_at # value is frame of mouse click -** Processing line: ~ state.filled_squares.clear # filled squares collection is emptied (squares are cleared)~ + # the player is not falling +** Processing line: ~ if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling~ - Inside source: true *** True Line Result - state.filled_squares.clear # filled squares collection is emptied (squares are cleared) -** Processing line: ~ inputs.mouse.previous_click = nil # no previous click~ + if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling +** Processing line: ~ args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump~ - Inside source: true *** True Line Result - inputs.mouse.previous_click = nil # no previous click + args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ outputs.labels << state.clear_button.label # outputs clear button~ +** Processing line: ~ # if the space bar is in the "up" state (or not being pressed down)~ - Inside source: true *** True Line Result - outputs.labels << state.clear_button.label # outputs clear button -** Processing line: ~ outputs.borders << state.clear_button.border~ + # if the space bar is in the "up" state (or not being pressed down) +** Processing line: ~ if args.inputs.keyboard.key_up.space || args.inputs.controller_one.key_up.r2~ - Inside source: true *** True Line Result - outputs.borders << state.clear_button.border + if args.inputs.keyboard.key_up.space || args.inputs.controller_one.key_up.r2 +** Processing line: ~ args.state.player.jumped_at = nil # jumped_at is empty~ +- Inside source: true +*** True Line Result + args.state.player.jumped_at = nil # jumped_at is empty +** Processing line: ~ args.state.player.falling = true # the player is falling~ +- Inside source: true +*** True Line Result + args.state.player.falling = true # the player is falling +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # When the clear button is clicked, the color of the button changes~ +** Processing line: ~ if args.inputs.left # if left key is pressed~ - Inside source: true *** True Line Result - # When the clear button is clicked, the color of the button changes -** Processing line: ~ # and the transparency changes, as well. If you change the time from~ + if args.inputs.left # if left key is pressed +** Processing line: ~ if args.state.player.dx < -5~ - Inside source: true *** True Line Result - # and the transparency changes, as well. If you change the time from -** Processing line: ~ # 0.25.seconds to 1.25.seconds or more, the change will last longer.~ + if args.state.player.dx < -5 +** Processing line: ~ args.state.player.dx = args.state.player.dx~ - Inside source: true *** True Line Result - # 0.25.seconds to 1.25.seconds or more, the change will last longer. -** Processing line: ~ if state.clear_button.clicked_at~ + args.state.player.dx = args.state.player.dx +** Processing line: ~ else~ - Inside source: true *** True Line Result - if state.clear_button.clicked_at -** Processing line: ~ outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)]~ + else +** Processing line: ~ args.state.player.dx = -5~ - Inside source: true *** True Line Result - outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.clear_button.clicked_at.ease(0.25.seconds, :flip)] + args.state.player.dx = -5 ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ elsif args.inputs.right # if right key is pressed~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + elsif args.inputs.right # if right key is pressed +** Processing line: ~ if args.state.player.dx > 5~ - Inside source: true *** True Line Result - -** Processing line: ~ $tile_editor = TileEditor.new~ + if args.state.player.dx > 5 +** Processing line: ~ args.state.player.dx = args.state.player.dx~ - Inside source: true *** True Line Result - $tile_editor = TileEditor.new -** Processing line: ~~ + args.state.player.dx = args.state.player.dx +** Processing line: ~ else~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + else +** Processing line: ~ args.state.player.dx = 5~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $tile_editor.inputs = args.inputs~ + args.state.player.dx = 5 +** Processing line: ~ end~ - Inside source: true *** True Line Result - $tile_editor.inputs = args.inputs -** Processing line: ~ $tile_editor.grid = args.grid~ + end +** Processing line: ~ else~ - Inside source: true *** True Line Result - $tile_editor.grid = args.grid -** Processing line: ~ $tile_editor.args = args~ + else +** Processing line: ~ args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down~ - Inside source: true *** True Line Result - $tile_editor.args = args -** Processing line: ~ $tile_editor.outputs = args.outputs~ + args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down +** Processing line: ~ end~ - Inside source: true *** True Line Result - $tile_editor.outputs = args.outputs -** Processing line: ~ $tile_editor.state = args.state~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - $tile_editor.state = args.state -** Processing line: ~ $tile_editor.tick~ + +** Processing line: ~ if ((args.state.player.dx).abs > 5) #&& ((args.state.tick_count - args.state.lastpush) <= 10)~ - Inside source: true *** True Line Result - $tile_editor.tick -** Processing line: ~ tick_instructions args, "Roll your own tile editor. CLICK to select a sprite. CLICK in grid to place sprite. WASD to move around."~ + if ((args.state.player.dx).abs > 5) #&& ((args.state.tick_count - args.state.lastpush) <= 10) +** Processing line: ~ args.state.player.dx *= 0.95~ - Inside source: true *** True Line Result - tick_instructions args, "Roll your own tile editor. CLICK to select a sprite. CLICK in grid to place sprite. WASD to move around." + args.state.player.dx *= 0.95 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -100032,6 +106967,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result args.inputs.keyboard.key_down.enter || +** Processing line: ~ args.inputs.keyboard.key_down.space ||~ +- Inside source: true +*** True Line Result + args.inputs.keyboard.key_down.space || ** Processing line: ~ args.inputs.keyboard.key_down.escape~ - Inside source: true *** True Line Result @@ -102520,10 +109459,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result r: 255, g: 255, b: 255 -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ - Inside source: true *** True Line Result - }.label + }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -102560,10 +109499,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result r: 255, g: 255, b: 255 -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ - Inside source: true *** True Line Result - }.label + }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -103572,10 +110511,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result a: 100 -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ - Inside source: true *** True Line Result - }.line + }.line! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -103624,10 +110563,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result a: 100 -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ - Inside source: true *** True Line Result - }.line + }.line! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -106640,10 +113579,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result a: 80 -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ - Inside source: true *** True Line Result - }.line + }.line! ** Processing line: ~~ - Inside source: true *** True Line Result @@ -106684,10 +113623,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result a: 80 -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ - Inside source: true *** True Line Result - }.line + }.line! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -106792,10 +113731,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -1.5 -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ - Inside source: true *** True Line Result - }.label + }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -106828,10 +113767,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result alignment_enum: 1 -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ - Inside source: true *** True Line Result - }.label + }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -140923,170 +147862,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result include Serialize -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Contains information related to input devices and input events.~ -- Inside source: true -*** True Line Result - # Contains information related to input devices and input events. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Inputs]~ -- Inside source: true -*** True Line Result - # @return [Inputs] ** Processing line: ~ attr_accessor :inputs~ - Inside source: true *** True Line Result attr_accessor :inputs -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Contains the means to interact with output devices such as the screen.~ -- Inside source: true -*** True Line Result - # Contains the means to interact with output devices such as the screen. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Outputs]~ -- Inside source: true -*** True Line Result - # @return [Outputs] ** Processing line: ~ attr_accessor :outputs~ - Inside source: true *** True Line Result attr_accessor :outputs -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Contains the means to interact with the audio mixer.~ -- Inside source: true -*** True Line Result - # Contains the means to interact with the audio mixer. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Hash]~ -- Inside source: true -*** True Line Result - # @return [Hash] ** Processing line: ~ attr_accessor :audio~ - Inside source: true *** True Line Result attr_accessor :audio -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Contains display size information to assist in positioning things on the screen.~ -- Inside source: true -*** True Line Result - # Contains display size information to assist in positioning things on the screen. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Grid]~ -- Inside source: true -*** True Line Result - # @return [Grid] ** Processing line: ~ attr_accessor :grid~ - Inside source: true *** True Line Result attr_accessor :grid -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Provides access to game play recording facilities within Game Toolkit.~ -- Inside source: true -*** True Line Result - # Provides access to game play recording facilities within Game Toolkit. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Recording]~ -- Inside source: true -*** True Line Result - # @return [Recording] ** Processing line: ~ attr_accessor :recording~ - Inside source: true *** True Line Result attr_accessor :recording -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Gives you access to geometry related functions.~ -- Inside source: true -*** True Line Result - # Gives you access to geometry related functions. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [Geometry]~ -- Inside source: true -*** True Line Result - # @return [Geometry] ** Processing line: ~ attr_accessor :geometry~ - Inside source: true *** True Line Result attr_accessor :geometry -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :fn~ - Inside source: true *** True Line Result attr_accessor :fn -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # This is where you'll put state associated with your video game.~ -- Inside source: true -*** True Line Result - # This is where you'll put state associated with your video game. -** Processing line: ~ #~ -- Inside source: true -*** True Line Result - # -** Processing line: ~ # @return [OpenEntity]~ -- Inside source: true -*** True Line Result - # @return [OpenEntity] ** Processing line: ~ attr_accessor :state~ - Inside source: true *** True Line Result attr_accessor :state -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # Gives you access to the top level DragonRuby runtime.~ -- Inside source: true -*** True Line Result - # Gives you access to the top level DragonRuby runtime. -** Processing line: ~ #~ +** Processing line: ~ attr_accessor :temp_state~ - Inside source: true *** True Line Result - # -** Processing line: ~ # @return [Runtime]~ -- Inside source: true -*** True Line Result - # @return [Runtime] + attr_accessor :temp_state ** Processing line: ~ attr_accessor :runtime~ - Inside source: true *** True Line Result @@ -141095,42 +147906,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result alias_method :gtk, :runtime -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :passes~ - Inside source: true *** True Line Result attr_accessor :passes -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :wizards~ - Inside source: true *** True Line Result attr_accessor :wizards -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :layout~ - Inside source: true *** True Line Result attr_accessor :layout -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :easing~ - Inside source: true *** True Line Result attr_accessor :easing -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ attr_accessor :string~ - Inside source: true *** True Line Result @@ -141163,6 +147954,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @state = OpenEntity.new +** Processing line: ~ @temp_state = OpenEntity.new~ +- Inside source: true +*** True Line Result + @temp_state = OpenEntity.new ** Processing line: ~ @state.tick_count = -1~ - Inside source: true *** True Line Result @@ -141279,26 +148074,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result { -** Processing line: ~ state: state.as_hash,~ +** Processing line: ~ state: state.as_hash,~ +- Inside source: true +*** True Line Result + state: state.as_hash, +** Processing line: ~ temp_state: temp_state.as_hash,~ - Inside source: true *** True Line Result - state: state.as_hash, -** Processing line: ~ inputs: inputs.serialize,~ + temp_state: temp_state.as_hash, +** Processing line: ~ inputs: inputs.serialize,~ - Inside source: true *** True Line Result - inputs: inputs.serialize, -** Processing line: ~ passes: passes.serialize,~ + inputs: inputs.serialize, +** Processing line: ~ passes: passes.serialize,~ - Inside source: true *** True Line Result - passes: passes.serialize, -** Processing line: ~ outputs: outputs.serialize,~ + passes: passes.serialize, +** Processing line: ~ outputs: outputs.serialize,~ - Inside source: true *** True Line Result - outputs: outputs.serialize, -** Processing line: ~ grid: grid.serialize~ + outputs: outputs.serialize, +** Processing line: ~ grid: grid.serialize~ - Inside source: true *** True Line Result - grid: grid.serialize + grid: grid.serialize ** Processing line: ~ }~ - Inside source: true *** True Line Result @@ -141963,10 +148762,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def custom_assertion actual, expected, message = nil -** Processing line: ~ # this tell Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).~ +** Processing line: ~ # this tells Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).~ - Inside source: true *** True Line Result - # this tell Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive). + # this tells Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive). ** Processing line: ~ @assertion_performed = true~ - Inside source: true *** True Line Result @@ -141975,10 +148774,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # perform your custom logic here and rais an exception to denote a failure.~ +** Processing line: ~ # perform your custom logic here and raise an exception to denote a failure.~ - Inside source: true *** True Line Result - # perform your custom logic here and rais an exception to denote a failure. + # perform your custom logic here and raise an exception to denote a failure. ** Processing line: ~~ - Inside source: true *** True Line Result @@ -142015,10 +148814,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result =begin -** Processing line: ~ Us this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).~ +** Processing line: ~ Use this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).~ - Inside source: true *** True Line Result - Us this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive). + Use this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive). ** Processing line: ~ =end~ - Inside source: true *** True Line Result @@ -142043,10 +148842,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result =begin -** Processing line: ~ Assert if a value is a thruthy value. All assert method take an optional final parameter that is the message to display to the user.~ +** Processing line: ~ Assert if a value is a truthy value. All assert methods take an optional final parameter that is the message to display to the user.~ - Inside source: true *** True Line Result - Assert if a value is a thruthy value. All assert method take an optional final parameter that is the message to display to the user. + Assert if a value is a truthy value. All assert methods take an optional final parameter that is the message to display to the user. ** Processing line: ~~ - Inside source: true *** True Line Result @@ -142259,10 +149058,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip -** Processing line: ~ message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}.\n#{message}"~ +** Processing line: ~ message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}\n#{message}"~ - Inside source: true *** True Line Result - message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}.\n#{message}" + message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}\n#{message}" ** Processing line: ~ raise message~ - Inside source: true *** True Line Result @@ -142299,10 +149098,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip -** Processing line: ~ message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}.\n#{message}"~ +** Processing line: ~ message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}\n#{message}"~ - Inside source: true *** True Line Result - message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}.\n#{message}" + message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}\n#{message}" ** Processing line: ~ raise message~ - Inside source: true *** True Line Result @@ -142523,6 +149322,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def temp_state~ +- Inside source: true +*** True Line Result + def temp_state +** Processing line: ~ args.temp_state~ +- Inside source: true +*** True Line Result + args.temp_state +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def inputs~ - Inside source: true *** True Line Result @@ -142629,6 +149444,38 @@ Follows is a source code listing for all files that have been open sourced. This args.layout ** Processing line: ~ end~ - Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def new_entity entity_type, init_hash = nil, &block~ +- Inside source: true +*** True Line Result + def new_entity entity_type, init_hash = nil, &block +** Processing line: ~ args.state.new_entity entity_type, init_hash, &block~ +- Inside source: true +*** True Line Result + args.state.new_entity entity_type, init_hash, &block +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def new_entity_strict entity_type, init_hash = nil, &block~ +- Inside source: true +*** True Line Result + def new_entity_strict entity_type, init_hash = nil, &block +** Processing line: ~ args.state.new_entity_strict entity_type, init_hash, &block~ +- Inside source: true +*** True Line Result + args.state.new_entity_strict entity_type, init_hash, &block +** Processing line: ~ end~ +- Inside source: true *** True Line Result end ** Processing line: ~ end~ @@ -142819,10 +149666,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :flip_vertically, :angle_anchor_x, :angle_anchor_y, :id, -** Processing line: ~ :source_x, :source_y, :source_w, :source_h~ +** Processing line: ~ :source_x, :source_y, :source_w, :source_h, :blendmode_enum~ - Inside source: true *** True Line Result - :source_x, :source_y, :source_w, :source_h + :source_x, :source_y, :source_w, :source_h, :blendmode_enum ** Processing line: ~~ - Inside source: true *** True Line Result @@ -143003,10 +149850,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def initialize -** Processing line: ~ @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1, line_height: 1.1)~ +** Processing line: ~ @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)~ - Inside source: true *** True Line Result - @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1, line_height: 1.1) + @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1) ** Processing line: ~ @menu = Menu.new self~ - Inside source: true *** True Line Result @@ -143083,6 +149930,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @header_color = Color.new [100, 200, 220] +** Processing line: ~ @code_color = Color.new [210, 168, 255]~ +- Inside source: true +*** True Line Result + @code_color = Color.new [210, 168, 255] +** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ +- Inside source: true +*** True Line Result + @comment_color = Color.new [0, 200, 100] ** Processing line: ~ @animation_duration = 1.seconds~ - Inside source: true *** True Line Result @@ -144179,6 +151034,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result $gtk.request_quit +** Processing line: ~ elsif cmd.start_with? ':'~ +- Inside source: true +*** True Line Result + elsif cmd.start_with? ':' +** Processing line: ~ send ((cmd.gsub '-', '_').gsub ':', '')~ +- Inside source: true +*** True Line Result + send ((cmd.gsub '-', '_').gsub ':', '') ** Processing line: ~ else~ - Inside source: true *** True Line Result @@ -144211,6 +151074,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result elsif $results == :console_silent_eval +** Processing line: ~ # do nothing since the console is silent~ +- Inside source: true +*** True Line Result + # do nothing since the console is silent ** Processing line: ~ else~ - Inside source: true *** True Line Result @@ -144235,10 +151102,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result try_search_docs e -** Processing line: ~ puts "* EXCEPTION: #{e}"~ +** Processing line: ~ # if an exception is thrown and the bactrace includes something helpful, then show it~ +- Inside source: true +*** True Line Result + # if an exception is thrown and the bactrace includes something helpful, then show it +** Processing line: ~ if (e.backtrace || []).first && (e.backtrace.first.include? "(eval)")~ +- Inside source: true +*** True Line Result + if (e.backtrace || []).first && (e.backtrace.first.include? "(eval)") +** Processing line: ~ puts "* EXCEPTION: #{e}"~ +- Inside source: true +*** True Line Result + puts "* EXCEPTION: #{e}" +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ puts "* EXCEPTION: #{e}\n#{e.__backtrace_to_org__}"~ +- Inside source: true +*** True Line Result + puts "* EXCEPTION: #{e}\n#{e.__backtrace_to_org__}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - puts "* EXCEPTION: #{e}" + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -145143,6 +152030,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result render_log_offset args +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ args.outputs.reserved << { x: 10.from_right, y: @bottom + 10,~ +- Inside source: true +*** True Line Result + args.outputs.reserved << { x: 10.from_right, y: @bottom + 10, +** Processing line: ~ text: "Press CTRL+g or ESCAPE to clear the prompt.",~ +- Inside source: true +*** True Line Result + text: "Press CTRL+g or ESCAPE to clear the prompt.", +** Processing line: ~ vertical_alignment_enum: 0,~ +- Inside source: true +*** True Line Result + vertical_alignment_enum: 0, +** Processing line: ~ alignment_enum: 2, r: 80, g: 80, b: 80 }.label!~ +- Inside source: true +*** True Line Result + alignment_enum: 2, r: 80, g: 80, b: 80 }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -145231,10 +152138,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def include_subdued_markers? text -** Processing line: ~ include_any_words? text, subdued_markers~ +** Processing line: ~ (text.start_with? "* INFO: ") && (include_any_words? text, subdued_markers)~ - Inside source: true *** True Line Result - include_any_words? text, subdued_markers + (text.start_with? "* INFO: ") && (include_any_words? text, subdued_markers) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -145815,14 +152722,110 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def code? log_entry~ +- Inside source: true +*** True Line Result + def code? log_entry +** Processing line: ~ (just_symbol? log_entry) || (codeblock_marker? log_entry)~ +- Inside source: true +*** True Line Result + (just_symbol? log_entry) || (codeblock_marker? log_entry) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def just_symbol? log_entry~ +- Inside source: true +*** True Line Result + def just_symbol? log_entry +** Processing line: ~ scrubbed = log_entry.gsub("*", "").strip~ +- Inside source: true +*** True Line Result + scrubbed = log_entry.gsub("*", "").strip +** Processing line: ~ (scrubbed.start_with? ":") && (!scrubbed.include? " ") && (!scrubbed.include? "=>")~ +- Inside source: true +*** True Line Result + (scrubbed.start_with? ":") && (!scrubbed.include? " ") && (!scrubbed.include? "=>") +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def code_comment? log_entry~ +- Inside source: true +*** True Line Result + def code_comment? log_entry +** Processing line: ~ return true if log_entry.strip.start_with?("# ")~ +- Inside source: true +*** True Line Result + return true if log_entry.strip.start_with?("# ") +** Processing line: ~ return false~ +- Inside source: true +*** True Line Result + return false +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def codeblock_marker? log_entry~ +- Inside source: true +*** True Line Result + def codeblock_marker? log_entry +** Processing line: ~ return true if log_entry.strip.start_with?("#+begin_src")~ +- Inside source: true +*** True Line Result + return true if log_entry.strip.start_with?("#+begin_src") +** Processing line: ~ return true if log_entry.strip.start_with?("#+end_src")~ +- Inside source: true +*** True Line Result + return true if log_entry.strip.start_with?("#+end_src") +** Processing line: ~ return false~ +- Inside source: true +*** True Line Result + return false +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def color_for_log_entry(log_entry)~ - Inside source: true *** True Line Result def color_for_log_entry(log_entry) -** Processing line: ~ if include_row_marker? log_entry~ +** Processing line: ~ if code? log_entry~ - Inside source: true *** True Line Result - if include_row_marker? log_entry + if code? log_entry +** Processing line: ~ @code_color~ +- Inside source: true +*** True Line Result + @code_color +** Processing line: ~ elsif code_comment? log_entry~ +- Inside source: true +*** True Line Result + elsif code_comment? log_entry +** Processing line: ~ @comment_color~ +- Inside source: true +*** True Line Result + @comment_color +** Processing line: ~ elsif include_row_marker? log_entry~ +- Inside source: true +*** True Line Result + elsif include_row_marker? log_entry ** Processing line: ~ @text_color~ - Inside source: true *** True Line Result @@ -146123,6 +153126,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def to_s~ +- Inside source: true +*** True Line Result + def to_s +** Processing line: ~ "GTK::Console::Color #{to_h}"~ +- Inside source: true +*** True Line Result + "GTK::Console::Color #{to_h}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def to_h~ - Inside source: true *** True Line Result @@ -146315,10 +153334,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result **color.to_h, -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ - Inside source: true *** True Line Result - }.label + }.label! ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146575,10 +153594,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @console.scroll_to_bottom -** Processing line: ~ $wizards.itch.start~ +** Processing line: ~ $wizards.itch.restart~ - Inside source: true *** True Line Result - $wizards.itch.start + $wizards.itch.restart ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146675,6 +153694,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result (button id: :replay, row: 0, col: 10, text: "start replay", method: :replay_clicked), +** Processing line: ~ *custom_buttons~ +- Inside source: true +*** True Line Result + *custom_buttons ** Processing line: ~ ]~ - Inside source: true *** True Line Result @@ -146907,14 +153930,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result primitives = [] -** Processing line: ~ primitives << entity[:rect].merge(a: 164).solid~ +** Processing line: ~ primitives << entity[:rect].solid!(a: 164)~ - Inside source: true *** True Line Result - primitives << entity[:rect].merge(a: 164).solid -** Processing line: ~ primitives << entity[:rect].merge(r: 255, g: 255, b: 255).border~ + primitives << entity[:rect].solid!(a: 164) +** Processing line: ~ primitives << entity[:rect].border!(r: 255, g: 255, b: 255)~ - Inside source: true *** True Line Result - primitives << entity[:rect].merge(r: 255, g: 255, b: 255).border + primitives << entity[:rect].border!(r: 255, g: 255, b: 255) ** Processing line: ~ primitives << text.wrapped_lines(5)~ - Inside source: true *** True Line Result @@ -147731,10 +154754,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # remove seperators between empty values~ +** Processing line: ~ # remove separators between empty values~ - Inside source: true *** True Line Result - # remove seperators between empty values + # remove separators between empty values ** Processing line: ~ formated_row = formated_row.gsub(" | ", " ")~ - Inside source: true *** True Line Result @@ -147755,10 +154778,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ def pretty_print_row_separator string_width, cell_width, column_width, columns~ - Inside source: true *** True Line Result - def pretty_print_row_seperator string_width, cell_width, column_width, columns + def pretty_print_row_separator string_width, cell_width, column_width, columns ** Processing line: ~ # this is a joint: +--------~ - Inside source: true *** True Line Result @@ -147771,10 +154794,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # multiple joints create a row seperator: +----+----+~ +** Processing line: ~ # multiple joints create a row separator: +----+----+~ - Inside source: true *** True Line Result - # multiple joints create a row seperator: +----+----+ + # multiple joints create a row separator: +----+----+ ** Processing line: ~ puts (column_joint * columns) + "+"~ - Inside source: true *** True Line Result @@ -147807,10 +154830,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result x2: x + @cursor_position_px + 0.5, -** Processing line: ~ y2: y + @font_style.letter_size.y + 5)~ +** Processing line: ~ y2: y + @font_style.letter_size.y + 4)~ - Inside source: true *** True Line Result - y2: y + @font_style.letter_size.y + 5) + y2: y + @font_style.letter_size.y + 4) ** Processing line: ~~ - Inside source: true *** True Line Result @@ -147827,10 +154850,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result x2: x + @cursor_position_px + 1, -** Processing line: ~ y2: y + @font_style.letter_size.y + 5)~ +** Processing line: ~ y2: y + @font_style.letter_size.y + 4)~ - Inside source: true *** True Line Result - y2: y + @font_style.letter_size.y + 5) + y2: y + @font_style.letter_size.y + 4) ** Processing line: ~~ - Inside source: true *** True Line Result @@ -150351,10 +157374,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :l3, :r3, -** Processing line: ~ :start, :select,~ +** Processing line: ~ :start, :select, :home,~ - Inside source: true *** True Line Result - :start, :select, + :start, :select, :home, ** Processing line: ~ :directional_up, :directional_down, :directional_left, :directional_right~ - Inside source: true *** True Line Result @@ -150383,6 +157406,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def back~ +- Inside source: true +*** True Line Result + def back +** Processing line: ~ @select~ +- Inside source: true +*** True Line Result + @select +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def back= value~ +- Inside source: true +*** True Line Result + def back= value +** Processing line: ~ @select = value~ +- Inside source: true +*** True Line Result + @select = value +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def guide~ +- Inside source: true +*** True Line Result + def guide +** Processing line: ~ @home~ +- Inside source: true +*** True Line Result + @home +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def guide= value~ +- Inside source: true +*** True Line Result + def guide= value +** Processing line: ~ @home = value~ +- Inside source: true +*** True Line Result + @home = value +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ # Activate a key.~ - Inside source: true *** True Line Result @@ -150579,10 +157666,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result * ERROR -** Processing line: ~ The GTK::DirectionalKeys module should only be included in objects that respond to the following api heirarchy:~ +** Processing line: ~ The GTK::DirectionalKeys module should only be included in objects that respond to the following api hierarchy:~ - Inside source: true *** True Line Result - The GTK::DirectionalKeys module should only be included in objects that respond to the following api heirarchy: + The GTK::DirectionalKeys module should only be included in objects that respond to the following api hierarchy: ** Processing line: ~~ - Inside source: true *** True Line Result @@ -150807,6 +157894,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def directional_angle~ +- Inside source: true +*** True Line Result + def directional_angle +** Processing line: ~ return nil unless directional_vector~ +- Inside source: true +*** True Line Result + return nil unless directional_vector +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ Math.atan2(up_down, left_right).to_degrees~ +- Inside source: true +*** True Line Result + Math.atan2(up_down, left_right).to_degrees +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def method_missing m, *args~ - Inside source: true *** True Line Result @@ -151747,6 +158858,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result module Geometry +** Processing line: ~ def self.rotate_point point, angle, around = nil~ +- Inside source: true +*** True Line Result + def self.rotate_point point, angle, around = nil +** Processing line: ~ s = Math.sin a.to_radians~ +- Inside source: true +*** True Line Result + s = Math.sin a.to_radians +** Processing line: ~ c = Math.cos a.to_radians~ +- Inside source: true +*** True Line Result + c = Math.cos a.to_radians +** Processing line: ~ px = point.x~ +- Inside source: true +*** True Line Result + px = point.x +** Processing line: ~ py = point.y~ +- Inside source: true +*** True Line Result + py = point.y +** Processing line: ~ cx = 0~ +- Inside source: true +*** True Line Result + cx = 0 +** Processing line: ~ cy = 0~ +- Inside source: true +*** True Line Result + cy = 0 +** Processing line: ~ if around~ +- Inside source: true +*** True Line Result + if around +** Processing line: ~ cx = around.x~ +- Inside source: true +*** True Line Result + cx = around.x +** Processing line: ~ cy = around.y~ +- Inside source: true +*** True Line Result + cy = around.y +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ point.merge(x: ((px - cx) * c - (py - cy) * s) + cx,~ +- Inside source: true +*** True Line Result + point.merge(x: ((px - cx) * c - (py - cy) * s) + cx, +** Processing line: ~ y: ((px - cx) * s + (py - cy) * c) + cy)~ +- Inside source: true +*** True Line Result + y: ((px - cx) * s + (py - cy) * c) + cy) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ # Returns f(t) for a cubic Bezier curve.~ - Inside source: true *** True Line Result @@ -152071,10 +159246,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result * ERROR: -** Processing line: ~ center_inside_rect for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect for self #{self} and other_rect #{other_rect}.\n#{e}.~ - Inside source: true *** True Line Result - center_inside_rect for self #{self} and other_rect #{other_rect}. Failed with exception #{e}. + center_inside_rect for self #{self} and other_rect #{other_rect}.\n#{e}. ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -152139,10 +159314,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result * ERROR: -** Processing line: ~ center_inside_rect_x for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect_x for self #{self} and other_rect #{other_rect}.\n#{e}.~ - Inside source: true *** True Line Result - center_inside_rect_x for self #{self} and other_rect #{other_rect}. Failed with exception #{e}. + center_inside_rect_x for self #{self} and other_rect #{other_rect}.\n#{e}. ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -152207,10 +159382,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result * ERROR: -** Processing line: ~ center_inside_rect_y for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect_y for self #{self} and other_rect #{other_rect}.\n#{e}.~ - Inside source: true *** True Line Result - center_inside_rect_y for self #{self} and other_rect #{other_rect}. Failed with exception #{e}. + center_inside_rect_y for self #{self} and other_rect #{other_rect}.\n#{e}. ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -152243,10 +159418,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns a primitive that is anchored/repositioned based off its retangle.~ +** Processing line: ~ # Returns a primitive that is anchored/repositioned based off its rectangle.~ - Inside source: true *** True Line Result - # Returns a primitive that is anchored/repositioned based off its retangle. + # Returns a primitive that is anchored/repositioned based off its rectangle. ** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result @@ -152787,22 +159962,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def self.intersect_rect? rect_one, rect_two, tolerance = 0.1 -** Processing line: ~ return false if rect_one.right - tolerance < rect_two.left + tolerance~ +** Processing line: ~ return false if ((rect_one.x + rect_one.w) - tolerance) < (rect_two.x + tolerance)~ - Inside source: true *** True Line Result - return false if rect_one.right - tolerance < rect_two.left + tolerance -** Processing line: ~ return false if rect_one.left + tolerance > rect_two.right - tolerance~ + return false if ((rect_one.x + rect_one.w) - tolerance) < (rect_two.x + tolerance) +** Processing line: ~ return false if (rect_one.x + tolerance) > ((rect_two.x + rect_two.w) - tolerance)~ - Inside source: true *** True Line Result - return false if rect_one.left + tolerance > rect_two.right - tolerance -** Processing line: ~ return false if rect_one.top - tolerance < rect_two.bottom + tolerance~ + return false if (rect_one.x + tolerance) > ((rect_two.x + rect_two.w) - tolerance) +** Processing line: ~ return false if ((rect_one.y + rect_one.h) - tolerance) < (rect_two.y + tolerance)~ - Inside source: true *** True Line Result - return false if rect_one.top - tolerance < rect_two.bottom + tolerance -** Processing line: ~ return false if rect_one.bottom + tolerance > rect_two.top - tolerance~ + return false if ((rect_one.y + rect_one.h) - tolerance) < (rect_two.y + tolerance) +** Processing line: ~ return false if (rect_one.y + tolerance) > ((rect_two.y + rect_two.h) - tolerance)~ - Inside source: true *** True Line Result - return false if rect_one.bottom + tolerance > rect_two.top - tolerance + return false if (rect_one.y + tolerance) > ((rect_two.y + rect_two.h) - tolerance) ** Processing line: ~ return true~ - Inside source: true *** True Line Result @@ -152911,6 +160086,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result #{context_help} +** Processing line: ~ \n#{e}~ +- Inside source: true +*** True Line Result + \n#{e} ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -152951,10 +160130,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}."~ +** Processing line: ~ raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}." + raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -152979,10 +160158,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}."~ +** Processing line: ~ raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}." + raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153015,10 +160194,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}."~ +** Processing line: ~ raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}." + raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153043,10 +160222,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}."~ +** Processing line: ~ raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}." + raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153071,10 +160250,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}"~ +** Processing line: ~ raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}" + raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153091,30 +160270,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def self.inside_rect? inner_rect, outer_rect, tolerance = 0.0 +** Processing line: ~ return nil if !inner_rect~ +- Inside source: true +*** True Line Result + return nil if !inner_rect +** Processing line: ~ return nil if !outer_rect~ +- Inside source: true +*** True Line Result + return nil if !outer_rect +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ inner_rect.x + tolerance >= outer_rect.x - tolerance &&~ - Inside source: true *** True Line Result inner_rect.x + tolerance >= outer_rect.x - tolerance && -** Processing line: ~ inner_rect.right - tolerance <= outer_rect.right + tolerance &&~ +** Processing line: ~ (inner_rect.x + inner_rect.w) - tolerance <= (outer_rect.x + outer_rect.w) + tolerance &&~ - Inside source: true *** True Line Result - inner_rect.right - tolerance <= outer_rect.right + tolerance && + (inner_rect.x + inner_rect.w) - tolerance <= (outer_rect.x + outer_rect.w) + tolerance && ** Processing line: ~ inner_rect.y + tolerance >= outer_rect.y - tolerance &&~ - Inside source: true *** True Line Result inner_rect.y + tolerance >= outer_rect.y - tolerance && -** Processing line: ~ inner_rect.top - tolerance <= outer_rect.top + tolerance~ +** Processing line: ~ (inner_rect.y + inner_rect.h) - tolerance <= (outer_rect.y + outer_rect.h) + tolerance~ - Inside source: true *** True Line Result - inner_rect.top - tolerance <= outer_rect.top + tolerance + (inner_rect.y + inner_rect.h) - tolerance <= (outer_rect.y + outer_rect.h) + tolerance ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}."~ +** Processing line: ~ raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}." + raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153251,10 +160442,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}."~ +** Processing line: ~ raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}." + raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -153307,10 +160498,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result rescue Exception => e -** Processing line: ~ raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)]."~ +** Processing line: ~ raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)].\n#{e}"~ - Inside source: true *** True Line Result - raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)]." + raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)].\n#{e}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def self.rect_to_line rect~ +- Inside source: true +*** True Line Result + def self.rect_to_line rect +** Processing line: ~ l = rect.to_hash.line~ +- Inside source: true +*** True Line Result + l = rect.to_hash.line +** Processing line: ~ l.merge(x2: l.x + l.w - 1,~ +- Inside source: true +*** True Line Result + l.merge(x2: l.x + l.w - 1, +** Processing line: ~ y2: l.y + l.h)~ +- Inside source: true +*** True Line Result + y2: l.y + l.h) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def self.rect_center_point rect~ +- Inside source: true +*** True Line Result + def self.rect_center_point rect +** Processing line: ~ { x: rect.x + rect.w.half, y: rect.y + rect.h.half }~ +- Inside source: true +*** True Line Result + { x: rect.x + rect.w.half, y: rect.y + rect.h.half } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def rect_center_point~ +- Inside source: true +*** True Line Result + def rect_center_point +** Processing line: ~ Geometry.rect_center_point self~ +- Inside source: true +*** True Line Result + Geometry.rect_center_point self ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -154097,6 +161344,38 @@ Follows is a source code listing for all files that have been open sourced. This [@right, @bottom].point ** Processing line: ~ end~ - Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def x~ +- Inside source: true +*** True Line Result + def x +** Processing line: ~ 0~ +- Inside source: true +*** True Line Result + 0 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def y~ +- Inside source: true +*** True Line Result + def y +** Processing line: ~ 0~ +- Inside source: true +*** True Line Result + 0 +** Processing line: ~ end~ +- Inside source: true *** True Line Result end ** Processing line: ~ end~ @@ -154907,6 +162186,102 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def self.method_to_key_hash~ +- Inside source: true +*** True Line Result + def self.method_to_key_hash +** Processing line: ~ return @method_to_key_hash if @method_to_key_hash~ +- Inside source: true +*** True Line Result + return @method_to_key_hash if @method_to_key_hash +** Processing line: ~ @method_to_key_hash = {}~ +- Inside source: true +*** True Line Result + @method_to_key_hash = {} +** Processing line: ~ string_representation_overrides ||= {~ +- Inside source: true +*** True Line Result + string_representation_overrides ||= { +** Processing line: ~ backspace: '\b'~ +- Inside source: true +*** True Line Result + backspace: '\b' +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ char_to_method_hash.each do |k, v|~ +- Inside source: true +*** True Line Result + char_to_method_hash.each do |k, v| +** Processing line: ~ v.each do |vi|~ +- Inside source: true +*** True Line Result + v.each do |vi| +** Processing line: ~ t = { char_or_raw_key: k }~ +- Inside source: true +*** True Line Result + t = { char_or_raw_key: k } +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if k.is_a? Numeric~ +- Inside source: true +*** True Line Result + if k.is_a? Numeric +** Processing line: ~ t[:raw_key] = k~ +- Inside source: true +*** True Line Result + t[:raw_key] = k +** Processing line: ~ t[:string_representation] = "raw_key == #{k}"~ +- Inside source: true +*** True Line Result + t[:string_representation] = "raw_key == #{k}" +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ t[:char] = k~ +- Inside source: true +*** True Line Result + t[:char] = k +** Processing line: ~ t[:string_representation] = "\"#{k.strip}\""~ +- Inside source: true +*** True Line Result + t[:string_representation] = "\"#{k.strip}\"" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ @method_to_key_hash[vi] = t~ +- Inside source: true +*** True Line Result + @method_to_key_hash[vi] = t +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ @method_to_key_hash~ +- Inside source: true +*** True Line Result + @method_to_key_hash +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def self.char_to_method char, int = nil~ - Inside source: true *** True Line Result @@ -155363,46 +162738,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def method_missing m, *args -** Processing line: ~ begin~ +** Processing line: ~ if KeyboardKeys.method_to_key_hash[m.without_ending_bang]~ - Inside source: true *** True Line Result - begin -** Processing line: ~ define_singleton_method(m) do~ + if KeyboardKeys.method_to_key_hash[m.without_ending_bang] +** Processing line: ~ begin~ - Inside source: true *** True Line Result - define_singleton_method(m) do -** Processing line: ~ r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)~ + begin +** Processing line: ~ define_singleton_method(m) do~ - Inside source: true *** True Line Result - r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym) -** Processing line: ~ clear_key m~ + define_singleton_method(m) do +** Processing line: ~ r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)~ - Inside source: true *** True Line Result - clear_key m -** Processing line: ~ return r~ + r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym) +** Processing line: ~ clear_key m~ - Inside source: true *** True Line Result - return r -** Processing line: ~ end~ + clear_key m +** Processing line: ~ return r~ - Inside source: true *** True Line Result - end + return r +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ return self.send m~ +** Processing line: ~ return self.send m~ - Inside source: true *** True Line Result - return self.send m -** Processing line: ~ rescue Exception => e~ + return self.send m +** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ log_important "#{e}"~ + rescue Exception => e +** Processing line: ~ log_important "#{e}"~ - Inside source: true *** True Line Result - log_important "#{e}" + log_important "#{e}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -155411,6 +162794,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ did_you_mean = KeyboardKeys.method_to_key_hash.find_all do |k, v|~ +- Inside source: true +*** True Line Result + did_you_mean = KeyboardKeys.method_to_key_hash.find_all do |k, v| +** Processing line: ~ k.to_s[0..1] == m.to_s[0..1]~ +- Inside source: true +*** True Line Result + k.to_s[0..1] == m.to_s[0..1] +** Processing line: ~ end.map {|k, v| ":#{k} (#{v[:string_representation]})" }~ +- Inside source: true +*** True Line Result + end.map {|k, v| ":#{k} (#{v[:string_representation]})" } +** Processing line: ~ did_you_mean_string = ""~ +- Inside source: true +*** True Line Result + did_you_mean_string = "" +** Processing line: ~ did_you_mean_string = ". Did you mean #{did_you_mean.join ", "}?"~ +- Inside source: true +*** True Line Result + did_you_mean_string = ". Did you mean #{did_you_mean.join ", "}?" +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ raise <<-S~ - Inside source: true *** True Line Result @@ -155419,22 +162826,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result * ERROR: -** Processing line: ~ There is no member on the keyboard called #{m}. Here is a to_s representation of what's available:~ +** Processing line: ~ #{KeyboardKeys.method_to_key_hash.map { |k, v| "** :#{k} #{v.string_representation}" }.join("\n")}~ - Inside source: true *** True Line Result - There is no member on the keyboard called #{m}. Here is a to_s representation of what's available: + #{KeyboardKeys.method_to_key_hash.map { |k, v| "** :#{k} #{v.string_representation}" }.join("\n")} ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #{KeyboardKeys.char_to_method_hash.map { |k, v| "[#{k} => #{v.join(",")}]" }.join(" ")}~ +** Processing line: ~ There is no key on the keyboard called :#{m}#{did_you_mean_string}.~ - Inside source: true *** True Line Result - #{KeyboardKeys.char_to_method_hash.map { |k, v| "[#{k} => #{v.join(",")}]" }.join(" ")} -** Processing line: ~~ + There is no key on the keyboard called :#{m}#{did_you_mean_string}. +** Processing line: ~ Full list of available keys =:points_up:=.~ - Inside source: true *** True Line Result - + Full list of available keys =:points_up:=. ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -156967,6 +164374,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def directional_angle~ +- Inside source: true +*** True Line Result + def directional_angle +** Processing line: ~ keyboard.directional_angle || (controller_one && controller_one.directional_angle)~ +- Inside source: true +*** True Line Result + keyboard.directional_angle || (controller_one && controller_one.directional_angle) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ # Returns a signal indicating right (`1`), left (`-1`), or neither ('0').~ - Inside source: true *** True Line Result @@ -157255,6 +164678,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~ +- Inside source: true +*** True Line Result + # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński ** Processing line: ~ # Copyright 2019 DragonRuby LLC~ - Inside source: true *** True Line Result @@ -157271,42 +164698,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ class WizardException < Exception~ -- Inside source: true -*** True Line Result - class WizardException < Exception -** Processing line: ~ attr_accessor :console_primitives~ -- Inside source: true -*** True Line Result - attr_accessor :console_primitives -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def initialize *console_primitives~ -- Inside source: true -*** True Line Result - def initialize *console_primitives -** Processing line: ~ @console_primitives = console_primitives~ -- Inside source: true -*** True Line Result - @console_primitives = console_primitives -** 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: ~ class IOSWizard~ +** Processing line: ~ class IOSWizard < Wizard~ - Inside source: true *** True Line Result - class IOSWizard + class IOSWizard < Wizard ** Processing line: ~ def initialize~ - Inside source: true *** True Line Result @@ -157355,10 +164750,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def steps_development_build~ +** Processing line: ~ def prerequisite_steps~ - Inside source: true *** True Line Result - def steps_development_build + def prerequisite_steps ** Processing line: ~ [~ - Inside source: true *** True Line Result @@ -157375,14 +164770,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :check_for_certs, -** Processing line: ~ :check_for_device,~ +** Processing line: ~ ]~ - Inside source: true *** True Line Result - :check_for_device, -** Processing line: ~ :check_for_dev_profile,~ + ] +** Processing line: ~ end~ - Inside source: true *** True Line Result - :check_for_dev_profile, + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def app_metadata_retrieval_steps~ +- Inside source: true +*** True Line Result + def app_metadata_retrieval_steps +** Processing line: ~ [~ +- Inside source: true +*** True Line Result + [ ** Processing line: ~ :determine_team_identifier,~ - Inside source: true *** True Line Result @@ -157395,18 +164802,74 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :determine_app_id, -** Processing line: ~ :blow_away_temp,~ +** Processing line: ~ ]~ +- Inside source: true +*** True Line Result + ] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def steps_development_build~ +- Inside source: true +*** True Line Result + def steps_development_build +** Processing line: ~ [~ +- Inside source: true +*** True Line Result + [ +** Processing line: ~ *prerequisite_steps,~ +- Inside source: true +*** True Line Result + *prerequisite_steps, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :check_for_device,~ - Inside source: true *** True Line Result - :blow_away_temp, + :check_for_device, +** Processing line: ~ :check_for_dev_profile,~ +- Inside source: true +*** True Line Result + :check_for_dev_profile, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ *app_metadata_retrieval_steps,~ +- Inside source: true +*** True Line Result + *app_metadata_retrieval_steps, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :clear_tmp_directory,~ +- Inside source: true +*** True Line Result + :clear_tmp_directory, ** Processing line: ~ :stage_app,~ - Inside source: true *** True Line Result :stage_app, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :development_write_info_plist,~ - Inside source: true *** True Line Result :development_write_info_plist, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :write_entitlements_plist,~ - Inside source: true *** True Line Result @@ -157415,14 +164878,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :compile_icons, -** Processing line: ~ :create_payload_directory,~ +** Processing line: ~ :clear_payload_directory,~ +- Inside source: true +*** True Line Result + :clear_payload_directory, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :create_payload_directory_dev,~ +- Inside source: true +*** True Line Result + :create_payload_directory_dev, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :create_payload,~ - Inside source: true *** True Line Result - :create_payload_directory, + :create_payload, ** Processing line: ~ :code_sign_payload,~ - Inside source: true *** True Line Result :code_sign_payload, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :create_ipa,~ - Inside source: true *** True Line Result @@ -157451,46 +164934,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [ -** Processing line: ~ :check_for_xcode,~ -- Inside source: true -*** True Line Result - :check_for_xcode, -** Processing line: ~ :check_for_brew,~ +** Processing line: ~ *prerequisite_steps,~ - Inside source: true *** True Line Result - :check_for_brew, -** Processing line: ~ :check_for_certs,~ + *prerequisite_steps, +** Processing line: ~~ - Inside source: true *** True Line Result - :check_for_certs, + ** Processing line: ~ :check_for_distribution_profile,~ - Inside source: true *** True Line Result :check_for_distribution_profile, -** Processing line: ~ :determine_team_identifier,~ +** Processing line: ~ :determine_app_version,~ - Inside source: true *** True Line Result - :determine_team_identifier, -** Processing line: ~ :determine_app_name,~ + :determine_app_version, +** Processing line: ~~ - Inside source: true *** True Line Result - :determine_app_name, -** Processing line: ~ :determine_app_id,~ + +** Processing line: ~ *app_metadata_retrieval_steps,~ - Inside source: true *** True Line Result - :determine_app_id, -** Processing line: ~ :blow_away_temp,~ + *app_metadata_retrieval_steps, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :clear_tmp_directory,~ - Inside source: true *** True Line Result - :blow_away_temp, + :clear_tmp_directory, ** Processing line: ~ :stage_app,~ - Inside source: true *** True Line Result :stage_app, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :production_write_info_plist,~ - Inside source: true *** True Line Result :production_write_info_plist, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :write_entitlements_plist,~ - Inside source: true *** True Line Result @@ -157499,14 +164990,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :compile_icons, -** Processing line: ~ :create_payload_directory,~ +** Processing line: ~ :clear_payload_directory,~ +- Inside source: true +*** True Line Result + :clear_payload_directory, +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ :create_payload_directory_prod,~ +- Inside source: true +*** True Line Result + :create_payload_directory_prod, +** Processing line: ~~ - Inside source: true *** True Line Result - :create_payload_directory, + +** Processing line: ~ :create_payload,~ +- Inside source: true +*** True Line Result + :create_payload, ** Processing line: ~ :code_sign_payload,~ - Inside source: true *** True Line Result :code_sign_payload, +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :create_ipa,~ - Inside source: true *** True Line Result @@ -157647,6 +165158,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @certificate_name = nil +** Processing line: ~ @app_version = opts[:version]~ +- Inside source: true +*** True Line Result + @app_version = opts[:version] +** Processing line: ~ @app_version = "1.0" if @opts[:env] == :dev && !@app_version~ +- Inside source: true +*** True Line Result + @app_version = "1.0" if @opts[:env] == :dev && !@app_version ** Processing line: ~ init_wizard_status~ - Inside source: true *** True Line Result @@ -157731,6 +165250,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log_error e.to_s +** Processing line: ~ log e.__backtrace_to_org__~ +- Inside source: true +*** True Line Result + log e.__backtrace_to_org__ ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -157739,6 +165262,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ init_wizard_status~ +- Inside source: true +*** True Line Result + init_wizard_status ** Processing line: ~ $console.set_command "$wizards.ios.start env: :#{@opts[:env]}"~ - Inside source: true *** True Line Result @@ -158163,38 +165690,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 determine_team_identifier~ +** Processing line: ~ def ios_metadata_template~ - Inside source: true *** True Line Result - def determine_team_identifier -** Processing line: ~ @team_name = (team_identifier_from_provisioning_profile @opts[:env])~ + def ios_metadata_template +** Processing line: ~ <<-S~ - Inside source: true *** True Line Result - @team_name = (team_identifier_from_provisioning_profile @opts[:env]) -** Processing line: ~ log_info "Team Identifer is: #{@team_name}"~ + <<-S +** Processing line: ~ # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~ - Inside source: true *** True Line Result - log_info "Team Identifer is: #{@team_name}" -** Processing line: ~ end~ + # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps. +** Processing line: ~ # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~ - Inside source: true *** True Line Result - end + # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def determine_app_name~ +** Processing line: ~ # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~ - Inside source: true *** True Line Result - def determine_app_name -** Processing line: ~ @app_name = (provisioning_profile_xml @opts[:env])[:children].first[:children].first[:children][1][:children].first[:data]~ + # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/ +** Processing line: ~ teamid=~ - Inside source: true *** True Line Result - @app_name = (provisioning_profile_xml @opts[:env])[:children].first[:children].first[:children][1][:children].first[:data] -** Processing line: ~ log_info "App name is: #{@app_name}."~ + teamid= +** Processing line: ~ # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~ - Inside source: true *** True Line Result - log_info "App name is: #{@app_name}." + # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list +** Processing line: ~ appid=~ +- Inside source: true +*** True Line Result + appid= +** Processing line: ~ # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~ +- Inside source: true +*** True Line Result + # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters. +** Processing line: ~ appname=~ +- Inside source: true +*** True Line Result + appname= +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -158203,134 +165746,146 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def provisioning_profile_xml environment~ +** Processing line: ~ def ios_metadata~ - Inside source: true *** True Line Result - def provisioning_profile_xml environment -** Processing line: ~ xml = $gtk.read_file (provisioning_profile_path environment)~ + def ios_metadata +** Processing line: ~ contents = $gtk.read_file 'metadata/ios_metadata.txt'~ - Inside source: true *** True Line Result - xml = $gtk.read_file (provisioning_profile_path environment) -** Processing line: ~ scrubbed = xml.each_line.map do |l|~ + contents = $gtk.read_file 'metadata/ios_metadata.txt' +** Processing line: ~~ - Inside source: true *** True Line Result - scrubbed = xml.each_line.map do |l| -** Processing line: ~ if l.strip.start_with? "<"~ + +** Processing line: ~ if !contents~ - Inside source: true *** True Line Result - if l.strip.start_with? "<" -** Processing line: ~ if l.start_with? ''~ + if !contents +** Processing line: ~ $gtk.write_file 'metadata/ios_metadata.txt', ios_metadata_template~ - Inside source: true *** True Line Result - if l.start_with? '' -** Processing line: ~ ''~ + $gtk.write_file 'metadata/ios_metadata.txt', ios_metadata_template +** Processing line: ~ contents = $gtk.read_file 'metadata/ios_metadata.txt'~ - Inside source: true *** True Line Result - '' -** Processing line: ~ elsif l.include? "Apple Inc."~ + contents = $gtk.read_file 'metadata/ios_metadata.txt' +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif l.include? "Apple Inc." -** Processing line: ~ nil~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - nil -** Processing line: ~ elsif l.include? ''~ + +** Processing line: ~ kvps = contents.each_line~ - Inside source: true *** True Line Result - elsif l.include? '' -** Processing line: ~ nil~ + kvps = contents.each_line +** Processing line: ~ .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }~ - Inside source: true *** True Line Result - nil -** Processing line: ~ else~ + .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") } +** Processing line: ~ .map do |l|~ - Inside source: true *** True Line Result - else -** Processing line: ~ l~ + .map do |l| +** Processing line: ~ key, value = l.split("=")~ - Inside source: true *** True Line Result - l -** Processing line: ~ end~ + key, value = l.split("=") +** Processing line: ~ [key.strip.to_sym, value.strip]~ - Inside source: true *** True Line Result - end -** Processing line: ~ else~ + [key.strip.to_sym, value.strip] +** Processing line: ~ end.flatten~ - Inside source: true *** True Line Result - else -** Processing line: ~ nil~ + end.flatten +** Processing line: ~ Hash[*kvps]~ - Inside source: true *** True Line Result - nil -** Processing line: ~ end~ + Hash[*kvps] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end -** Processing line: ~ end.reject { |l| !l }.join~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end.reject { |l| !l }.join -** Processing line: ~ $gtk.parse_xml scrubbed~ + +** Processing line: ~ def game_metadata~ - Inside source: true *** True Line Result - $gtk.parse_xml scrubbed -** Processing line: ~ end~ + def game_metadata +** Processing line: ~ contents = $gtk.read_file 'metadata/game_metadata.txt'~ - Inside source: true *** True Line Result - end + contents = $gtk.read_file 'metadata/game_metadata.txt' ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def app_id_from_provisioning_profile environment~ +** Processing line: ~ kvps = contents.each_line~ - Inside source: true *** True Line Result - def app_id_from_provisioning_profile environment -** Processing line: ~ application_identifier_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]~ + kvps = contents.each_line +** Processing line: ~ .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }~ - Inside source: true *** True Line Result - application_identifier_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data] -** Processing line: ~ (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|~ + .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") } +** Processing line: ~ .map do |l|~ - Inside source: true *** True Line Result - (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i| -** Processing line: ~ if node[:children] && node[:children][0] && node[:children][0][:data] == "application-identifier"~ + .map do |l| +** Processing line: ~ key, value = l.split("=")~ - Inside source: true *** True Line Result - if node[:children] && node[:children][0] && node[:children][0][:data] == "application-identifier" -** Processing line: ~ application_identifier_index = i~ + key, value = l.split("=") +** Processing line: ~ [key.strip.to_sym, value.strip]~ - Inside source: true *** True Line Result - application_identifier_index = i -** Processing line: ~ break~ + [key.strip.to_sym, value.strip] +** Processing line: ~ end.flatten~ - Inside source: true *** True Line Result - break -** Processing line: ~ end~ + end.flatten +** Processing line: ~ Hash[*kvps]~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + Hash[*kvps] +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ app_id_with_team_identifier = (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][application_identifier_index + 1][:children].first[:data]~ +** Processing line: ~ def raise_ios_metadata_required~ +- Inside source: true +*** True Line Result + def raise_ios_metadata_required +** Processing line: ~ raise WizardException.new(~ +- Inside source: true +*** True Line Result + raise WizardException.new( +** Processing line: ~ "* mygame/metadata/ios_metadata.txt needs to be filled out.",~ +- Inside source: true +*** True Line Result + "* mygame/metadata/ios_metadata.txt needs to be filled out.", +** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",~ - Inside source: true *** True Line Result - app_id_with_team_identifier = (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][application_identifier_index + 1][:children].first[:data] -** Processing line: ~ team_identifer = team_identifier_from_provisioning_profile environment~ + "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.", +** Processing line: ~ "Instructions for where the values should come from are within metadata/ios_metadata.txt."~ - Inside source: true *** True Line Result - team_identifer = team_identifier_from_provisioning_profile environment -** Processing line: ~ app_id_with_team_identifier.gsub "#{team_identifer}.", ""~ + "Instructions for where the values should come from are within metadata/ios_metadata.txt." +** Processing line: ~ )~ - Inside source: true *** True Line Result - app_id_with_team_identifier.gsub "#{team_identifer}.", "" + ) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -158339,50 +165894,126 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def team_identifier_from_provisioning_profile environment~ +** Processing line: ~ def determine_team_identifier~ - Inside source: true *** True Line Result - def team_identifier_from_provisioning_profile environment -** Processing line: ~ team_identifer_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]~ + def determine_team_identifier +** Processing line: ~ @team_id = (ios_metadata.teamid || "")~ - Inside source: true *** True Line Result - team_identifer_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data] -** Processing line: ~~ + @team_id = (ios_metadata.teamid || "") +** Processing line: ~ raise_ios_metadata_required if @team_id.strip.length == 0~ - Inside source: true *** True Line Result - -** Processing line: ~ (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|~ + raise_ios_metadata_required if @team_id.strip.length == 0 +** Processing line: ~ log_info "Team Identifer is: #{@team_id}"~ - Inside source: true *** True Line Result - (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i| -** Processing line: ~ if node[:children] && node[:children][0] && node[:children][0][:data] == "com.apple.developer.team-identifier"~ + log_info "Team Identifer is: #{@team_id}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - if node[:children] && node[:children][0] && node[:children][0][:data] == "com.apple.developer.team-identifier" -** Processing line: ~ team_identifer_index = i~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - team_identifer_index = i -** Processing line: ~ break~ + +** Processing line: ~ def determine_app_name~ - Inside source: true *** True Line Result - break -** Processing line: ~ end~ + def determine_app_name +** Processing line: ~ @app_name = (ios_metadata.appname || "")~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + @app_name = (ios_metadata.appname || "") +** Processing line: ~ raise_ios_metadata_required if @app_name.strip.length == 0~ - Inside source: true *** True Line Result - end + raise_ios_metadata_required if @app_name.strip.length == 0 +** Processing line: ~ log_info "App name is: #{@app_name}."~ +- Inside source: true +*** True Line Result + log_info "App name is: #{@app_name}." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][team_identifer_index + 1][:children].first[:data]~ +** Processing line: ~ def provisioning_profile_xml environment~ +- Inside source: true +*** True Line Result + def provisioning_profile_xml environment +** Processing line: ~ xml = $gtk.read_file (provisioning_profile_path environment)~ +- Inside source: true +*** True Line Result + xml = $gtk.read_file (provisioning_profile_path environment) +** Processing line: ~ scrubbed = xml.each_line.map do |l|~ +- Inside source: true +*** True Line Result + scrubbed = xml.each_line.map do |l| +** Processing line: ~ if l.strip.start_with? "<"~ +- Inside source: true +*** True Line Result + if l.strip.start_with? "<" +** Processing line: ~ if l.start_with? ''~ +- Inside source: true +*** True Line Result + if l.start_with? '' +** Processing line: ~ ''~ +- Inside source: true +*** True Line Result + '' +** Processing line: ~ elsif l.include? "Apple Inc."~ +- Inside source: true +*** True Line Result + elsif l.include? "Apple Inc." +** Processing line: ~ nil~ +- Inside source: true +*** True Line Result + nil +** Processing line: ~ elsif l.include? ''~ +- Inside source: true +*** True Line Result + elsif l.include? '' +** Processing line: ~ nil~ +- Inside source: true +*** True Line Result + nil +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ l~ - Inside source: true *** True Line Result - (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][team_identifer_index + 1][:children].first[:data] + l +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ nil~ +- Inside source: true +*** True Line Result + nil +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end.reject { |l| !l }.join~ +- Inside source: true +*** True Line Result + end.reject { |l| !l }.join +** Processing line: ~ $gtk.parse_xml scrubbed~ +- Inside source: true +*** True Line Result + $gtk.parse_xml scrubbed ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -158395,14 +166026,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def determine_app_id -** Processing line: ~ @app_id = app_id_from_provisioning_profile @opts[:env]~ +** Processing line: ~ @app_id = ios_metadata.appid~ - Inside source: true *** True Line Result - @app_id = app_id_from_provisioning_profile @opts[:env] -** Processing line: ~~ + @app_id = ios_metadata.appid +** Processing line: ~ raise_ios_metadata_required if @app_id.strip.length == 0~ - Inside source: true *** True Line Result - + raise_ios_metadata_required if @app_id.strip.length == 0 ** Processing line: ~ log_info "App Identifier is set to : #{@app_id}"~ - Inside source: true *** True Line Result @@ -158475,10 +166106,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def blow_away_temp~ +** Processing line: ~ def clear_tmp_directory~ - Inside source: true *** True Line Result - def blow_away_temp + def clear_tmp_directory ** Processing line: ~ sh "rm -rf #{tmp_directory}"~ - Inside source: true *** True Line Result @@ -159039,10 +166670,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_name}.#{@app_id}").strip~ +** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip~ - Inside source: true *** True Line Result - $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_name}.#{@app_id}").strip + $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip +** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.txt", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip~ +- Inside source: true +*** True Line Result + $gtk.write_file_root "tmp/ios/Entitlements.txt", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip ** Processing line: ~~ - Inside source: true *** True Line Result @@ -159191,10 +166826,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleInfoDictionaryVersion -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 6.0 + :app_version ** Processing line: ~ CFBundlePackageType~ - Inside source: true *** True Line Result @@ -159207,10 +166842,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleShortVersionString -** Processing line: ~ 5.6~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.6 + :app_version ** Processing line: ~ CFBundleSignature~ - Inside source: true *** True Line Result @@ -159223,10 +166858,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleVersion -** Processing line: ~ 5.6~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.6 + :app_version ** Processing line: ~ CFBundleIcons~ - Inside source: true *** True Line Result @@ -159819,10 +167454,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleInfoDictionaryVersion -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 6.0 + :app_version ** Processing line: ~ CFBundleName~ - Inside source: true *** True Line Result @@ -159843,10 +167478,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleShortVersionString -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.2 + :app_version ** Processing line: ~ CFBundleSignature~ - Inside source: true *** True Line Result @@ -159875,10 +167510,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleVersion -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.2 + :app_version ** Processing line: ~ DTCompiler~ - Inside source: true *** True Line Result @@ -160219,6 +167854,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip +** Processing line: ~ $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip~ +- Inside source: true +*** True Line Result + $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip ** Processing line: ~~ - Inside source: true *** True Line Result @@ -160431,10 +168070,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleInfoDictionaryVersion -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 6.0 + :app_version ** Processing line: ~ CFBundleName~ - Inside source: true *** True Line Result @@ -160455,10 +168094,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleShortVersionString -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.2 + :app_version ** Processing line: ~ CFBundleSignature~ - Inside source: true *** True Line Result @@ -160487,10 +168126,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result CFBundleVersion -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ - Inside source: true *** True Line Result - 5.2 + :app_version ** Processing line: ~ DTCompiler~ - Inside source: true *** True Line Result @@ -160823,6 +168462,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result info_plist_string.gsub!(":app_id", @app_id) +** Processing line: ~ info_plist_string.gsub!(":app_version", @app_version)~ +- Inside source: true +*** True Line Result + info_plist_string.gsub!(":app_version", @app_version) ** Processing line: ~~ - Inside source: true *** True Line Result @@ -160831,6 +168474,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip +** Processing line: ~ $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip~ +- Inside source: true +*** True Line Result + $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip ** Processing line: ~~ - Inside source: true *** True Line Result @@ -160915,14 +168562,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def write_ip_address~ +** Processing line: ~ def embed_mobileprovision~ - Inside source: true *** True Line Result - def write_ip_address -** Processing line: ~ $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip~ + def embed_mobileprovision +** Processing line: ~ sh %Q[cp #{@provisioning_profile_path} "#{app_path}/embedded.mobileprovision"]~ - Inside source: true *** True Line Result - $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip + sh %Q[cp #{@provisioning_profile_path} "#{app_path}/embedded.mobileprovision"] +** Processing line: ~ sh %Q[/usr/bin/plutil -convert binary1 "#{app_path}/Info.plist"]~ +- Inside source: true +*** True Line Result + sh %Q[/usr/bin/plutil -convert binary1 "#{app_path}/Info.plist"] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def clear_payload_directory~ +- Inside source: true +*** True Line Result + def clear_payload_directory +** Processing line: ~ sh %Q[rm "#{@app_name}".ipa]~ +- Inside source: true +*** True Line Result + sh %Q[rm "#{@app_name}".ipa] +** Processing line: ~ sh %Q[rm -rf "#{app_path}/app"]~ +- Inside source: true +*** True Line Result + sh %Q[rm -rf "#{app_path}/app"] +** Processing line: ~ sh %Q[rm -rf "#{app_path}/sounds"]~ +- Inside source: true +*** True Line Result + sh %Q[rm -rf "#{app_path}/sounds"] +** Processing line: ~ sh %Q[rm -rf "#{app_path}/sprites"]~ +- Inside source: true +*** True Line Result + sh %Q[rm -rf "#{app_path}/sprites"] +** Processing line: ~ sh %Q[rm -rf "#{app_path}/data"]~ +- Inside source: true +*** True Line Result + sh %Q[rm -rf "#{app_path}/data"] +** Processing line: ~ sh %Q[rm -rf "#{app_path}/fonts"]~ +- Inside source: true +*** True Line Result + sh %Q[rm -rf "#{app_path}/fonts"] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def stage_app~ +- Inside source: true +*** True Line Result + def stage_app +** Processing line: ~ sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]~ +- Inside source: true +*** True Line Result + sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"] +** Processing line: ~ sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]~ +- Inside source: true +*** True Line Result + sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"] +** Processing line: ~ sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]~ +- Inside source: true +*** True Line Result + sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"] +** Processing line: ~ sh %Q[cp -r "#{root_folder}/data/" "#{app_path}/data/"]~ +- Inside source: true +*** True Line Result + sh %Q[cp -r "#{root_folder}/data/" "#{app_path}/data/"] +** Processing line: ~ sh %Q[cp -r "#{root_folder}/fonts/" "#{app_path}/fonts/"]~ +- Inside source: true +*** True Line Result + sh %Q[cp -r "#{root_folder}/fonts/" "#{app_path}/fonts/"] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -160931,78 +168650,106 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def create_payload_directory~ +** Processing line: ~ def create_payload~ - Inside source: true *** True Line Result - def create_payload_directory -** Processing line: ~ sh "cp #{@provisioning_profile_path} \"#{app_path}/embedded.mobileprovision\""~ + def create_payload +** Processing line: ~ sh %Q[mkdir -p #{tmp_directory}/ipa_root/Payload]~ - Inside source: true *** True Line Result - sh "cp #{@provisioning_profile_path} \"#{app_path}/embedded.mobileprovision\"" -** Processing line: ~ sh "/usr/bin/plutil -convert binary1 \"#{app_path}/Info.plist\""~ + sh %Q[mkdir -p #{tmp_directory}/ipa_root/Payload] +** Processing line: ~ sh %Q[cp -r "#{app_path}" "#{tmp_directory}/ipa_root/Payload"]~ - Inside source: true *** True Line Result - sh "/usr/bin/plutil -convert binary1 \"#{app_path}/Info.plist\"" -** Processing line: ~ write_ip_address~ + sh %Q[cp -r "#{app_path}" "#{tmp_directory}/ipa_root/Payload"] +** Processing line: ~ sh %Q[chmod -R 755 "#{tmp_directory}/ipa_root/Payload"]~ - Inside source: true *** True Line Result - write_ip_address -** Processing line: ~ sh "rm \"#{@app_name}\".ipa"~ + sh %Q[chmod -R 755 "#{tmp_directory}/ipa_root/Payload"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - sh "rm \"#{@app_name}\".ipa" -** Processing line: ~ sh "rm -rf \"#{app_path}/app\""~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - sh "rm -rf \"#{app_path}/app\"" -** Processing line: ~ sh "rm -rf \"#{app_path}/sounds\""~ + +** Processing line: ~ def create_payload_directory_dev~ - Inside source: true *** True Line Result - sh "rm -rf \"#{app_path}/sounds\"" -** Processing line: ~ sh "rm -rf \"#{app_path}/sprites\""~ + def create_payload_directory_dev +** Processing line: ~ # write dev machine's ip address for hotloading~ - Inside source: true *** True Line Result - sh "rm -rf \"#{app_path}/sprites\"" -** Processing line: ~ sh "rm -rf \"#{app_path}/data\""~ + # write dev machine's ip address for hotloading +** Processing line: ~ $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip~ - Inside source: true *** True Line Result - sh "rm -rf \"#{app_path}/data\"" -** Processing line: ~ sh "rm -rf \"#{app_path}/fonts\""~ + $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip +** Processing line: ~~ - Inside source: true *** True Line Result - sh "rm -rf \"#{app_path}/fonts\"" -** Processing line: ~ sh "cp -r \"#{root_folder}/app/\" \"#{app_path}/app/\""~ + +** Processing line: ~ embed_mobileprovision~ - Inside source: true *** True Line Result - sh "cp -r \"#{root_folder}/app/\" \"#{app_path}/app/\"" -** Processing line: ~ sh "cp -r \"#{root_folder}/sounds/\" \"#{app_path}/sounds/\""~ + embed_mobileprovision +** Processing line: ~ clear_payload_directory~ - Inside source: true *** True Line Result - sh "cp -r \"#{root_folder}/sounds/\" \"#{app_path}/sounds/\"" -** Processing line: ~ sh "cp -r \"#{root_folder}/sprites/\" \"#{app_path}/sprites/\""~ + clear_payload_directory +** Processing line: ~ stage_app~ - Inside source: true *** True Line Result - sh "cp -r \"#{root_folder}/sprites/\" \"#{app_path}/sprites/\"" -** Processing line: ~ sh "cp -r \"#{root_folder}/data/\" \"#{app_path}/data/\""~ + stage_app +** Processing line: ~ end~ - Inside source: true *** True Line Result - sh "cp -r \"#{root_folder}/data/\" \"#{app_path}/data/\"" -** Processing line: ~ sh "cp -r \"#{root_folder}/fonts/\" \"#{app_path}/fonts/\""~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - sh "cp -r \"#{root_folder}/fonts/\" \"#{app_path}/fonts/\"" -** Processing line: ~ sh "mkdir -p #{tmp_directory}/ipa_root/Payload"~ + +** Processing line: ~ def create_payload_directory_prod~ +- Inside source: true +*** True Line Result + def create_payload_directory_prod +** Processing line: ~ # production builds does not hotload ip address~ +- Inside source: true +*** True Line Result + # production builds does not hotload ip address +** Processing line: ~ sh %Q[rm "#{root_folder}/app/server_ip_address.txt"]~ +- Inside source: true +*** True Line Result + sh %Q[rm "#{root_folder}/app/server_ip_address.txt"] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ embed_mobileprovision~ +- Inside source: true +*** True Line Result + embed_mobileprovision +** Processing line: ~ stage_app~ +- Inside source: true +*** True Line Result + stage_app +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # production build marker~ - Inside source: true *** True Line Result - sh "mkdir -p #{tmp_directory}/ipa_root/Payload" -** Processing line: ~ sh "cp -r \"#{app_path}\" \"#{tmp_directory}/ipa_root/Payload\""~ + # production build marker +** Processing line: ~ sh %Q[mkdir -p "#{app_path}/metadata/"]~ - Inside source: true *** True Line Result - sh "cp -r \"#{app_path}\" \"#{tmp_directory}/ipa_root/Payload\"" -** Processing line: ~ sh "chmod -R 755 \"#{tmp_directory}/ipa_root/Payload\""~ + sh %Q[mkdir -p "#{app_path}/metadata/"] +** Processing line: ~ sh %Q[touch metadata/DRAGONRUBY_PRODUCTION_BUILD]~ - Inside source: true *** True Line Result - sh "chmod -R 755 \"#{tmp_directory}/ipa_root/Payload\"" + sh %Q[touch metadata/DRAGONRUBY_PRODUCTION_BUILD] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -161131,22 +168878,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def print_publish_help -** Processing line: ~ log_info "Go to https://appstoreconnect.apple.com/apps and create an App if you haven't already done so."~ +** Processing line: ~ has_transporter = (sh "ls /Applications/Transporter.app").include? "Contents"~ - Inside source: true *** True Line Result - log_info "Go to https://appstoreconnect.apple.com/apps and create an App if you haven't already done so." -** Processing line: ~ log_info "Go to https://appleid.apple.com and create a 'Application Specific Password'."~ + has_transporter = (sh "ls /Applications/Transporter.app").include? "Contents" +** Processing line: ~ if !has_transporter~ - Inside source: true *** True Line Result - log_info "Go to https://appleid.apple.com and create a 'Application Specific Password'." -** Processing line: ~ log_info "To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."~ + if !has_transporter +** Processing line: ~ $gtk.openurl "https://apps.apple.com/us/app/transporter/id1450874784?mt=12"~ - Inside source: true *** True Line Result - log_info "To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12." -** Processing line: ~ log_info "Your app is located at ./tmp/ios/#{@app_name}.ipa"~ + $gtk.openurl "https://apps.apple.com/us/app/transporter/id1450874784?mt=12" +** Processing line: ~ $console.set_command "$wizards.ios.start env: :#{@opts[:env]}, version: \"#{@opts[:version]}\""~ - Inside source: true *** True Line Result - log_info "Your app is located at ./tmp/ios/#{@app_name}.ipa" + $console.set_command "$wizards.ios.start env: :#{@opts[:env]}, version: \"#{@opts[:version]}\"" +** Processing line: ~ raise WizardException.new(~ +- Inside source: true +*** True Line Result + raise WizardException.new( +** Processing line: ~ "* To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."~ +- Inside source: true +*** True Line Result + "* To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12." +** Processing line: ~ )~ +- Inside source: true +*** True Line Result + ) +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ sh "mkdir ./tmp/ios/intermediary_artifacts"~ +- Inside source: true +*** True Line Result + sh "mkdir ./tmp/ios/intermediary_artifacts" +** Processing line: ~ sh "mv \"#{tmp_directory}/#{@app_name}.app\" #{tmp_directory}/intermediary_artifacts/"~ +- Inside source: true +*** True Line Result + sh "mv \"#{tmp_directory}/#{@app_name}.app\" #{tmp_directory}/intermediary_artifacts/" +** Processing line: ~ sh "mv \"#{tmp_directory}/do_zip.sh\" #{tmp_directory}/intermediary_artifacts"~ +- Inside source: true +*** True Line Result + sh "mv \"#{tmp_directory}/do_zip.sh\" #{tmp_directory}/intermediary_artifacts" +** Processing line: ~ sh "mv \"#{tmp_directory}/Entitlements.plist\" #{tmp_directory}/intermediary_artifacts"~ +- Inside source: true +*** True Line Result + sh "mv \"#{tmp_directory}/Entitlements.plist\" #{tmp_directory}/intermediary_artifacts" +** Processing line: ~ sh "mv \"#{tmp_directory}/ipa_root\" #{tmp_directory}/intermediary_artifacts/"~ +- Inside source: true +*** True Line Result + sh "mv \"#{tmp_directory}/ipa_root\" #{tmp_directory}/intermediary_artifacts/" +** Processing line: ~ sh "open /Applications/Transporter.app"~ +- Inside source: true +*** True Line Result + sh "open /Applications/Transporter.app" +** Processing line: ~ sh "open ./tmp/ios/"~ +- Inside source: true +*** True Line Result + sh "open ./tmp/ios/" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -161227,78 +169022,62 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+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: ~*** itch_wizard.rb~ -- Header detected. -*** True Line Result - -*** True Line Result -*** itch_wizard.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/itch_wizard.rb~ +** Processing line: ~ def set_version version~ - Inside source: true *** True Line Result - # ./dragon/itch_wizard.rb -** Processing line: ~ # Copyright 2019 DragonRuby LLC~ + def set_version version +** Processing line: ~ @app_version = version~ - Inside source: true *** True Line Result - # Copyright 2019 DragonRuby LLC -** Processing line: ~ # MIT License~ + @app_version = version +** Processing line: ~ start env: @opts[:env], version: version~ - Inside source: true *** True Line Result - # MIT License -** Processing line: ~ # itch_wizard.rb has been released under MIT (*only this file*).~ + start env: @opts[:env], version: version +** Processing line: ~ end~ - Inside source: true *** True Line Result - # itch_wizard.rb has been released under MIT (*only this file*). + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ class ItchWizard~ +** Processing line: ~ def app_version~ - Inside source: true *** True Line Result - class ItchWizard -** Processing line: ~ def steps~ + def app_version +** Processing line: ~ log_info "Attempting to retrieve App Version from metadata/ios_metadata.txt."~ - Inside source: true *** True Line Result - def steps -** Processing line: ~ [~ + log_info "Attempting to retrieve App Version from metadata/ios_metadata.txt." +** Processing line: ~ ios_version_number = (ios_metadata.version || "").strip~ - Inside source: true *** True Line Result - [ -** Processing line: ~ :check_metadata,~ + ios_version_number = (ios_metadata.version || "").strip +** Processing line: ~ if ios_version_number.length == 0~ - Inside source: true *** True Line Result - :check_metadata, -** Processing line: ~ :deploy~ + if ios_version_number.length == 0 +** Processing line: ~ log_info "Not found. Attempting to retrieve App Version from metadata/game_metadata.txt."~ - Inside source: true *** True Line Result - :deploy -** Processing line: ~ ]~ + log_info "Not found. Attempting to retrieve App Version from metadata/game_metadata.txt." +** Processing line: ~ ios_version_number = (game_metadata.version || "").strip~ - Inside source: true *** True Line Result - ] + ios_version_number = (game_metadata.version || "").strip +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ ios_version_number~ +- Inside source: true +*** True Line Result + ios_version_number ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -161307,94 +169086,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def metadata_file_path~ +** Processing line: ~ def determine_app_version~ - Inside source: true *** True Line Result - def metadata_file_path -** Processing line: ~ "metadata/game_metadata.txt"~ + def determine_app_version +** Processing line: ~ @app_version = app_version~ - Inside source: true *** True Line Result - "metadata/game_metadata.txt" + @app_version = app_version +** Processing line: ~ return if @app_version~ +- Inside source: true +*** True Line Result + return if @app_version ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~~ +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ def get_metadata~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - def get_metadata -** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - metadata = $gtk.read_file metadata_file_path +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ if !metadata~ -- Inside source: true +** Processing line: ~*** itch_wizard.rb~ +- Header detected. *** True Line Result - if !metadata -** Processing line: ~ write_blank_metadata~ -- Inside source: true + *** True Line Result - write_blank_metadata -** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ -- Inside source: true +*** itch_wizard.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - metadata = $gtk.read_file metadata_file_path -** Processing line: ~ end~ -- Inside source: true + *** True Line Result - end -** Processing line: ~~ +#+begin_src ruby +** Processing line: ~ # ./dragon/itch_wizard.rb~ - Inside source: true *** True Line Result - -** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ + # ./dragon/itch_wizard.rb +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ - Inside source: true *** True Line Result - dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a -** Processing line: ~~ + # Copyright 2019 DragonRuby LLC +** Processing line: ~ # MIT License~ - Inside source: true *** True Line Result - -** Processing line: ~ {~ + # MIT License +** Processing line: ~ # itch_wizard.rb has been released under MIT (*only this file*).~ - Inside source: true *** True Line Result - { -** Processing line: ~ dev_id: dev_id.strip,~ + # itch_wizard.rb has been released under MIT (*only this file*). +** Processing line: ~~ - Inside source: true *** True Line Result - dev_id: dev_id.strip, -** Processing line: ~ dev_title: dev_title.strip,~ + +** Processing line: ~ class ItchWizard < Wizard~ - Inside source: true *** True Line Result - dev_title: dev_title.strip, -** Processing line: ~ game_id: game_id.strip,~ + class ItchWizard < Wizard +** Processing line: ~ def steps~ - Inside source: true *** True Line Result - game_id: game_id.strip, -** Processing line: ~ game_title: game_title.strip,~ + def steps +** Processing line: ~ [~ - Inside source: true *** True Line Result - game_title: game_title.strip, -** Processing line: ~ version: version.strip,~ + [ +** Processing line: ~ :check_metadata,~ - Inside source: true *** True Line Result - version: version.strip, -** Processing line: ~ icon: icon.strip~ + :check_metadata, +** Processing line: ~ :deploy,~ - Inside source: true *** True Line Result - icon: icon.strip -** Processing line: ~ }~ + :deploy, +** Processing line: ~ ]~ - Inside source: true *** True Line Result - } + ] ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -161471,10 +169250,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 metadata_text.each_line.to_a.length != 6~ +** Processing line: ~ if metadata_text.strip.each_line.to_a.length < 6~ - Inside source: true *** True Line Result - if metadata_text.each_line.to_a.length != 6 + if metadata_text.strip.each_line.to_a.length < 6 ** Processing line: ~ write_blank_metadata~ - Inside source: true *** True Line Result @@ -161519,10 +169298,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide your username for Itch." -** Processing line: ~ $console.set_command "$wizards.itch.set_dev_id \"your-itch-username\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_dev_id \"#{metadata[:dev_id]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_dev_id \"your-itch-username\"" + $console.set_command "$wizards.itch.set_dev_id \"#{metadata[:dev_id]}\"" ** Processing line: ~ return :need_dev_id~ - Inside source: true *** True Line Result @@ -161543,10 +169322,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide developer's/company's name that you want displayed." -** Processing line: ~ $console.set_command "$wizards.itch.set_dev_title \"Your Name\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_dev_title \"#{metadata[:dev_title]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_dev_title \"Your Name\"" + $console.set_command "$wizards.itch.set_dev_title \"#{metadata[:dev_title]}\"" ** Processing line: ~ return :need_dev_title~ - Inside source: true *** True Line Result @@ -161567,10 +169346,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide the id for you game. This is the id you specified when you set up a new game page on Itch." -** Processing line: ~ $console.set_command "$wizards.itch.set_game_id \"your-game-id\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_game_id \"#{metadata[:game_id]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_game_id \"your-game-id\"" + $console.set_command "$wizards.itch.set_game_id \"#{metadata[:game_id]}\"" ** Processing line: ~ return :need_game_id~ - Inside source: true *** True Line Result @@ -161591,10 +169370,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide the display name for your game. (This can include spaces)" -** Processing line: ~ $console.set_command "$wizards.itch.set_game_title \"Your Game\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_game_title \"#{metadata[:game_title]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_game_title \"Your Game\"" + $console.set_command "$wizards.itch.set_game_title \"#{metadata[:game_title]}\"" ** Processing line: ~ return :need_game_title~ - Inside source: true *** True Line Result @@ -161615,10 +169394,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide the version for your game." -** Processing line: ~ $console.set_command "$wizards.itch.set_version \"1.0\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_version \"#{metadata[:version]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_version \"1.0\"" + $console.set_command "$wizards.itch.set_version \"#{metadata[:version]}\"" ** Processing line: ~ return :need_version~ - Inside source: true *** True Line Result @@ -161639,10 +169418,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "* PROMPT: Please provide icon path for your game." -** Processing line: ~ $console.set_command "$wizards.itch.set_icon \"icon.png\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_icon \"#{metadata[:icon]}\""~ - Inside source: true *** True Line Result - $console.set_command "$wizards.itch.set_icon \"icon.png\"" + $console.set_command "$wizards.itch.set_icon \"#{metadata[:icon]}\"" ** Processing line: ~ return :need_icon~ - Inside source: true *** True Line Result @@ -161655,6 +169434,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ puts "here!! success!!!"~ +- Inside source: true +*** True Line Result + puts "here!! success!!!" +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ return :success~ - Inside source: true *** True Line Result @@ -161675,10 +169462,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @dev_id = value -** Processing line: ~ write_metadata~ -- Inside source: true -*** True Line Result - write_metadata ** Processing line: ~ start~ - Inside source: true *** True Line Result @@ -161699,10 +169482,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @dev_title = value -** Processing line: ~ write_metadata~ -- Inside source: true -*** True Line Result - write_metadata ** Processing line: ~ start~ - Inside source: true *** True Line Result @@ -161723,10 +169502,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @game_id = value -** Processing line: ~ write_metadata~ -- Inside source: true -*** True Line Result - write_metadata ** Processing line: ~ start~ - Inside source: true *** True Line Result @@ -161747,10 +169522,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @game_title = value -** Processing line: ~ write_metadata~ -- Inside source: true -*** True Line Result - write_metadata ** Processing line: ~ start~ - Inside source: true *** True Line Result @@ -161771,10 +169542,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @version = value -** Processing line: ~ write_metadata~ -- Inside source: true -*** True Line Result - write_metadata ** Processing line: ~ start~ - Inside source: true *** True Line Result @@ -161943,10 +169710,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result if @icon -** Processing line: ~ text += "icon=metadata/#{@icon}\n"~ +** Processing line: ~ text += "icon=#{@icon}\n"~ - Inside source: true *** True Line Result - text += "icon=metadata/#{@icon}\n" + text += "icon=#{@icon}\n" ** Processing line: ~ else~ - Inside source: true *** True Line Result @@ -162015,10 +169782,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log_info "* Running dragonruby-publish: #{package_command}" -** Processing line: ~ results = $gtk.exec package_command~ +** Processing line: ~ $gtk.openurl "http://itch.io/dashboard" if $gtk.platform == "Mac OS X"~ +- Inside source: true +*** True Line Result + $gtk.openurl "http://itch.io/dashboard" if $gtk.platform == "Mac OS X" +** Processing line: ~ if $gtk.platform? :mac~ +- Inside source: true +*** True Line Result + if $gtk.platform? :mac +** Processing line: ~ $gtk.exec "rm -rf ./builds"~ - Inside source: true *** True Line Result - results = $gtk.exec package_command + $gtk.exec "rm -rf ./builds" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ results = $gtk.exec "#{package_command} --only-package"~ +- Inside source: true +*** True Line Result + results = $gtk.exec "#{package_command} --only-package" +** Processing line: ~ puts File.expand_path("./builds")~ +- Inside source: true +*** True Line Result + puts File.expand_path("./builds") +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ log "#+begin_src"~ - Inside source: true *** True Line Result @@ -162031,6 +169822,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "#+end_src" +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if $gtk.platform? :mac~ +- Inside source: true +*** True Line Result + if $gtk.platform? :mac +** Processing line: ~ $gtk.exec "open ./builds/"~ +- Inside source: true +*** True Line Result + $gtk.exec "open ./builds/" +** Processing line: ~ elsif $gtk.platform? :windows~ +- Inside source: true +*** True Line Result + elsif $gtk.platform? :windows +** Processing line: ~ $gtk.exec "powershell \"ii .\""~ +- Inside source: true +*** True Line Result + $gtk.exec "powershell \"ii .\"" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ $gtk.openurl "https://itch.io/dashboard"~ +- Inside source: true +*** True Line Result + $gtk.openurl "https://itch.io/dashboard" +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ :success~ - Inside source: true *** True Line Result @@ -162071,10 +169898,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log_info "Running Itch Wizard Step: ~$wizards.itch.#{m}~" -** Processing line: ~ result = (send m) || :success if @wizard_status[m][:result] != :success~ +** Processing line: ~ result = (send m) || :success~ - Inside source: true *** True Line Result - result = (send m) || :success if @wizard_status[m][:result] != :success + result = (send m) || :success ** Processing line: ~ @wizard_status[m][:result] = result~ - Inside source: true *** True Line Result @@ -163471,6 +171298,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def row_max_index~ +- Inside source: true +*** True Line Result + def row_max_index +** Processing line: ~ row_count - 1~ +- Inside source: true +*** True Line Result + row_count - 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def col_count~ - Inside source: true *** True Line Result @@ -163487,6 +171330,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def col_max_index~ +- Inside source: true +*** True Line Result + def col_max_index +** Processing line: ~ col_count - 1~ +- Inside source: true +*** True Line Result + col_count - 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def gutter_height~ - Inside source: true *** True Line Result @@ -163575,34 +171434,54 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result { -** Processing line: ~ row: nil,~ +** Processing line: ~ row: nil,~ +- Inside source: true +*** True Line Result + row: nil, +** Processing line: ~ col: nil,~ +- Inside source: true +*** True Line Result + col: nil, +** Processing line: ~ h: 1,~ +- Inside source: true +*** True Line Result + h: 1, +** Processing line: ~ w: 1,~ +- Inside source: true +*** True Line Result + w: 1, +** Processing line: ~ dx: 0,~ +- Inside source: true +*** True Line Result + dx: 0, +** Processing line: ~ dx_ratio: 1,~ - Inside source: true *** True Line Result - row: nil, -** Processing line: ~ col: nil,~ + dx_ratio: 1, +** Processing line: ~ dy: 0,~ - Inside source: true *** True Line Result - col: nil, -** Processing line: ~ h: 1,~ + dy: 0, +** Processing line: ~ dy_ratio: 1,~ - Inside source: true *** True Line Result - h: 1, -** Processing line: ~ w: 1,~ + dy_ratio: 1, +** Processing line: ~ dh_ratio: 1,~ - Inside source: true *** True Line Result - w: 1, -** Processing line: ~ dx: 0,~ + dh_ratio: 1, +** Processing line: ~ dw_ratio: 1,~ - Inside source: true *** True Line Result - dx: 0, -** Processing line: ~ dy: 0,~ + dw_ratio: 1, +** Processing line: ~ merge: nil,~ - Inside source: true *** True Line Result - dy: 0, -** Processing line: ~ rect: :control_rect~ + merge: nil, +** Processing line: ~ rect: :control_rect~ - Inside source: true *** True Line Result - rect: :control_rect + rect: :control_rect ** Processing line: ~ }~ - Inside source: true *** True Line Result @@ -163615,14 +171494,418 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def rect opts~ +** Processing line: ~ def row n~ +- Inside source: true +*** True Line Result + def row n +** Processing line: ~ (rect row: n, col: 0, w: 0, h: 0).x~ +- Inside source: true +*** True Line Result + (rect row: n, col: 0, w: 0, h: 0).x +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def row_from_bottom n~ +- Inside source: true +*** True Line Result + def row_from_bottom n +** Processing line: ~ (rect row: row_count - n, col: 0, w: 0, h: 0).x~ +- Inside source: true +*** True Line Result + (rect row: row_count - n, col: 0, w: 0, h: 0).x +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def col n~ +- Inside source: true +*** True Line Result + def col n +** Processing line: ~ (rect row: 0, col: n, w: 0, h: 0).y~ +- Inside source: true +*** True Line Result + (rect row: 0, col: n, w: 0, h: 0).y +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def col_from_right n~ +- Inside source: true +*** True Line Result + def col_from_right n +** Processing line: ~ (rect row: 0, col: col_max_index - n, w: 0, h: 0).y~ +- Inside source: true +*** True Line Result + (rect row: 0, col: col_max_index - n, w: 0, h: 0).y +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def w n~ +- Inside source: true +*** True Line Result + def w n +** Processing line: ~ (rect row: 0, col: 0, w: n, h: 1).w~ +- Inside source: true +*** True Line Result + (rect row: 0, col: 0, w: n, h: 1).w +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def h n~ +- Inside source: true +*** True Line Result + def h n +** Processing line: ~ (rect row: 0, col: 0, w: 1, h: n).h~ +- Inside source: true +*** True Line Result + (rect row: 0, col: 0, w: 1, h: n).h +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def rect_group opts~ +- Inside source: true +*** True Line Result + def rect_group opts +** Processing line: ~ group = opts.group~ +- Inside source: true +*** True Line Result + group = opts.group +** Processing line: ~ r = opts.row || 0~ +- Inside source: true +*** True Line Result + r = opts.row || 0 +** Processing line: ~ r = row_max_index - opts.row_from_bottom if opts.row_from_bottom~ +- Inside source: true +*** True Line Result + r = row_max_index - opts.row_from_bottom if opts.row_from_bottom +** Processing line: ~ c = opts.col || 0~ +- Inside source: true +*** True Line Result + c = opts.col || 0 +** Processing line: ~ c = col_max_index - opts.col_from_right if opts.col_from_right~ +- Inside source: true +*** True Line Result + c = col_max_index - opts.col_from_right if opts.col_from_right +** Processing line: ~ drow = opts.drow || 0~ +- Inside source: true +*** True Line Result + drow = opts.drow || 0 +** Processing line: ~ dcol = opts.dcol || 0~ +- Inside source: true +*** True Line Result + dcol = opts.dcol || 0 +** Processing line: ~ w = opts.w || 0~ +- Inside source: true +*** True Line Result + w = opts.w || 0 +** Processing line: ~ h = opts.h || 0~ +- Inside source: true +*** True Line Result + h = opts.h || 0 +** Processing line: ~ merge = opts[:merge]~ +- Inside source: true +*** True Line Result + merge = opts[:merge] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ running_row = r~ +- Inside source: true +*** True Line Result + running_row = r +** Processing line: ~ running_col = c~ +- Inside source: true +*** True Line Result + running_col = c +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ running_col = calc_col_offset(opts.col_offset) if opts.col_offset~ +- Inside source: true +*** True Line Result + running_col = calc_col_offset(opts.col_offset) if opts.col_offset +** Processing line: ~ running_row = calc_row_offset(opts.row_offset) if opts.row_offset~ +- Inside source: true +*** True Line Result + running_row = calc_row_offset(opts.row_offset) if opts.row_offset +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ group.map do |i|~ +- Inside source: true +*** True Line Result + group.map do |i| +** Processing line: ~ group_layout_opts = i.layout || {}~ +- Inside source: true +*** True Line Result + group_layout_opts = i.layout || {} +** Processing line: ~ group_layout_opts = group_layout_opts.merge row: running_row,~ +- Inside source: true +*** True Line Result + group_layout_opts = group_layout_opts.merge row: running_row, +** Processing line: ~ col: running_col,~ +- Inside source: true +*** True Line Result + col: running_col, +** Processing line: ~ merge: merge,~ +- Inside source: true +*** True Line Result + merge: merge, +** Processing line: ~ w: w, h: h~ +- Inside source: true +*** True Line Result + w: w, h: h +** Processing line: ~ result = (rect group_layout_opts).merge i~ +- Inside source: true +*** True Line Result + result = (rect group_layout_opts).merge i +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if (i.is_a? Hash) && (i.primitive_marker == :label)~ +- Inside source: true +*** True Line Result + if (i.is_a? Hash) && (i.primitive_marker == :label) +** Processing line: ~ if i.alignment_enum == 1~ +- Inside source: true +*** True Line Result + if i.alignment_enum == 1 +** Processing line: ~ result.x += result.w.half~ +- Inside source: true +*** True Line Result + result.x += result.w.half +** Processing line: ~ elsif i.alignment_enum == 2~ +- Inside source: true +*** True Line Result + elsif i.alignment_enum == 2 +** Processing line: ~ result.x += result.w~ +- Inside source: true +*** True Line Result + result.x += result.w +** 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: ~ running_row += drow~ +- Inside source: true +*** True Line Result + running_row += drow +** Processing line: ~ running_col += dcol~ +- Inside source: true +*** True Line Result + running_col += dcol +** Processing line: ~ result~ +- Inside source: true +*** True Line Result + result +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def calc_row_offset opts = {}~ +- Inside source: true +*** True Line Result + def calc_row_offset opts = {} +** Processing line: ~ count = opts[:count] || opts[:length] || 0~ +- Inside source: true +*** True Line Result + count = opts[:count] || opts[:length] || 0 +** Processing line: ~ h = opts.h || 1~ +- Inside source: true +*** True Line Result + h = opts.h || 1 +** Processing line: ~ (row_count - (count * h)) / 2.0~ +- Inside source: true +*** True Line Result + (row_count - (count * h)) / 2.0 +** Processing line: ~ end~ - Inside source: true *** True Line Result - def rect opts + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def calc_col_offset opts = {}~ +- Inside source: true +*** True Line Result + def calc_col_offset opts = {} +** Processing line: ~ count = opts[:count] || opts[:length] || 0~ +- Inside source: true +*** True Line Result + count = opts[:count] || opts[:length] || 0 +** Processing line: ~ w = opts.w || 1~ +- Inside source: true +*** True Line Result + w = opts.w || 1 +** Processing line: ~ (col_count - (count * w)) / 2.0~ +- Inside source: true +*** True Line Result + (col_count - (count * w)) / 2.0 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def point opts = {}~ +- Inside source: true +*** True Line Result + def point opts = {} +** Processing line: ~ opts.w = 1~ +- Inside source: true +*** True Line Result + opts.w = 1 +** Processing line: ~ opts.h = 1~ +- Inside source: true +*** True Line Result + opts.h = 1 +** Processing line: ~ opts.row ||= 0~ +- Inside source: true +*** True Line Result + opts.row ||= 0 +** Processing line: ~ opts.col ||= 0~ +- Inside source: true +*** True Line Result + opts.col ||= 0 +** Processing line: ~ r = rect opts~ +- Inside source: true +*** True Line Result + r = rect opts +** Processing line: ~ r.x += r.w * opts.col_anchor if opts.col_anchor~ +- Inside source: true +*** True Line Result + r.x += r.w * opts.col_anchor if opts.col_anchor +** Processing line: ~ r.y += r.h * opts.row_anchor if opts.row_anchor~ +- Inside source: true +*** True Line Result + r.y += r.h * opts.row_anchor if opts.row_anchor +** Processing line: ~ r~ +- Inside source: true +*** True Line Result + r +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def rect *all_opts~ +- Inside source: true +*** True Line Result + def rect *all_opts +** Processing line: ~ if all_opts.length == 1~ +- Inside source: true +*** True Line Result + if all_opts.length == 1 +** Processing line: ~ opts = all_opts.first~ +- Inside source: true +*** True Line Result + opts = all_opts.first +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ opts = {}~ +- Inside source: true +*** True Line Result + opts = {} +** Processing line: ~ all_opts.each do |o|~ +- Inside source: true +*** True Line Result + all_opts.each do |o| +** Processing line: ~ opts.merge! o~ +- Inside source: true +*** True Line Result + opts.merge! 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: ~ opts.row = row_max_index - opts.row_from_bottom if opts.row_from_bottom~ +- Inside source: true +*** True Line Result + opts.row = row_max_index - opts.row_from_bottom if opts.row_from_bottom +** Processing line: ~ opts.col = col_max_index - opts.col_from_right if opts.col_from_right~ +- Inside source: true +*** True Line Result + opts.col = col_max_index - opts.col_from_right if opts.col_from_right ** Processing line: ~ opts = rect_defaults.merge opts~ - Inside source: true *** True Line Result opts = rect_defaults.merge opts +** Processing line: ~ opts.row ||= 0~ +- Inside source: true +*** True Line Result + opts.row ||= 0 +** Processing line: ~ opts.col ||= 0~ +- Inside source: true +*** True Line Result + opts.col ||= 0 +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ result = send opts[:rect]~ - Inside source: true *** True Line Result @@ -163651,10 +171934,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result w: col.w, -** Processing line: ~ h: row.h~ +** Processing line: ~ h: row.h,~ +- Inside source: true +*** True Line Result + h: row.h, +** Processing line: ~ center_x: col.center_x,~ - Inside source: true *** True Line Result - h: row.h + center_x: col.center_x, +** Processing line: ~ center_y: row.center_y~ +- Inside source: true +*** True Line Result + center_y: row.center_y ** Processing line: ~ elsif opts[:row] && !opts[:col]~ - Inside source: true *** True Line Result @@ -163803,22 +172094,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ result[:x] += opts[:dx] if opts[:dx]~ +** Processing line: ~ result[:x] += opts[:dx] if opts[:dx]~ +- Inside source: true +*** True Line Result + result[:x] += opts[:dx] if opts[:dx] +** Processing line: ~ result[:x] *= opts[:dx_ratio] if opts[:dx_ratio]~ +- Inside source: true +*** True Line Result + result[:x] *= opts[:dx_ratio] if opts[:dx_ratio] +** Processing line: ~ result[:y] += opts[:dy] if opts[:dy]~ +- Inside source: true +*** True Line Result + result[:y] += opts[:dy] if opts[:dy] +** Processing line: ~ result[:y] *= opts[:dy_ratio] if opts[:dy_ratio]~ +- Inside source: true +*** True Line Result + result[:y] *= opts[:dy_ratio] if opts[:dy_ratio] +** Processing line: ~ result[:w] += opts[:dw] if opts[:dw]~ - Inside source: true *** True Line Result - result[:x] += opts[:dx] if opts[:dx] -** Processing line: ~ result[:y] += opts[:dy] if opts[:dy]~ + result[:w] += opts[:dw] if opts[:dw] +** Processing line: ~ result[:w] *= opts[:dw_ratio] if opts[:dw_ratio]~ - Inside source: true *** True Line Result - result[:y] += opts[:dy] if opts[:dy] -** Processing line: ~ result[:w] += opts[:dw] if opts[:dw]~ + result[:w] *= opts[:dw_ratio] if opts[:dw_ratio] +** Processing line: ~ result[:h] += opts[:dh] if opts[:dh]~ - Inside source: true *** True Line Result - result[:w] += opts[:dw] if opts[:dw] -** Processing line: ~ result[:h] += opts[:dh] if opts[:dh]~ + result[:h] += opts[:dh] if opts[:dh] +** Processing line: ~ result[:h] *= opts[:dh_ratio] if opts[:dh_ratio]~ - Inside source: true *** True Line Result - result[:h] += opts[:dh] if opts[:dh] + result[:h] *= opts[:dh_ratio] if opts[:dh_ratio] +** Processing line: ~ result.merge! opts[:merge] if opts[:merge]~ +- Inside source: true +*** True Line Result + result.merge! opts[:merge] if opts[:merge] ** Processing line: ~ result[:row] = opts[:row]~ - Inside source: true *** True Line Result @@ -163831,6 +172142,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ result[:h] = result[:h].clamp 0~ +- Inside source: true +*** True Line Result + result[:h] = result[:h].clamp 0 +** Processing line: ~ result[:w] = result[:w].clamp 0~ +- Inside source: true +*** True Line Result + result[:w] = result[:w].clamp 0 +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ if $gtk.args.grid.name == :center~ - Inside source: true *** True Line Result @@ -163967,10 +172290,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ result = control_rect.merge y: row_y, h: row_h~ +** Processing line: ~ result = control_rect.merge y: row_y, h: row_h, center_y: (row_y + row_h.half)~ - Inside source: true *** True Line Result - result = control_rect.merge y: row_y, h: row_h + result = control_rect.merge y: row_y, h: row_h, center_y: (row_y + row_h.half) ** Processing line: ~ @rect_cache[:row][index][h] = result~ - Inside source: true *** True Line Result @@ -164059,10 +172382,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ result = control_rect.merge x: col_x, w: col_w~ +** Processing line: ~ result = control_rect.merge x: col_x, w: col_w, center_x: (col_x + col_w.half)~ - Inside source: true *** True Line Result - result = control_rect.merge x: col_x, w: col_w + result = control_rect.merge x: col_x, w: col_w, center_x: (col_x + col_w.half) ** Processing line: ~ @rect_cache[:col][index][w] = result~ - Inside source: true *** True Line Result @@ -164263,6 +172586,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def debug_primitives opts = {}~ +- Inside source: true +*** True Line Result + def debug_primitives opts = {} +** Processing line: ~ @primitives ||= col_count.map_with_index do |col|~ +- Inside source: true +*** True Line Result + @primitives ||= col_count.map_with_index do |col| +** Processing line: ~ row_count.map_with_index do |row|~ +- Inside source: true +*** True Line Result + row_count.map_with_index do |row| +** Processing line: ~ cell = rect row: row, col: col~ +- Inside source: true +*** True Line Result + cell = rect row: row, col: col +** Processing line: ~ center = Geometry.rect_center_point cell~ +- Inside source: true +*** True Line Result + center = Geometry.rect_center_point cell +** Processing line: ~ [~ +- Inside source: true +*** True Line Result + [ +** Processing line: ~ cell.merge(opts).border,~ +- Inside source: true +*** True Line Result + cell.merge(opts).border, +** Processing line: ~ cell.merge(opts)~ +- Inside source: true +*** True Line Result + cell.merge(opts) +** Processing line: ~ .label!(x: center.x,~ +- Inside source: true +*** True Line Result + .label!(x: center.x, +** Processing line: ~ y: center.y,~ +- Inside source: true +*** True Line Result + y: center.y, +** Processing line: ~ text: "#{row},#{col}",~ +- Inside source: true +*** True Line Result + text: "#{row},#{col}", +** Processing line: ~ size_enum: -3,~ +- Inside source: true +*** True Line Result + size_enum: -3, +** Processing line: ~ vertical_alignment_enum: 1,~ +- Inside source: true +*** True Line Result + vertical_alignment_enum: 1, +** Processing line: ~ alignment_enum: 1)~ +- Inside source: true +*** True Line Result + alignment_enum: 1) +** Processing line: ~ ]~ +- Inside source: true +*** True Line Result + ] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ @primitives~ +- Inside source: true +*** True Line Result + @primitives +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def serialize~ - Inside source: true *** True Line Result @@ -164315,6 +172718,34 @@ 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 reset~ +- Inside source: true +*** True Line Result + def reset +** Processing line: ~ @primitives = nil~ +- Inside source: true +*** True Line Result + @primitives = nil +** Processing line: ~ @rect_cache ||= {}~ +- Inside source: true +*** True Line Result + @rect_cache ||= {} +** Processing line: ~ @rect_cache.clear~ +- Inside source: true +*** True Line Result + @rect_cache.clear +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -164875,6 +173306,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def self.reset~ +- Inside source: true +*** True Line Result + def self.reset +** Processing line: ~ @once = {}~ +- Inside source: true +*** True Line Result + @once = {} +** Processing line: ~ nil~ +- Inside source: true +*** True Line Result + nil +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def self.puts_once *ids, message~ - Inside source: true *** True Line Result @@ -165419,6 +173870,198 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result +** Processing line: ~*** metadata.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** metadata.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/metadata.rb~ +- Inside source: true +*** True Line Result + # ./dragon/metadata.rb +** 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: ~ # Copyright 2021 DragonRuby LLC~ +- Inside source: true +*** True Line Result + # Copyright 2021 DragonRuby LLC +** Processing line: ~ # MIT License~ +- Inside source: true +*** True Line Result + # MIT License +** Processing line: ~ # metadata.rb has been released under MIT (*only this file*).~ +- Inside source: true +*** True Line Result + # metadata.rb has been released under MIT (*only this file*). +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ module Metadata~ +- Inside source: true +*** True Line Result + module Metadata +** Processing line: ~ def metadata_file_path~ +- Inside source: true +*** True Line Result + def metadata_file_path +** Processing line: ~ "metadata/game_metadata.txt"~ +- Inside source: true +*** True Line Result + "metadata/game_metadata.txt" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def get_metadata~ +- Inside source: true +*** True Line Result + def get_metadata +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +- Inside source: true +*** True Line Result + metadata = $gtk.read_file metadata_file_path +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if !metadata~ +- Inside source: true +*** True Line Result + if !metadata +** Processing line: ~ write_blank_metadata~ +- Inside source: true +*** True Line Result + write_blank_metadata +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +- Inside source: true +*** True Line Result + metadata = $gtk.read_file metadata_file_path +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ +- Inside source: true +*** True Line Result + dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ {~ +- Inside source: true +*** True Line Result + { +** Processing line: ~ dev_id: dev_id.strip,~ +- Inside source: true +*** True Line Result + dev_id: dev_id.strip, +** Processing line: ~ dev_title: dev_title.strip,~ +- Inside source: true +*** True Line Result + dev_title: dev_title.strip, +** Processing line: ~ game_id: game_id.strip,~ +- Inside source: true +*** True Line Result + game_id: game_id.strip, +** Processing line: ~ game_title: game_title.strip,~ +- Inside source: true +*** True Line Result + game_title: game_title.strip, +** Processing line: ~ version: version.strip,~ +- Inside source: true +*** True Line Result + version: version.strip, +** Processing line: ~ icon: icon.strip~ +- Inside source: true +*** True Line Result + icon: icon.strip +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def write_blank_metadata~ +- Inside source: true +*** True Line Result + def write_blank_metadata +** Processing line: ~ $gtk.write_file metadata_file_path, <<-S.strip~ +- Inside source: true +*** True Line Result + $gtk.write_file metadata_file_path, <<-S.strip +** Processing line: ~ #devid=myname~ +- Inside source: true +*** True Line Result + #devid=myname +** Processing line: ~ #devtitle=My Name~ +- Inside source: true +*** True Line Result + #devtitle=My Name +** Processing line: ~ #gameid=mygame~ +- Inside source: true +*** True Line Result + #gameid=mygame +** Processing line: ~ #gametitle=My Game~ +- Inside source: true +*** True Line Result + #gametitle=My Game +** Processing line: ~ #version=0.1~ +- Inside source: true +*** True Line Result + #version=0.1 +** Processing line: ~ #icon=metadata/icon.png~ +- Inside source: true +*** True Line Result + #icon=metadata/icon.png +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** 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: ~*** numeric.rb~ - Header detected. *** True Line Result @@ -165495,6 +174138,122 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def to_layout_row opts = {}~ +- Inside source: true +*** True Line Result + def to_layout_row opts = {} +** Processing line: ~ $layout.rect(row: self,~ +- Inside source: true +*** True Line Result + $layout.rect(row: self, +** Processing line: ~ col: opts.col || 0,~ +- Inside source: true +*** True Line Result + col: opts.col || 0, +** Processing line: ~ w: opts.w || 0,~ +- Inside source: true +*** True Line Result + w: opts.w || 0, +** Processing line: ~ h: opts.h || 0).y~ +- Inside source: true +*** True Line Result + h: opts.h || 0).y +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def to_layout_col opts = {}~ +- Inside source: true +*** True Line Result + def to_layout_col opts = {} +** Processing line: ~ $layout.rect(row: 0,~ +- Inside source: true +*** True Line Result + $layout.rect(row: 0, +** Processing line: ~ col: self,~ +- Inside source: true +*** True Line Result + col: self, +** Processing line: ~ w: opts.w || 0,~ +- Inside source: true +*** True Line Result + w: opts.w || 0, +** Processing line: ~ h: opts.h || 0).x~ +- Inside source: true +*** True Line Result + h: opts.h || 0).x +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def to_layout_w~ +- Inside source: true +*** True Line Result + def to_layout_w +** Processing line: ~ $layout.rect(row: 0, col: 0, w: self, h: 1).w~ +- Inside source: true +*** True Line Result + $layout.rect(row: 0, col: 0, w: self, h: 1).w +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def to_layout_h~ +- Inside source: true +*** True Line Result + def to_layout_h +** Processing line: ~ $layout.rect(row: 0, col: 0, w: 1, h: self).h~ +- Inside source: true +*** True Line Result + $layout.rect(row: 0, col: 0, w: 1, h: self).h +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def to_layout_row_from_bottom opts = {}~ +- Inside source: true +*** True Line Result + def to_layout_row_from_bottom opts = {} +** Processing line: ~ ($layout.row_max_index - self).to_layout_row opts~ +- Inside source: true +*** True Line Result + ($layout.row_max_index - self).to_layout_row opts +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def to_layout_col_from_right opts = {}~ +- Inside source: true +*** True Line Result + def to_layout_col_from_right opts = {} +** Processing line: ~ ($layout.col_max_index - self).to_layout_col opts~ +- Inside source: true +*** True Line Result + ($layout.col_max_index - self).to_layout_col opts +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result @@ -165555,6 +174314,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def third~ +- Inside source: true +*** True Line Result + def third +** Processing line: ~ self / 3.0~ +- Inside source: true +*** True Line Result + self / 3.0 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def quarter~ +- Inside source: true +*** True Line Result + def quarter +** Processing line: ~ self / 4.0~ +- Inside source: true +*** True Line Result + self / 4.0 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def to_byte~ - Inside source: true *** True Line Result @@ -165571,6 +174362,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def clamp *opts~ +- Inside source: true +*** True Line Result + def clamp *opts +** Processing line: ~ min = (opts.at 0)~ +- Inside source: true +*** True Line Result + min = (opts.at 0) +** Processing line: ~ max = (opts.at 1)~ +- Inside source: true +*** True Line Result + max = (opts.at 1) +** Processing line: ~ return min if min && self < min~ +- Inside source: true +*** True Line Result + return min if min && self < min +** Processing line: ~ return max if max && self > max~ +- Inside source: true +*** True Line Result + return max if max && self > max +** Processing line: ~ return self~ +- Inside source: true +*** True Line Result + return self +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def clamp_wrap min, max~ - Inside source: true *** True Line Result @@ -166467,10 +175290,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Converts a number representing an angle in radians to degress.~ +** Processing line: ~ # Converts a number representing an angle in radians to degrees.~ - Inside source: true *** True Line Result - # Converts a number representing an angle in radians to degress. + # Converts a number representing an angle in radians to degrees. ** Processing line: ~ #~ - Inside source: true *** True Line Result @@ -166535,10 +175358,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns a normal vector for a number that represents an angle in degrees.~ - Inside source: true *** True Line Result - # Returns a normal vector for a number that represents an angle in degress. + # Returns a normal vector for a number that represents an angle in degrees. ** Processing line: ~ #~ - Inside source: true *** True Line Result @@ -166563,10 +175386,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns the y component of a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns the y component of a normal vector for a number that represents an angle in degrees.~ - Inside source: true *** True Line Result - # Returns the y component of a normal vector for a number that represents an angle in degress. + # Returns the y component of a normal vector for a number that represents an angle in degrees. ** Processing line: ~ #~ - Inside source: true *** True Line Result @@ -166591,10 +175414,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns the x component of a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns the x component of a normal vector for a number that represents an angle in degrees.~ - Inside source: true *** True Line Result - # Returns the x component of a normal vector for a number that represents an angle in degress. + # Returns the x component of a normal vector for a number that represents an angle in degrees. ** Processing line: ~ #~ - Inside source: true *** True Line Result @@ -166699,6 +175522,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 multiply n~ +- Inside source: true +*** True Line Result + def multiply n +** Processing line: ~ self * n~ +- Inside source: true +*** True Line Result + self * n +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def fmult n~ +- Inside source: true +*** True Line Result + def fmult n +** Processing line: ~ self * n.to_f~ +- Inside source: true +*** True Line Result + self * n.to_f +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def imult n~ +- Inside source: true +*** True Line Result + def imult n +** Processing line: ~ (self * n).to_i~ +- Inside source: true +*** True Line Result + (self * n).to_i +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def mult n~ - Inside source: true *** True Line Result @@ -167183,30 +176054,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def == other~ -- Inside source: true -*** True Line Result - def == other -** Processing line: ~ return true if __original_eq_eq__ other~ -- Inside source: true -*** True Line Result - return true if __original_eq_eq__ other -** Processing line: ~ return __original_eq_eq__ other.entity_id if other.is_a? OpenEntity~ -- Inside source: true -*** True Line Result - return __original_eq_eq__ other.entity_id if other.is_a? OpenEntity -** Processing line: ~ return false~ -- Inside source: true -*** True Line Result - return false -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result @@ -167551,14 +176398,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def - other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self - other~ - Inside source: true *** True Line Result - super + self - other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167579,14 +176426,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def + other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self + other~ - Inside source: true *** True Line Result - super + self + other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167607,14 +176454,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def * other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self * other~ - Inside source: true *** True Line Result - super + self * other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167635,14 +176482,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def / other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self / other~ - Inside source: true *** True Line Result - super + self / other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167757,6 +176604,22 @@ Follows is a source code listing for all files that have been open sourced. This n.clamp min, max ** Processing line: ~ end~ - Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def mid? l, r~ +- Inside source: true +*** True Line Result + def mid? l, r +** Processing line: ~ (between? l, r) || (between? r, l)~ +- Inside source: true +*** True Line Result + (between? l, r) || (between? r, l) +** Processing line: ~ end~ +- Inside source: true *** True Line Result end ** Processing line: ~ end~ @@ -167863,14 +176726,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def + other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self + other~ - Inside source: true *** True Line Result - super + self + other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167891,14 +176754,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def * other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self * other~ - Inside source: true *** True Line Result - super + self * other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167919,14 +176782,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def / other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self / other~ - Inside source: true *** True Line Result - super + self / other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167947,14 +176810,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def - other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other -** Processing line: ~ super~ + return self unless other +** Processing line: ~ self - other~ - Inside source: true *** True Line Result - super + self - other ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -167971,30 +176834,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def == other~ -- Inside source: true -*** True Line Result - def == other -** Processing line: ~ return true if __original_eq_eq__ other~ -- Inside source: true -*** True Line Result - return true if __original_eq_eq__ other -** Processing line: ~ return __original_eq_eq__ other.entity_id if other.is_a? GTK::OpenEntity~ -- Inside source: true -*** True Line Result - return __original_eq_eq__ other.entity_id if other.is_a? GTK::OpenEntity -** Processing line: ~ return false~ -- Inside source: true -*** True Line Result - return false -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # Returns `-1` if the number is less than `0`. `+1` if the number~ - Inside source: true *** True Line Result @@ -168219,10 +177058,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def - other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other + return self unless other ** Processing line: ~ super~ - Inside source: true *** True Line Result @@ -168247,10 +177086,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def + other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other + return self unless other ** Processing line: ~ super~ - Inside source: true *** True Line Result @@ -168275,10 +177114,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def * other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other + return self unless other ** Processing line: ~ super~ - Inside source: true *** True Line Result @@ -168303,10 +177142,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def / other -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ - Inside source: true *** True Line Result - return nil unless other + return self unless other ** Processing line: ~ super~ - Inside source: true *** True Line Result @@ -168489,6 +177328,22 @@ Follows is a source code listing for all files that have been open sourced. This false ** Processing line: ~ end~ - Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def center other~ +- Inside source: true +*** True Line Result + def center other +** Processing line: ~ (self - other).abs.fdiv(2)~ +- Inside source: true +*** True Line Result + (self - other).abs.fdiv(2) +** Processing line: ~ end~ +- Inside source: true *** True Line Result end ** Processing line: ~ end~ @@ -168719,10 +177574,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @local_state.hotload_client ||= @local_state.new_entity(:hotload_client, -** Processing line: ~ notes: "This enitity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",~ +** Processing line: ~ notes: "This entity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",~ - Inside source: true *** True Line Result - notes: "This enitity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.", + notes: "This entity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.", ** Processing line: ~ changes: { },~ - Inside source: true *** True Line Result @@ -169427,10 +178282,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result token = (word.split " ")[-1] -** Processing line: ~ dots = (token.split ".")~ +** Processing line: ~ dots = (token.split ".").flat_map { |s| s.split "[" }.flat_map { |s| s.split "]" }.flat_map { |s| s.split "(" }.flat_map { |s| s.split ")" }~ - Inside source: true *** True Line Result - dots = (token.split ".") + dots = (token.split ".").flat_map { |s| s.split "[" }.flat_map { |s| s.split "]" }.flat_map { |s| s.split "(" }.flat_map { |s| s.split ")" } ** Processing line: ~ dot = dots[-1]~ - Inside source: true *** True Line Result @@ -169511,6 +178366,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result keys = keys.map { |k| k.to_s } +** Processing line: ~ keys = keys.reject { |k| k.include? '"' }~ +- Inside source: true +*** True Line Result + keys = keys.reject { |k| k.include? '"' } +** Processing line: ~ .reject { |k| k.start_with? "'" }~ +- Inside source: true +*** True Line Result + .reject { |k| k.start_with? "'" } +** Processing line: ~ .reject { |k| k.include? "," }~ +- Inside source: true +*** True Line Result + .reject { |k| k.include? "," } +** Processing line: ~ .reject { |k| k.start_with? "#" }~ +- Inside source: true +*** True Line Result + .reject { |k| k.start_with? "#" } ** Processing line: ~ others = ["def", "end"] +~ - Inside source: true *** True Line Result @@ -169739,6 +178610,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ if dot[0].upcase == dot[0] && (Object.const_defined? dot.to_sym)~ +- Inside source: true +*** True Line Result + if dot[0].upcase == dot[0] && (Object.const_defined? dot.to_sym) +** Processing line: ~ return (Object.const_get dot.to_sym).autocomplete_methods~ +- Inside source: true +*** True Line Result + return (Object.const_get dot.to_sym).autocomplete_methods +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ start_collecting = false~ - Inside source: true *** True Line Result @@ -169799,10 +178686,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ return autocomplete_filter_methods target.as_hash.keys~ +** Processing line: ~ if target.respond_to? :as_hash~ +- Inside source: true +*** True Line Result + if target.respond_to? :as_hash +** Processing line: ~ return autocomplete_filter_methods target.as_hash.keys~ +- Inside source: true +*** True Line Result + return autocomplete_filter_methods target.as_hash.keys +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ return autocomplete_filter_methods target.autocomplete_methods~ - Inside source: true *** True Line Result - return autocomplete_filter_methods target.as_hash.keys + return autocomplete_filter_methods target.autocomplete_methods +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -169815,6 +178718,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ text = text.each_line.reject { |l| l.strip.start_with? "#" }.join "\n"~ +- Inside source: true +*** True Line Result + text = text.each_line.reject { |l| l.strip.start_with? "#" }.join "\n" +** Processing line: ~ text = text.each_line.map { |l| l.split("#").first }.join "\n"~ +- Inside source: true +*** True Line Result + text = text.each_line.map { |l| l.split("#").first }.join "\n" ** Processing line: ~ text.gsub!("[", " ")~ - Inside source: true *** True Line Result @@ -169879,22 +178790,22 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~*** runtime/draw.rb~ +** Processing line: ~*** runtime/benchmark.rb~ - Header detected. *** True Line Result *** True Line Result -*** runtime/draw.rb +*** runtime/benchmark.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/runtime/draw.rb~ +** Processing line: ~ # ./dragon/runtime/benchmark.rb~ - Inside source: true *** True Line Result - # ./dragon/runtime/draw.rb + # ./dragon/runtime/benchmark.rb ** Processing line: ~ # Copyright 2019 DragonRuby LLC~ - Inside source: true *** True Line Result @@ -169903,10 +178814,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # MIT License -** Processing line: ~ # draw.rb has been released under MIT (*only this file*).~ +** Processing line: ~ # benchmark.rb has been released under MIT (*only this file*).~ - Inside source: true *** True Line Result - # draw.rb has been released under MIT (*only this file*). + # benchmark.rb has been released under MIT (*only this file*). ** Processing line: ~~ - Inside source: true *** True Line Result @@ -169919,66 +178830,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result class Runtime -** Processing line: ~ module Draw~ -- Inside source: true -*** True Line Result - module Draw -** Processing line: ~ def primitives pass~ -- Inside source: true -*** True Line Result - def primitives pass -** Processing line: ~ if $top_level.respond_to? :primitives_override~ -- Inside source: true -*** True Line Result - if $top_level.respond_to? :primitives_override -** Processing line: ~ return $top_level.tick_render @args, pass~ -- Inside source: true -*** True Line Result - return $top_level.tick_render @args, pass -** Processing line: ~ end~ +** Processing line: ~ module Benchmark~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + module Benchmark +** Processing line: ~ def benchmark_single iterations, name, proc~ - Inside source: true *** True Line Result - -** Processing line: ~ # Don't change this draw order unless you understand~ + def benchmark_single iterations, name, proc +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - # Don't change this draw order unless you understand -** Processing line: ~ # the implications.~ + log <<-S +** Processing line: ~ ** Invoking :#{name}...~ - Inside source: true *** True Line Result - # the implications. -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ # pass.solids.each { |s| draw_solid s }~ + ** Invoking :#{name}... +** Processing line: ~ S~ - Inside source: true *** True Line Result - # pass.solids.each { |s| draw_solid s } -** Processing line: ~ # while loops are faster than each with block~ + S +** Processing line: ~ time_start = Time.now~ - Inside source: true *** True Line Result - # while loops are faster than each with block + time_start = Time.now ** Processing line: ~ idx = 0~ - Inside source: true *** True Line Result idx = 0 -** Processing line: ~ length = pass.solids.length~ +** Processing line: ~ r = nil~ - Inside source: true *** True Line Result - length = pass.solids.length -** Processing line: ~ while idx < pass.solids.length~ + r = nil +** Processing line: ~ while idx < iterations~ - Inside source: true *** True Line Result - while idx < pass.solids.length -** Processing line: ~ draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster~ + while idx < iterations +** Processing line: ~ r = proc.call~ - Inside source: true *** True Line Result - draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster + r = proc.call ** Processing line: ~ idx += 1~ - Inside source: true *** True Line Result @@ -169991,158 +178882,182 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_solids.each { |s| draw_solid s }~ +** Processing line: ~ result = (Time.now - time_start).round 3~ - Inside source: true *** True Line Result - # pass.static_solids.each { |s| draw_solid s } -** Processing line: ~ idx = 0~ + result = (Time.now - time_start).round 3 +** Processing line: ~~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_solids.length~ + +** Processing line: ~ { name: name,~ - Inside source: true *** True Line Result - length = pass.static_solids.length -** Processing line: ~ while idx < length~ + { name: name, +** Processing line: ~ time: result,~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_solid (pass.static_solids.at idx)~ + time: result, +** Processing line: ~ time_ms: (result * 1000).to_i }~ - Inside source: true *** True Line Result - draw_solid (pass.static_solids.at idx) -** Processing line: ~ idx += 1~ + time_ms: (result * 1000).to_i } +** Processing line: ~ end~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ def benchmark opts = {}~ +- Inside source: true +*** True Line Result + def benchmark opts = {} +** Processing line: ~ iterations = opts.iterations~ +- Inside source: true +*** True Line Result + iterations = opts.iterations ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # pass.sprites.each { |s| draw_sprite s }~ +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - # pass.sprites.each { |s| draw_sprite s } -** Processing line: ~ idx = 0~ + log <<-S +** Processing line: ~ * BENCHMARK: Started~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.sprites.length~ + * BENCHMARK: Started +** Processing line: ~ ** Caller: #{(caller || []).first}~ - Inside source: true *** True Line Result - length = pass.sprites.length -** Processing line: ~ while idx < length~ + ** Caller: #{(caller || []).first} +** Processing line: ~ ** Iterations: #{iterations}~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_sprite (pass.sprites.at idx)~ + ** Iterations: #{iterations} +** Processing line: ~ S~ - Inside source: true *** True Line Result - draw_sprite (pass.sprites.at idx) -** Processing line: ~ idx += 1~ + S +** Processing line: ~ procs = opts.find_all { |k, v| v.respond_to? :call }~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + procs = opts.find_all { |k, v| v.respond_to? :call } +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ times = procs.map do |(name, proc)|~ +- Inside source: true +*** True Line Result + times = procs.map do |(name, proc)| +** Processing line: ~ benchmark_single iterations, name, proc~ +- Inside source: true +*** True Line Result + benchmark_single iterations, name, proc +** Processing line: ~ end.sort_by { |r| r.time }~ +- Inside source: true +*** True Line Result + end.sort_by { |r| r.time } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_sprites.each { |s| draw_sprite s }~ +** Processing line: ~ first_place = times.first~ - Inside source: true *** True Line Result - # pass.static_sprites.each { |s| draw_sprite s } -** Processing line: ~ idx = 0~ + first_place = times.first +** Processing line: ~ second_place = times.second || first_place~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_sprites.length~ + second_place = times.second || first_place +** Processing line: ~~ - Inside source: true *** True Line Result - length = pass.static_sprites.length -** Processing line: ~ while idx < length~ + +** Processing line: ~ times = times.map do |candidate|~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_sprite (pass.static_sprites.at idx)~ + times = times.map do |candidate| +** Processing line: ~ average_time = first_place.time~ - Inside source: true *** True Line Result - draw_sprite (pass.static_sprites.at idx) -** Processing line: ~ idx += 1~ + average_time = first_place.time +** Processing line: ~ .add(candidate.time)~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + .add(candidate.time) +** Processing line: ~ .abs~ - Inside source: true *** True Line Result - end + .abs +** Processing line: ~ .fdiv(2)~ +- Inside source: true +*** True Line Result + .fdiv(2) ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # pass.primitives.each { |p| draw_primitive p }~ +** Processing line: ~ difference_percentage = 0~ - Inside source: true *** True Line Result - # pass.primitives.each { |p| draw_primitive p } -** Processing line: ~ idx = 0~ + difference_percentage = 0 +** Processing line: ~ if average_time == 0~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.primitives.length~ + if average_time == 0 +** Processing line: ~ difference_percentage = 0~ - Inside source: true *** True Line Result - length = pass.primitives.length -** Processing line: ~ while idx < length~ + difference_percentage = 0 +** Processing line: ~ else~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.primitives.at idx)~ + else +** Processing line: ~ difference_percentage = first_place.time~ - Inside source: true *** True Line Result - draw_primitive (pass.primitives.at idx) -** Processing line: ~ idx += 1~ + difference_percentage = first_place.time +** Processing line: ~ .subtract(candidate.time)~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + .subtract(candidate.time) +** Processing line: ~ .abs~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + .abs +** Processing line: ~ .fdiv(average_time)~ - Inside source: true *** True Line Result - -** Processing line: ~ # pass.static_primitives.each { |p| draw_primitive p }~ + .fdiv(average_time) +** Processing line: ~ .imult(100)~ - Inside source: true *** True Line Result - # pass.static_primitives.each { |p| draw_primitive p } -** Processing line: ~ idx = 0~ + .imult(100) +** Processing line: ~ end~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_primitives.length~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - length = pass.static_primitives.length -** Processing line: ~ while idx < length~ + +** Processing line: ~ difference_time = ((first_place.time - candidate.time) * 1000).round~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.static_primitives.at idx)~ + difference_time = ((first_place.time - candidate.time) * 1000).round +** Processing line: ~ candidate.merge(difference_percentage: difference_percentage,~ - Inside source: true *** True Line Result - draw_primitive (pass.static_primitives.at idx) -** Processing line: ~ idx += 1~ + candidate.merge(difference_percentage: difference_percentage, +** Processing line: ~ difference_time: difference_time)~ - Inside source: true *** True Line Result - idx += 1 + difference_time: difference_time) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170151,30 +179066,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # pass.labels.each { |l| draw_label l }~ +** Processing line: ~ too_small_to_measure = false~ - Inside source: true *** True Line Result - # pass.labels.each { |l| draw_label l } -** Processing line: ~ idx = 0~ + too_small_to_measure = false +** Processing line: ~ if (first_place.time + second_place.time) == 0~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.labels.length~ + if (first_place.time + second_place.time) == 0 +** Processing line: ~ too_small_to_measure = true~ - Inside source: true *** True Line Result - length = pass.labels.length -** Processing line: ~ while idx < length~ + too_small_to_measure = true +** Processing line: ~ difference_percentage = 0~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_label (pass.labels.at idx)~ + difference_percentage = 0 +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - draw_label (pass.labels.at idx) -** Processing line: ~ idx += 1~ + log <<-S +** Processing line: ~ * BENCHMARK: Average time for experiments were too small. Increase the number of iterations.~ - Inside source: true *** True Line Result - idx += 1 + * BENCHMARK: Average time for experiments were too small. Increase the number of iterations. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ difference_percentage = (((first_place.time - second_place.time).abs.fdiv((first_place.time + second_place.time).abs.fdiv(2))) * 100).round~ +- Inside source: true +*** True Line Result + difference_percentage = (((first_place.time - second_place.time).abs.fdiv((first_place.time + second_place.time).abs.fdiv(2))) * 100).round ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170183,126 +179110,118 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_labels.each { |l| draw_label l }~ +** Processing line: ~ difference_time = first_place.time.-(second_place.time).*(1000).abs.round~ - Inside source: true *** True Line Result - # pass.static_labels.each { |l| draw_label l } -** Processing line: ~ idx = 0~ -- Inside source: true -*** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_labels.length~ + difference_time = first_place.time.-(second_place.time).*(1000).abs.round +** Processing line: ~~ - Inside source: true *** True Line Result - length = pass.static_labels.length -** Processing line: ~ while idx < length~ + +** Processing line: ~ r = {~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_label (pass.static_labels.at idx)~ + r = { +** Processing line: ~ iterations: iterations,~ - Inside source: true *** True Line Result - draw_label (pass.static_labels.at idx) -** Processing line: ~ idx += 1~ + iterations: iterations, +** Processing line: ~ first_place: first_place,~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + first_place: first_place, +** Processing line: ~ second_place: second_place,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + second_place: second_place, +** Processing line: ~ difference_time: difference_time,~ - Inside source: true *** True Line Result - -** Processing line: ~ # pass.lines.each { |l| draw_line l }~ + difference_time: difference_time, +** Processing line: ~ difference_percentage: difference_percentage,~ - Inside source: true *** True Line Result - # pass.lines.each { |l| draw_line l } -** Processing line: ~ idx = 0~ + difference_percentage: difference_percentage, +** Processing line: ~ times: times,~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.lines.length~ + times: times, +** Processing line: ~ too_small_to_measure: too_small_to_measure~ - Inside source: true *** True Line Result - length = pass.lines.length -** Processing line: ~ while idx < length~ + too_small_to_measure: too_small_to_measure +** Processing line: ~ }~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_line (pass.lines.at idx)~ + } +** Processing line: ~~ - Inside source: true *** True Line Result - draw_line (pass.lines.at idx) -** Processing line: ~ idx += 1~ + +** Processing line: ~ log_message = []~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + log_message = [] +** Processing line: ~ only_one_result = first_place.name == second_place.name~ - Inside source: true *** True Line Result - end + only_one_result = first_place.name == second_place.name ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_lines.each { |l| draw_line l }~ +** Processing line: ~ if only_one_result~ - Inside source: true *** True Line Result - # pass.static_lines.each { |l| draw_line l } -** Processing line: ~ idx = 0~ + if only_one_result +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_lines.length~ + log <<-S +** Processing line: ~ * BENCHMARK: #{r.first_place.name} completed in #{r.first_place.time_ms}ms."~ - Inside source: true *** True Line Result - length = pass.static_lines.length -** Processing line: ~ while idx < pass.static_lines.length~ -- Inside source: true -*** True Line Result - while idx < pass.static_lines.length -** Processing line: ~ draw_line (pass.static_lines.at idx)~ + * BENCHMARK: #{r.first_place.name} completed in #{r.first_place.time_ms}ms." +** Processing line: ~ S~ - Inside source: true *** True Line Result - draw_line (pass.static_lines.at idx) -** Processing line: ~ idx += 1~ + S +** Processing line: ~ else~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + else +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + log <<-S +** Processing line: ~ * BENCHMARK: #{r.message}~ - Inside source: true *** True Line Result - -** Processing line: ~ # pass.borders.each { |b| draw_border b }~ + * BENCHMARK: #{r.message} +** Processing line: ~ ** Fastest: #{r.first_place.name.inspect}~ - Inside source: true *** True Line Result - # pass.borders.each { |b| draw_border b } -** Processing line: ~ idx = 0~ + ** Fastest: #{r.first_place.name.inspect} +** Processing line: ~ ** Second: #{r.second_place.name.inspect}~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.borders.length~ + ** Second: #{r.second_place.name.inspect} +** Processing line: ~ ** Margin: #{r.difference_percentage}% (#{r.difference_time.abs}ms) #{r.first_place.time_ms}ms vs #{r.second_place.time_ms}ms.~ - Inside source: true *** True Line Result - length = pass.borders.length -** Processing line: ~ while idx < length~ + ** Margin: #{r.difference_percentage}% (#{r.difference_time.abs}ms) #{r.first_place.time_ms}ms vs #{r.second_place.time_ms}ms. +** Processing line: ~ ** Times:~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_border (pass.borders.at idx)~ + ** Times: +** Processing line: ~ #{r.times.map { |t| "*** #{t.name}: #{t.time_ms}ms (#{t.difference_percentage}% #{t.difference_time.abs}ms)." }.join("\n")}~ - Inside source: true *** True Line Result - draw_border (pass.borders.at idx) -** Processing line: ~ idx += 1~ + #{r.times.map { |t| "*** #{t.name}: #{t.time_ms}ms (#{t.difference_percentage}% #{t.difference_time.abs}ms)." }.join("\n")} +** Processing line: ~ S~ - Inside source: true *** True Line Result - idx += 1 + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170311,102 +179230,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_borders.each { |b| draw_border b }~ +** Processing line: ~ r~ - Inside source: true *** True Line Result - # pass.static_borders.each { |b| draw_border b } -** Processing line: ~ idx = 0~ + r +** Processing line: ~ end~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_borders.length~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - length = pass.static_borders.length -** Processing line: ~ while idx < length~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_border (pass.static_borders.at idx)~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - draw_border (pass.static_borders.at idx) -** Processing line: ~ idx += 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ -- Inside source: true + +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. *** True Line Result - end +#+end_src ** Processing line: ~~ -- Inside source: true +- End of paragraph detected. *** True Line Result -** Processing line: ~ if !$gtk.production~ -- Inside source: true +** Processing line: ~*** runtime/draw.rb~ +- Header detected. *** True Line Result - if !$gtk.production -** Processing line: ~ # pass.debug.each { |r| draw_primitive r }~ -- Inside source: true + *** True Line Result - # pass.debug.each { |r| draw_primitive r } -** Processing line: ~ idx = 0~ -- Inside source: true +*** runtime/draw.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. *** True Line Result - idx = 0 -** Processing line: ~ length = pass.debug.length~ -- Inside source: true + *** True Line Result - length = pass.debug.length -** Processing line: ~ while idx < length~ +#+begin_src ruby +** Processing line: ~ # ./dragon/runtime/draw.rb~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.debug.at idx)~ + # ./dragon/runtime/draw.rb +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ - Inside source: true *** True Line Result - draw_primitive (pass.debug.at idx) -** Processing line: ~ idx += 1~ + # Copyright 2019 DragonRuby LLC +** Processing line: ~ # MIT License~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + # MIT License +** Processing line: ~ # draw.rb has been released under MIT (*only this file*).~ - Inside source: true *** True Line Result - end + # draw.rb has been released under MIT (*only this file*). ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # pass.static_debug.each { |r| draw_primitive r }~ -- Inside source: true -*** True Line Result - # pass.static_debug.each { |r| draw_primitive r } -** Processing line: ~ idx = 0~ +** Processing line: ~ module GTK~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_debug.length~ + module GTK +** Processing line: ~ class Runtime~ - Inside source: true *** True Line Result - length = pass.static_debug.length -** Processing line: ~ while idx < length~ + class Runtime +** Processing line: ~ module Draw~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.static_debug.at idx)~ + module Draw +** Processing line: ~ def primitives pass~ - Inside source: true *** True Line Result - draw_primitive (pass.static_debug.at idx) -** Processing line: ~ idx += 1~ + def primitives pass +** Processing line: ~ if $top_level.respond_to? :primitives_override~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + if $top_level.respond_to? :primitives_override +** Processing line: ~ return $top_level.tick_render @args, pass~ - Inside source: true *** True Line Result - end + return $top_level.tick_render @args, pass ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170415,66 +179326,86 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # pass.reserved.each { |r| draw_primitive r }~ +** Processing line: ~ fn.each_send pass.solids, self, :draw_solid~ - Inside source: true *** True Line Result - # pass.reserved.each { |r| draw_primitive r } -** Processing line: ~ idx = 0~ + fn.each_send pass.solids, self, :draw_solid +** Processing line: ~ fn.each_send pass.static_solids, self, :draw_solid~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.reserved.length~ + fn.each_send pass.static_solids, self, :draw_solid +** Processing line: ~ fn.each_send pass.sprites, self, :draw_sprite~ - Inside source: true *** True Line Result - length = pass.reserved.length -** Processing line: ~ while idx < length~ + fn.each_send pass.sprites, self, :draw_sprite +** Processing line: ~ fn.each_send pass.static_sprites, self, :draw_sprite~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.reserved.at idx)~ + fn.each_send pass.static_sprites, self, :draw_sprite +** Processing line: ~ fn.each_send pass.primitives, self, :draw_primitive~ - Inside source: true *** True Line Result - draw_primitive (pass.reserved.at idx) -** Processing line: ~ idx += 1~ + fn.each_send pass.primitives, self, :draw_primitive +** Processing line: ~ fn.each_send pass.static_primitives, self, :draw_primitive~ - Inside source: true *** True Line Result - idx += 1 -** Processing line: ~ end~ + fn.each_send pass.static_primitives, self, :draw_primitive +** Processing line: ~ fn.each_send pass.labels, self, :draw_label~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + fn.each_send pass.labels, self, :draw_label +** Processing line: ~ fn.each_send pass.static_labels, self, :draw_label~ - Inside source: true *** True Line Result - -** Processing line: ~ # pass.static_reserved.each { |r| draw_primitive r }~ + fn.each_send pass.static_labels, self, :draw_label +** Processing line: ~ fn.each_send pass.lines, self, :draw_line~ - Inside source: true *** True Line Result - # pass.static_reserved.each { |r| draw_primitive r } -** Processing line: ~ idx = 0~ + fn.each_send pass.lines, self, :draw_line +** Processing line: ~ fn.each_send pass.static_lines, self, :draw_line~ - Inside source: true *** True Line Result - idx = 0 -** Processing line: ~ length = pass.static_reserved.length~ + fn.each_send pass.static_lines, self, :draw_line +** Processing line: ~ fn.each_send pass.borders, self, :draw_border~ - Inside source: true *** True Line Result - length = pass.static_reserved.length -** Processing line: ~ while idx < length~ + fn.each_send pass.borders, self, :draw_border +** Processing line: ~ fn.each_send pass.static_borders, self, :draw_border~ - Inside source: true *** True Line Result - while idx < length -** Processing line: ~ draw_primitive (pass.static_reserved.at idx)~ + fn.each_send pass.static_borders, self, :draw_border +** Processing line: ~~ - Inside source: true *** True Line Result - draw_primitive (pass.static_reserved.at idx) -** Processing line: ~ idx += 1~ + +** Processing line: ~ if !$gtk.production~ - Inside source: true *** True Line Result - idx += 1 + if !$gtk.production +** Processing line: ~ fn.each_send pass.debug, self, :draw_primitive~ +- Inside source: true +*** True Line Result + fn.each_send pass.debug, self, :draw_primitive +** Processing line: ~ fn.each_send pass.static_debug, self, :draw_primitive~ +- Inside source: true +*** True Line Result + fn.each_send pass.static_debug, self, :draw_primitive ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ fn.each_send pass.reserved, self, :draw_primitive~ +- Inside source: true +*** True Line Result + fn.each_send pass.reserved, self, :draw_primitive +** Processing line: ~ fn.each_send pass.static_reserved, self, :draw_primitive~ +- Inside source: true +*** True Line Result + fn.each_send pass.static_reserved, self, :draw_primitive ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -170515,10 +179446,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a~ +** Processing line: ~ @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,~ +- Inside source: true +*** True Line Result + @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h, +** Processing line: ~ s.r, s.g, s.b, s.a,~ +- Inside source: true +*** True Line Result + s.r, s.g, s.b, s.a, +** Processing line: ~ (s.blendmode_enum || 1)~ - Inside source: true *** True Line Result - @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a + (s.blendmode_enum || 1) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170559,14 +179498,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h,~ +** Processing line: ~ @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result - @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h, -** Processing line: ~ s.path.s_or_default,~ + @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h, +** Processing line: ~ (s.path || '').to_s,~ - Inside source: true *** True Line Result - s.path.s_or_default, + (s.path || '').to_s, ** Processing line: ~ s.angle,~ - Inside source: true *** True Line Result @@ -170587,10 +179526,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result s.angle_anchor_x, s.angle_anchor_y, -** Processing line: ~ s.source_x, s.source_y, s.source_w, s.source_h~ +** Processing line: ~ s.source_x, s.source_y, s.source_w, s.source_h,~ - Inside source: true *** True Line Result - s.source_x, s.source_y, s.source_w, s.source_h + s.source_x, s.source_y, s.source_w, s.source_h, +** Processing line: ~ (s.blendmode_enum || 1)~ +- Inside source: true +*** True Line Result + (s.blendmode_enum || 1) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170631,10 +179574,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_screenshot s.path.s_or_default,~ +** Processing line: ~ @ffi_draw.draw_screenshot (s.path || '').to_s,~ - Inside source: true *** True Line Result - @ffi_draw.draw_screenshot s.path.s_or_default, + @ffi_draw.draw_screenshot (s.path || '').to_s, ** Processing line: ~ s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result @@ -170703,22 +179646,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_label l.x, l.y, l.text.s_or_default,~ +** Processing line: ~ @ffi_draw.draw_label_3 l.x, l.y,~ +- Inside source: true +*** True Line Result + @ffi_draw.draw_label_3 l.x, l.y, +** Processing line: ~ (l.text || '').to_s,~ +- Inside source: true +*** True Line Result + (l.text || '').to_s, +** Processing line: ~ l.size_enum, l.alignment_enum,~ - Inside source: true *** True Line Result - @ffi_draw.draw_label l.x, l.y, l.text.s_or_default, -** Processing line: ~ l.size_enum, l.alignment_enum,~ + l.size_enum, l.alignment_enum, +** Processing line: ~ l.r, l.g, l.b, l.a,~ - Inside source: true *** True Line Result - l.size_enum, l.alignment_enum, -** Processing line: ~ l.r, l.g, l.b, l.a,~ + l.r, l.g, l.b, l.a, +** Processing line: ~ l.font,~ - Inside source: true *** True Line Result - l.r, l.g, l.b, l.a, -** Processing line: ~ l.font.s_or_default(nil)~ + l.font, +** Processing line: ~ (l.vertical_alignment_enum || 2),~ - Inside source: true *** True Line Result - l.font.s_or_default(nil) + (l.vertical_alignment_enum || 2), +** Processing line: ~ (l.blendmode_enum || 1)~ +- Inside source: true +*** True Line Result + (l.blendmode_enum || 1) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170759,10 +179714,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a~ +** Processing line: ~ if l.x2~ +- Inside source: true +*** True Line Result + if l.x2 +** Processing line: ~ @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,~ +- Inside source: true +*** True Line Result + @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2, +** Processing line: ~ l.r, l.g, l.b, l.a,~ +- Inside source: true +*** True Line Result + l.r, l.g, l.b, l.a, +** Processing line: ~ (l.blendmode_enum || 1)~ +- Inside source: true +*** True Line Result + (l.blendmode_enum || 1) +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ w = l.w || 0~ +- Inside source: true +*** True Line Result + w = l.w || 0 +** Processing line: ~ w = 1 if w == 0~ +- Inside source: true +*** True Line Result + w = 1 if w == 0 +** Processing line: ~ h = l.h || 0~ +- Inside source: true +*** True Line Result + h = l.h || 0 +** Processing line: ~ h = 1 if h == 0~ +- Inside source: true +*** True Line Result + h = 1 if h == 0 +** Processing line: ~ @ffi_draw.draw_line_2 l.x, l.y,~ +- Inside source: true +*** True Line Result + @ffi_draw.draw_line_2 l.x, l.y, +** Processing line: ~ l.x + w - 1,~ +- Inside source: true +*** True Line Result + l.x + w - 1, +** Processing line: ~ l.y + h - 1,~ +- Inside source: true +*** True Line Result + l.y + h - 1, +** Processing line: ~ l.r, l.g, l.b, l.a,~ - Inside source: true *** True Line Result - @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a + l.r, l.g, l.b, l.a, +** Processing line: ~ (l.blendmode_enum || 1)~ +- Inside source: true +*** True Line Result + (l.blendmode_enum || 1) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170803,10 +179814,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else -** Processing line: ~ @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a~ +** Processing line: ~ @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result - @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a + @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h, +** Processing line: ~ s.r, s.g, s.b, s.a,~ +- Inside source: true +*** True Line Result + s.r, s.g, s.b, s.a, +** Processing line: ~ (s.blendmode_enum || 1)~ +- Inside source: true +*** True Line Result + (s.blendmode_enum || 1) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -170883,10 +179902,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -171755,10 +180770,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [ -** Processing line: ~ { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid,~ +** Processing line: ~ { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid!,~ - Inside source: true *** True Line Result - { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid, + { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid!, ** Processing line: ~ {~ - Inside source: true *** True Line Result @@ -171791,10 +180806,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -2 -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ - Inside source: true *** True Line Result - }.label, + }.label!, ** Processing line: ~ {~ - Inside source: true *** True Line Result @@ -171827,10 +180842,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -2 -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ - Inside source: true *** True Line Result - }.label, + }.label!, ** Processing line: ~ {~ - Inside source: true *** True Line Result @@ -171863,10 +180878,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -2 -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ - Inside source: true *** True Line Result - }.label, + }.label!, ** Processing line: ~ {~ - Inside source: true *** True Line Result @@ -171899,10 +180914,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -2 -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ - Inside source: true *** True Line Result - }.label, + }.label!, ** Processing line: ~ {~ - Inside source: true *** True Line Result @@ -171935,10 +180950,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result size_enum: -2 -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ - Inside source: true *** True Line Result - }.label, + }.label!, ** Processing line: ~ ]~ - Inside source: true *** True Line Result @@ -172039,10 +181054,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @mailbox_if_needed = 0 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # schema for file_mtimes~ +- Inside source: true +*** True Line Result + # schema for file_mtimes +** Processing line: ~ # { FILE_PATH: { current: (Time as Fixnum),~ +- Inside source: true +*** True Line Result + # { FILE_PATH: { current: (Time as Fixnum), +** Processing line: ~ # last: (Time as Fixnum) },~ +- Inside source: true +*** True Line Result + # last: (Time as Fixnum) }, +** Processing line: ~ # FILE_PATH: { current: (Time as Fixnum),~ +- Inside source: true +*** True Line Result + # FILE_PATH: { current: (Time as Fixnum), +** Processing line: ~ # last: (Time as Fixnum) } }~ +- Inside source: true +*** True Line Result + # last: (Time as Fixnum) } } ** Processing line: ~ @file_mtimes = { }~ - Inside source: true *** True Line Result @file_mtimes = { } +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ @suppress_mailbox = true~ - Inside source: true *** True Line Result @@ -172191,6 +181234,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result 'dragon/numeric.rb', +** Processing line: ~ 'dragon/hash_deprecated.rb',~ +- Inside source: true +*** True Line Result + 'dragon/hash_deprecated.rb', ** Processing line: ~ 'dragon/hash.rb',~ - Inside source: true *** True Line Result @@ -172319,6 +181366,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result 'dragon/hotload_client.rb', +** Processing line: ~ 'dragon/wizards.rb',~ +- Inside source: true +*** True Line Result + 'dragon/wizards.rb', ** Processing line: ~ 'dragon/ios_wizard.rb',~ - Inside source: true *** True Line Result @@ -172391,22 +181442,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def init_mtimes file -** Processing line: ~ current_key = "current_#{file}".to_sym~ +** Processing line: ~ @file_mtimes[file] ||= { current: @ffi_file.mtime(file),~ - Inside source: true *** True Line Result - current_key = "current_#{file}".to_sym -** Processing line: ~ last_key = "last_#{file}".to_sym~ + @file_mtimes[file] ||= { current: @ffi_file.mtime(file), +** Processing line: ~ last: @ffi_file.mtime(file) }~ - Inside source: true *** True Line Result - last_key = "last_#{file}".to_sym -** Processing line: ~ @file_mtimes[current_key] ||= @ffi_file.mtime(file)~ -- Inside source: true -*** True Line Result - @file_mtimes[current_key] ||= @ffi_file.mtime(file) -** Processing line: ~ @file_mtimes[last_key] ||= @ffi_file.mtime(file)~ -- Inside source: true -*** True Line Result - @file_mtimes[last_key] ||= @ffi_file.mtime(file) + last: @ffi_file.mtime(file) } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -172531,6 +181574,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def hotload_if_needed +** Processing line: ~ return if Kernel.tick_count < 0~ +- Inside source: true +*** True Line Result + return if Kernel.tick_count < 0 ** Processing line: ~ hotload_source_files~ - Inside source: true *** True Line Result @@ -172551,14 +181598,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def on_load_succeeded file -** Processing line: ~ @rcb_sender.files_reloaded << file~ +** Processing line: ~ self.files_reloaded << file~ - Inside source: true *** True Line Result - @rcb_sender.files_reloaded << file -** Processing line: ~ @rcb_sender.reloaded_files << file~ + self.files_reloaded << file +** Processing line: ~ self.reloaded_files << file~ - Inside source: true *** True Line Result - @rcb_sender.reloaded_files << file + self.reloaded_files << file ** Processing line: ~ Trace.untrace_classes!~ - Inside source: true *** True Line Result @@ -172571,42 +181618,82 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def reload_if_needed file, force = false~ +** Processing line: ~ def reset_all_mtimes~ - Inside source: true *** True Line Result - def reload_if_needed file, force = false -** Processing line: ~ current_key = "current_#{file}".to_sym~ + def reset_all_mtimes +** Processing line: ~ @file_mtimes.each do |file, _|~ - Inside source: true *** True Line Result - current_key = "current_#{file}".to_sym -** Processing line: ~ last_key = "last_#{file}".to_sym~ + @file_mtimes.each do |file, _| +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ - Inside source: true *** True Line Result - last_key = "last_#{file}".to_sym -** Processing line: ~ @file_mtimes[current_key] ||= nil~ + @file_mtimes[file].current = @ffi_file.mtime(file) +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ - Inside source: true *** True Line Result - @file_mtimes[current_key] ||= nil -** Processing line: ~ @file_mtimes[last_key] ||= nil~ + @file_mtimes[file].last = @file_mtimes[file].current +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ files_to_reload.each do |file, _|~ +- Inside source: true +*** True Line Result + files_to_reload.each do |file, _| +** Processing line: ~ @file_mtimes[file] ||= {}~ +- Inside source: true +*** True Line Result + @file_mtimes[file] ||= {} +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ +- Inside source: true +*** True Line Result + @file_mtimes[file].current = @ffi_file.mtime(file) +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ +- Inside source: true +*** True Line Result + @file_mtimes[file].last = @file_mtimes[file].current +** 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 reload_if_needed file, force = false~ +- Inside source: true +*** True Line Result + def reload_if_needed file, force = false +** Processing line: ~ @file_mtimes[file] ||= { current: @ffi_file.mtime(file), last: @ffi_file.mtime(file) }~ - Inside source: true *** True Line Result - @file_mtimes[last_key] ||= nil -** Processing line: ~ @file_mtimes[current_key] = @ffi_file.mtime(file)~ + @file_mtimes[file] ||= { current: @ffi_file.mtime(file), last: @ffi_file.mtime(file) } +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ - Inside source: true *** True Line Result - @file_mtimes[current_key] = @ffi_file.mtime(file) -** Processing line: ~ return if !force && @file_mtimes[last_key] == @file_mtimes[current_key]~ + @file_mtimes[file].current = @ffi_file.mtime(file) +** Processing line: ~ return if !force && @file_mtimes[file].current == @file_mtimes[file].last~ - Inside source: true *** True Line Result - return if !force && @file_mtimes[last_key] == @file_mtimes[current_key] + return if !force && @file_mtimes[file].current == @file_mtimes[file].last ** Processing line: ~ on_load_succeeded file if reload_ruby_file file~ - Inside source: true *** True Line Result on_load_succeeded file if reload_ruby_file file -** Processing line: ~ @file_mtimes[last_key] = @file_mtimes[current_key]~ +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ - Inside source: true *** True Line Result - @file_mtimes[last_key] = @file_mtimes[current_key] + @file_mtimes[file].last = @file_mtimes[file].current ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -172775,6 +181862,102 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def char_byte~ +- Inside source: true +*** True Line Result + def char_byte +** Processing line: ~ return nil if self.length == 0~ +- Inside source: true +*** True Line Result + return nil if self.length == 0 +** Processing line: ~ c = self.each_char.first.bytes~ +- Inside source: true +*** True Line Result + c = self.each_char.first.bytes +** Processing line: ~ c = c.first if c.is_a? Enumerable~ +- Inside source: true +*** True Line Result + c = c.first if c.is_a? Enumerable +** Processing line: ~ c~ +- Inside source: true +*** True Line Result + c +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def insert_character_at index, char~ +- Inside source: true +*** True Line Result + def insert_character_at index, char +** Processing line: ~ t = each_char.to_a~ +- Inside source: true +*** True Line Result + t = each_char.to_a +** Processing line: ~ t = (t.insert index, char)~ +- Inside source: true +*** True Line Result + t = (t.insert index, char) +** Processing line: ~ t.join~ +- Inside source: true +*** True Line Result + t.join +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def excluding_character_at index~ +- Inside source: true +*** True Line Result + def excluding_character_at index +** Processing line: ~ t = each_char.to_a~ +- Inside source: true +*** True Line Result + t = each_char.to_a +** Processing line: ~ t.delete_at index~ +- Inside source: true +*** True Line Result + t.delete_at index +** Processing line: ~ t.join~ +- Inside source: true +*** True Line Result + t.join +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def excluding_last_character~ +- Inside source: true +*** True Line Result + def excluding_last_character +** Processing line: ~ return "" if self.length <= 1~ +- Inside source: true +*** True Line Result + return "" if self.length <= 1 +** Processing line: ~ return excluding_character_at(self.length - 1)~ +- Inside source: true +*** True Line Result + return excluding_character_at(self.length - 1) +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def end_with_bang?~ - Inside source: true *** True Line Result @@ -173647,10 +182830,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result log "**** Test name: :#{h[:m]}" -** Processing line: ~ log "#{h[:e].to_s.gsub("* ERROR:", "").strip}"~ +** Processing line: ~ log "#{h[:e].to_s.gsub("* ERROR:", "").strip}\n#{h[:e].__backtrace_to_org__}"~ - Inside source: true *** True Line Result - log "#{h[:e].to_s.gsub("* ERROR:", "").strip}" + log "#{h[:e].to_s.gsub("* ERROR:", "").strip}\n#{h[:e].__backtrace_to_org__}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -174475,6 +183658,142 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ class Wizard~ +- Inside source: true +*** True Line Result + class Wizard +** Processing line: ~ def metadata_file_path~ +- Inside source: true +*** True Line Result + def metadata_file_path +** Processing line: ~ "metadata/game_metadata.txt"~ +- Inside source: true +*** True Line Result + "metadata/game_metadata.txt" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def get_metadata~ +- Inside source: true +*** True Line Result + def get_metadata +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +- Inside source: true +*** True Line Result + metadata = $gtk.read_file metadata_file_path +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if !metadata~ +- Inside source: true +*** True Line Result + if !metadata +** Processing line: ~ write_blank_metadata~ +- Inside source: true +*** True Line Result + write_blank_metadata +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +- Inside source: true +*** True Line Result + metadata = $gtk.read_file metadata_file_path +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ +- Inside source: true +*** True Line Result + dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ {~ +- Inside source: true +*** True Line Result + { +** Processing line: ~ dev_id: dev_id.strip.gsub("#", "").gsub("devid=", ""),~ +- Inside source: true +*** True Line Result + dev_id: dev_id.strip.gsub("#", "").gsub("devid=", ""), +** Processing line: ~ dev_title: dev_title.strip.gsub("#", "").gsub("devtitle=", ""),~ +- Inside source: true +*** True Line Result + dev_title: dev_title.strip.gsub("#", "").gsub("devtitle=", ""), +** Processing line: ~ game_id: game_id.strip.gsub("#", "").gsub("gameid=", ""),~ +- Inside source: true +*** True Line Result + game_id: game_id.strip.gsub("#", "").gsub("gameid=", ""), +** Processing line: ~ game_title: game_title.strip.gsub("#", "").gsub("gametitle=", ""),~ +- Inside source: true +*** True Line Result + game_title: game_title.strip.gsub("#", "").gsub("gametitle=", ""), +** Processing line: ~ version: version.strip.gsub("#", "").gsub("version=", ""),~ +- Inside source: true +*** True Line Result + version: version.strip.gsub("#", "").gsub("version=", ""), +** Processing line: ~ icon: icon.strip.gsub("#", "").gsub("icon=", "")~ +- Inside source: true +*** True Line Result + icon: icon.strip.gsub("#", "").gsub("icon=", "") +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ class WizardException < Exception~ +- Inside source: true +*** True Line Result + class WizardException < Exception +** Processing line: ~ attr_accessor :console_primitives~ +- Inside source: true +*** True Line Result + attr_accessor :console_primitives +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def initialize *console_primitives~ +- Inside source: true +*** True Line Result + def initialize *console_primitives +** Processing line: ~ @console_primitives = console_primitives~ +- Inside source: true +*** True Line Result + @console_primitives = console_primitives +** 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: ~ module GTK~ - Inside source: true *** True Line Result @@ -174554,14 +183873,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~#+end_src~ - PRE end detected. ** Processing line: ~~ -** Processing line: ~[[docs_search.gif]]~ -- P detected. -- Determining if line is a header. -- Line does not appear to be a header. -- Formatting line: ~[[docs_search.gif]]~ -- Line's tilde count is: 0 -- Line contains link marker: true -- LINK detected. ** Processing line: ~~ ** Processing line: ~* Hello World~ - H1 detected. @@ -174644,22 +183955,36 @@ Follows is a source code listing for all files that have been open sourced. This - BLOCKQUOTE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~* Watch Some Intro Videos~ +** Processing line: ~* Intro Videos~ - H1 detected. - Determining if line is a header. - Line contains ~* ~... gsub-ing empty string -- Formatting line: ~Watch Some Intro Videos~ +- Formatting line: ~Intro Videos~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~Each video is only 20 minutes and all of them will fit into a lunch break. So please watch them:~ +** Processing line: ~Here are some videos to help you get the lay of the land.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~Each video is only 20 minutes and all of them will fit into a lunch break. So please watch them:~ +- Formatting line: ~Here are some videos to help you get the lay of the land.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~** Quick Api Tour~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Quick Api Tour~ +- 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: ~Quick Api Tour~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~1. Beginner Introduction to DragonRuby Game Toolkit: [[https://youtu.be/ixw7TJhU08E]]~ - OL start detected. - LI detected. @@ -174669,7 +183994,23 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. -** Processing line: ~2. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]~ +** Processing line: ~~ +** Processing line: ~** If You Are Completely New to Ruby and Programming~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~If You Are Completely New to Ruby and Programming~ +- 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: ~If You Are Completely New to Ruby and Programming~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~1. Intermediate Introduction to Ruby Syntax: [[https://youtu.be/HG-XRZ5Ppgc]]~ +- OL start detected. - LI detected. - Determining if line is a header. - Line does not appear to be a header. @@ -174677,7 +184018,7 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. -** Processing line: ~3. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]~ +** Processing line: ~2. Intermediate Introduction to Arrays in Ruby: [[https://youtu.be/N72sEYFRqfo]]~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. @@ -174685,19 +184026,51 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. -** Processing line: ~The second and third videos are not required if you are proficient with Ruby, but *definitely* watch the first one.~ -- OL end detected. -- P detected. +** Processing line: ~3. You may also want to try this free course provided at [[http://dragonruby.school]].~ +- LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~The second and third videos are not required if you are proficient with Ruby, but *definitely* watch the first one.~ +- Formatting line: ~ You may also want to try this free course provided at [[http://dragonruby.school]].~ +- Line's tilde count is: 0 +- Line contains link marker: true +- LINK detected. +** Processing line: ~~ +** Processing line: ~** If You Have Game Dev Experience~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~If You Have Game Dev Experience~ - Line's tilde count is: 0 - Line contains link marker: false -** Processing line: ~You may also want to try this free course provided at [[http://dragonruby.school]].~ -- P detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~If You Have Game Dev Experience~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~1. Building Tetris - Part 1: [[https://youtu.be/xZMwRSbC4rY]]~ +- OL start detected. +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ Building Tetris - Part 1: [[https://youtu.be/xZMwRSbC4rY]]~ +- Line's tilde count is: 0 +- Line contains link marker: true +- LINK detected. +** Processing line: ~2. Building Tetris - Part 2: [[https://youtu.be/C3LLzDUDgz4]]~ +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ Building Tetris - Part 2: [[https://youtu.be/C3LLzDUDgz4]]~ +- Line's tilde count is: 0 +- Line contains link marker: true +- LINK detected. +** Processing line: ~3. Low Res Game Jam Tutorial: [[https://youtu.be/pCI90ukKCME]]~ +- LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~You may also want to try this free course provided at [[http://dragonruby.school]].~ +- Formatting line: ~ Low Res Game Jam Tutorial: [[https://youtu.be/pCI90ukKCME]]~ - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. @@ -175483,11 +184856,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. -** Processing line: ~To deploy to Android, you need to have an Android emulator/device, and a environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:~ +** Processing line: ~To deploy to Android, you need to have an Android emulator/device, and an environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~To deploy to Android, you need to have an Android emulator/device, and a environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:~ +- Formatting line: ~To deploy to Android, you need to have an Android emulator/device, and an environment that is able to run Android SDK. ~dragonruby-publish~ will create an APK for you. From there, you can sign the APK and install it to your device. The signing and installation procedure varies from OS to OS. Here's an example of what the command might look like:~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -175510,11 +184883,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principals.~ +** Processing line: ~The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principles.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principals.~ +- Formatting line: ~The following tenants of DragonRuby are what set us apart from other game engines. Given that Game Toolkit is a relatively new engine, there are definitely features that are missing. So having a big check list of "all the cool things" is not this engine's forte. This is compensated with a strong commitment to the following principles.~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ @@ -175579,11 +184952,11 @@ Follows is a source code listing for all files that have been open sourced. This - Formatting line: ~There is a programming idiom in software called "The Pit of Success". The term normalizes upfront pain as a necessity/requirement in the hopes that the investment will yield dividends "when you become successful" or "when the code becomes more complicated". This approach to development is strongly discouraged by us. It leads to over-architected and unnecessary code; creates barriers to rapid prototyping and shipping a game; and overwhelms beginners who are new to the engine or programming in general.~ - Line's tilde count is: 0 - Line contains link marker: false -** Processing line: ~DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and string entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).~ +** Processing line: ~DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs that take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and strict entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and string entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).~ +- Formatting line: ~DragonRuby's philosophy is to provide multiple options across the "make it fast" vs "make it right" spectrum, with incremental/intuitive transitions between the options provided. A concrete example of this philosophy would be render primitives: the spectrum of options allows renderable constructs that take the form of tuples/arrays (easy to pickup, simple, and fast to code/prototype with), hashes (a little more work, but gives you the ability to add additional properties), open and strict entities (more work than hashes, but yields cleaner apis), and finally - if you really need full power/flexibility in rendering - classes (which take the most amount of code and programming knowledge to create).~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ @@ -175953,11 +185326,11 @@ Follows is a source code listing for all files that have been open sourced. This - Formatting line: ~The elevator pitch is:~ - Line's tilde count is: 0 - Line contains link marker: false -** Processing line: ~DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Scadia.~ +** Processing line: ~DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Stadia.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Scadia.~ +- Formatting line: ~DragonRuby is a Multilevel Cross-platform Runtime. The "multiple levels" within the runtime allows us to target platforms no other Ruby can target: PC, Mac, Linux, Raspberry Pi, WASM, iOS, Android, Nintendo Switch, PS4, Xbox, and Stadia.~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ @@ -176171,11 +185544,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~- All ~puts~ statements will also be saved to ~logs/log.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~ +** Processing line: ~- All ~puts~ statements will also be saved to ~logs/puts.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~All ~puts~ statements will also be saved to ~logs/log.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~ +- Formatting line: ~All ~puts~ statements will also be saved to ~logs/puts.txt~. So if you want to stay in your editor and not look at the terminal, or the DragonRuby Console, you can ~tail~ this file.~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. @@ -176252,11 +185625,11 @@ Follows is a source code listing for all files that have been open sourced. This - Formatting line: ~ DragonRuby is hot loaded which gives you a very fast feedback loop (if the game throws an exception, it's because of the code you just added).~ - Line's tilde count is: 0 - Line contains link marker: false -** Processing line: ~2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recoding by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~ +** Processing line: ~2. Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recording by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~ Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recoding by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~ +- Formatting line: ~ Use ~./dragonruby mygame --record~ to create a game play recording that you can use to find the exception (you can replay a recording by executing ~./dragonruby mygame --replay last_replay.txt~ or through the DragonRuby Console using ~$gtk.recording.start_replay "last_replay.txt"~.~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. @@ -176319,11 +185692,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. -** Processing line: ~On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Every one chases the new and shiny.~ +** Processing line: ~On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Everyone chases the new and shiny.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Every one chases the new and shiny.~ +- Formatting line: ~On a more serious note, Ruby's _quantity_ levels aren't what they used to be. And that's totally fine. Everyone chases the new and shiny.~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~What really matters is _quality/maturity_. Here is the latest (StackOverflow Survey sorted by highest paid developers)[https://insights.stackoverflow.com/survey/2019#top-paying-technologies].~ @@ -176558,13 +185931,14 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~You can try our [web-based sandbox environment](). But it won't do the runtime justice. Or just come to our [Slack]() or [Discord]() channel and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.~ +** Processing line: ~You can try our web-based sandbox environment at [[http://fiddle.dragonruby.org]]. But it won't do the runtime justice. Or just come to our Discord Channel at [[http://discord.dragonruby.org]] and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~You can try our [web-based sandbox environment](). But it won't do the runtime justice. Or just come to our [Slack]() or [Discord]() channel and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.~ +- Formatting line: ~You can try our web-based sandbox environment at [[http://fiddle.dragonruby.org]]. But it won't do the runtime justice. Or just come to our Discord Channel at [[http://discord.dragonruby.org]] and ask questions. We'd be happy to have a one on one video chat with you and show off all the cool stuff we're doing.~ - Line's tilde count is: 0 -- Line contains link marker: false +- Line contains link marker: true +- LINK detected. ** Processing line: ~Seriously just buy it. Get a refund if you don't like it. We make it stupid easy to do so.~ - P detected. - Determining if line is a header. @@ -176843,12 +186217,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ flip_vertically: false,~ ** Processing line: ~ flip_horizontally: false,~ ** Processing line: ~ angle_anchor_x: 0.5,~ -** Processing line: ~ angle_anchor_y: 1.0~ +** Processing line: ~ angle_anchor_y: 1.0,~ +** Processing line: ~ blendmode_enum: 1~ ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~#+end_src~ - PRE end detected. ** Processing line: ~~ +** Processing line: ~The ~blendmode_enum~ value can be set to ~0~ (no blending), ~1~ (alpha blending), ~2~ (additive blending), ~3~ (modulo blending), ~4~ (multiply blending).~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~The ~blendmode_enum~ value can be set to ~0~ (no blending), ~1~ (alpha blending), ~2~ (additive blending), ~3~ (modulo blending), ~4~ (multiply blending).~ +- Line's tilde count is: 12 +- Line contains link marker: false +- CODE detected. ** Processing line: ~You can represent a sprite as an ~object~:~ - P detected. - Determining if line is a header. @@ -176866,7 +186249,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ :source_x, :source_y, :source_w, :source_h,~ ** Processing line: ~ :tile_x, :tile_y, :tile_w, :tile_h,~ ** Processing line: ~ :flip_horizontally, :flip_vertically,~ -** Processing line: ~ :angle_anchor_x, :angle_anchor_y~ +** Processing line: ~ :angle_anchor_x, :angle_anchor_y, :blendmode_enum~ ** Processing line: ~~ ** Processing line: ~ def primitive_marker~ ** Processing line: ~ :sprite~ @@ -177044,16 +186427,17 @@ Follows is a source code listing for all files that have been open sourced. This - PRE start detected. ** Processing line: ~ def tick args~ ** Processing line: ~ args.outputs.labels << {~ -** Processing line: ~ x: 200,~ -** Processing line: ~ y: 550,~ -** Processing line: ~ text: "dragonruby",~ -** Processing line: ~ size_enum: 2,~ -** Processing line: ~ alignment_enum: 1,~ -** Processing line: ~ r: 155,~ -** Processing line: ~ g: 50,~ -** Processing line: ~ b: 50,~ -** Processing line: ~ a: 255,~ -** Processing line: ~ font: "fonts/manaspc.ttf",~ +** Processing line: ~ x: 200,~ +** Processing line: ~ y: 550,~ +** Processing line: ~ text: "dragonruby",~ +** Processing line: ~ size_enum: 2,~ +** Processing line: ~ alignment_enum: 1,~ +** Processing line: ~ r: 155,~ +** Processing line: ~ g: 50,~ +** Processing line: ~ b: 50,~ +** Processing line: ~ a: 255,~ +** Processing line: ~ font: "fonts/manaspc.ttf",~ +** Processing line: ~ vertical_alignment_enum: 0, # 0 is bottom, 1 is middle, 2 is top~ ** Processing line: ~ # You can add any properties you like (this will be ignored/won't cause errors)~ ** Processing line: ~ game_data_one: "Something",~ ** Processing line: ~ game_data_two: {~ @@ -177109,6 +186493,41 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~** Rendering Labels With New Line Characters And Wrapping~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Rendering Labels With New Line Characters And Wrapping~ +- 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: ~Rendering Labels With New Line Characters And Wrapping~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~You can use a strategy like the following to create multiple labels from a String.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~You can use a strategy like the following to create multiple labels from a String.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ def tick args~ +** Processing line: ~ long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elitteger dolor velit, ultricies vitae libero vel, aliquam imperdiet enim."~ +** Processing line: ~ max_character_length = 30~ +** Processing line: ~ long_strings_split = args.string.wrapped_lines long_string, max_character_length~ +** Processing line: ~ args.outputs.labels << long_strings_split.map_with_index do |s, i|~ +** Processing line: ~ { x: 10, y: 600 - (i * 20), text: s }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~** How To Play A Sound~ - H2 detected. - Determining if line is a header. @@ -177792,11 +187211,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. -** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.up~ and ~args.inputs.down~.~ +** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.down~ and ~args.inputs.up~.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.up~ and ~args.inputs.down~.~ +- Formatting line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.down~ and ~args.inputs.up~.~ - Line's tilde count is: 10 - Line contains link marker: false - CODE detected. @@ -178053,12 +187472,44 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. -** Processing line: ~Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred. ***** ~.x~ Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis. ***** ~.y~ Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.~ +** Processing line: ~Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred. ***** ~.x~ Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis. ***** ~.y~ Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.~ -- Line's tilde count is: 10 +- Formatting line: ~Represents the mouse wheel. Returns ~nil~ if no mouse wheel actions occurred.~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~***** ~.x~~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~***** ~.x~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Returns the negative or positive number if the mouse wheel has changed in the ~x~ axis.~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~***** ~.y~~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~***** ~.y~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Returns the negative or positive number if the mouse wheel has changed in the ~y~ axis.~ +- Line's tilde count is: 2 - Line contains link marker: false - CODE detected. ** Processing line: ~**** ~.click~ OR ~.down~, ~.previous_click~, ~.up~~ @@ -178104,18 +187555,20 @@ Follows is a source code listing for all files that have been open sourced. This - Formatting line: ~Represents controllers connected to the usb ports.~ - Line's tilde count is: 0 - Line contains link marker: false -** Processing line: ~**** ~.up~ +** Processing line: ~**** ~.up~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.up~ -- Line's tilde count is: 1 +- Formatting line: ~~.up~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.up~ -- Line's tilde count is: 1 +- Formatting line: ~~.up~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~true~ if ~up~ is pressed or held on the directional or left analog.~ - P detected. - Determining if line is a header. @@ -178124,18 +187577,20 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.down~ +** Processing line: ~**** ~.down~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.down~ -- Line's tilde count is: 1 +- Formatting line: ~~.down~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.down~ -- Line's tilde count is: 1 +- Formatting line: ~~.down~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~true~ if ~down~ is pressed or held on the directional or left analog.~ - P detected. - Determining if line is a header. @@ -178144,18 +187599,20 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.left~ +** Processing line: ~**** ~.left~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.left~ -- Line's tilde count is: 1 +- Formatting line: ~~.left~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.left~ -- Line's tilde count is: 1 +- Formatting line: ~~.left~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~true~ if ~left~ is pressed or held on the directional or left analog.~ - P detected. - Determining if line is a header. @@ -178164,18 +187621,20 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.right~ +** Processing line: ~**** ~.right~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.right~ -- Line's tilde count is: 1 +- Formatting line: ~~.right~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.right~ -- Line's tilde count is: 1 +- Formatting line: ~~.right~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~true~ if ~right~ is pressed or held on the directional or left analog.~ - P detected. - Determining if line is a header. @@ -178184,18 +187643,20 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.left_right~ +** Processing line: ~**** ~.left_right~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.left_right~ -- Line's tilde count is: 1 +- Formatting line: ~~.left_right~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.left_right~ -- Line's tilde count is: 1 +- Formatting line: ~~.left_right~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~-1~ (left), ~0~ (neutral), or ~+1~ (right) depending on results of ~args.inputs.controller_(one|two).left~ and ~args.inputs.controller_(one|two).right~.~ - P detected. - Determining if line is a header. @@ -178204,18 +187665,20 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 10 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.up_down~ +** Processing line: ~**** ~.up_down~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.up_down~ -- Line's tilde count is: 1 +- Formatting line: ~~.up_down~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.up_down~ -- Line's tilde count is: 1 +- Formatting line: ~~.up_down~~ +- Line's tilde count is: 2 - Line contains link marker: false +- CODE detected. ** Processing line: ~Returns ~-1~ (down), ~0~ (neutral), or ~+1~ (up) depending on results of ~args.inputs.controller_(one|two).up~ and ~args.inputs.controller_(one|two).down~.~ - P detected. - Determining if line is a header. @@ -178312,17 +187775,17 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.directional_up)~~ +** Processing line: ~**** ~.directional_up~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_up)~~ +- Formatting line: ~~.directional_up~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_up)~~ +- Formatting line: ~~.directional_up~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -178334,17 +187797,17 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.directional_down)~~ +** Processing line: ~**** ~.directional_down~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_down)~~ +- Formatting line: ~~.directional_down~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_down)~~ +- Formatting line: ~~.directional_down~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -178356,17 +187819,17 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.directional_left)~~ +** Processing line: ~**** ~.directional_left~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_left)~~ +- Formatting line: ~~.directional_left~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_left)~~ +- Formatting line: ~~.directional_left~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -178378,17 +187841,17 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 4 - Line contains link marker: false - CODE detected. -** Processing line: ~**** ~.directional_right)~~ +** Processing line: ~**** ~.directional_right~~ - H4 detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_right)~~ +- Formatting line: ~~.directional_right~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. - Determining if line is a header. - Line contains ~**** ~... gsub-ing empty string -- Formatting line: ~~.directional_right)~~ +- Formatting line: ~~.directional_right~~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -179780,6 +189243,48 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. +** Processing line: ~Here are some general notes with regards to the arguments these geometric functions accept.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Here are some general notes with regards to the arguments these geometric functions accept.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~1. ~Rectangles~ can be represented as an ~Array~ with four (or more) values ~[x, y, w, h]~, as a ~Hash~ ~{ x:, y:, w:, h: }~ or an object that responds to ~x~, ~y~, ~w~, and ~h~.~ +- OL start detected. +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ ~Rectangles~ can be represented as an ~Array~ with four (or more) values ~[x, y, w, h]~, as a ~Hash~ ~{ x:, y:, w:, h: }~ or an object that responds to ~x~, ~y~, ~w~, and ~h~.~ +- Line's tilde count is: 18 +- Line contains link marker: false +- CODE detected. +** Processing line: ~2. ~Points~ can be represent as an ~Array~ with two (or more) values ~[x, y]~, as a ~Hash~ ~{ x:, y:}~ or an object that responds to ~x~, and ~y~.~ +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ ~Points~ can be represent as an ~Array~ with two (or more) values ~[x, y]~, as a ~Hash~ ~{ x:, y:}~ or an object that responds to ~x~, and ~y~.~ +- Line's tilde count is: 14 +- Line contains link marker: false +- CODE detected. +** Processing line: ~3. ~Lines~ can be represented as an ~Array~ with four (or more) values ~[x, y, x2, y2]~, as a ~Hash~ ~{ x:, y:, x2:, y2: }~ or an object that responds to ~x~, ~y~, ~x2~, and ~y2~.~ +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ ~Lines~ can be represented as an ~Array~ with four (or more) values ~[x, y, x2, y2]~, as a ~Hash~ ~{ x:, y:, x2:, y2: }~ or an object that responds to ~x~, ~y~, ~x2~, and ~y2~.~ +- Line's tilde count is: 18 +- Line contains link marker: false +- CODE detected. +** Processing line: ~4. ~Angles~ are represented as degrees (not radians).~ +- LI detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~ ~Angles~ are represented as degrees (not radians).~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~~ ** Processing line: ~*** ~.inside_rect? rect_1, rect_2~~ - H3 detected. - Determining if line is a header. @@ -182066,11 +191571,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~The value for the color and alpha is an number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ +** Processing line: ~The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~The value for the color and alpha is an number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ +- Formatting line: ~The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. @@ -182144,11 +191649,11 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ -** Processing line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ +** Processing line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ - P detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ +- Formatting line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ - Line's tilde count is: 2 - Line contains link marker: false - CODE detected. @@ -182252,6 +191757,205 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~* DOCS: ~GTK::Outputs#sprites~~ +- H1 detected. +- Determining if line is a header. +- Line contains ~* ~... gsub-ing empty string +- Formatting line: ~DOCS: ~GTK::Outputs#sprites~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~~ +** Processing line: ~Add primitives to this collection to render a sprite to the screen.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Add primitives to this collection to render a sprite to the screen.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~** Rendering a sprite using an Array~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Rendering a sprite using an Array~ +- 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: ~Rendering a sprite using an Array~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~Creates a sprite of a white circle located at 100, 100. 160 pixels wide and 90 pixels tall.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Creates a sprite of a white circle located at 100, 100. 160 pixels wide and 90 pixels tall.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src~ +- PRE start detected. +** Processing line: ~ def tick args~ +** Processing line: ~ # X Y WIDTH HEIGHT PATH~ +** Processing line: ~ args.outputs.sprites << [100, 100, 160, 90, "sprites/circle/white.png]~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~** Rendering a sprite using an Array with colors and alpha~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Rendering a sprite using an Array with colors and alpha~ +- 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: ~Rendering a sprite using an Array with colors and alpha~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~The value for the color and alpha is a number between ~0~ and ~255~. The alpha property is optional and will be set to ~255~ if not specified.~ +- Line's tilde count is: 6 +- Line contains link marker: false +- CODE detected. +** Processing line: ~Creates a green circle sprite with an opacity of 50%.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Creates a green circle sprite with an opacity of 50%.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src~ +- PRE start detected. +** Processing line: ~ def tick args~ +** Processing line: ~ # X Y WIDTH HEIGHT PATH ANGLE ALPHA RED GREEN BLUE~ +** Processing line: ~ args.outputs.sprites << [100, 100, 160, 90, "sprites/circle/white.png", 0, 128, 0, 255, 0]~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~** Rendering a sprite using a Hash~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Rendering a sprite using a Hash~ +- 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: ~Rendering a sprite using a Hash~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~If you want a more readable invocation. You can use the following hash to create a sprite. Any parameters that are not specified will be given a default value. The keys of the hash can be provided in any order.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~If you want a more readable invocation. You can use the following hash to create a sprite. Any parameters that are not specified will be given a default value. The keys of the hash can be provided in any order.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src~ +- PRE start detected. +** Processing line: ~ def tick args~ +** Processing line: ~ args.outputs.sprites << {~ +** Processing line: ~ x: 0,~ +** Processing line: ~ y: 0,~ +** Processing line: ~ w: 100,~ +** Processing line: ~ h: 100,~ +** Processing line: ~ path: "sprites/circle/white.png",~ +** Processing line: ~ angle: 0,~ +** Processing line: ~ a: 255,~ +** Processing line: ~ r: 0,~ +** Processing line: ~ g: 255,~ +** Processing line: ~ b: 0~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~** Rendering a solid using a Class~ +- H2 detected. +- Determining if line is a header. +- Line contains ~** ~... gsub-ing empty string +- Formatting line: ~Rendering a solid using a Class~ +- 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: ~Rendering a solid using a Class~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~You can also create a class with solid/border properties and render it as a primitive. ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ must be defined on the class.~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~Here is an example:~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Here is an example:~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src~ +- PRE start detected. +** Processing line: ~ # Create type with ALL sprite properties AND primitive_marker~ +** Processing line: ~ class Sprite~ +** Processing line: ~ attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y, :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b~ +** Processing line: ~~ +** Processing line: ~ def primitive_marker~ +** Processing line: ~ :sprite~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Inherit from type~ +** Processing line: ~ class Circle < Sprite~ +** Processing line: ~ # constructor~ +** Processing line: ~ def initialize x, y, size, path~ +** Processing line: ~ self.x = x~ +** Processing line: ~ self.y = y~ +** Processing line: ~ self.w = size~ +** Processing line: ~ self.h = size~ +** Processing line: ~ self.path = path~ +** Processing line: ~ end~ +** Processing line: ~ def serlialize~ +** Processing line: ~ {x:self.x, y:self.y, w:self.w, h:self.h, path:self.path}~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def inspect~ +** Processing line: ~ serlialize.to_s~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_s~ +** Processing line: ~ serlialize.to_s~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ def tick args~ +** Processing line: ~ # render circle sprite~ +** Processing line: ~ args.outputs.sprites << Circle.new(10, 10, 32,"sprites/circle/white.png")~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~* DOCS: ~GTK::Outputs#screenshots~~ - H1 detected. - Determining if line is a header. @@ -182515,51 +192219,51 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~w~: Width of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~w~: Width of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~w~: Width of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~w~: Width of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~h~: Height of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~h~: Height of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~h~: Height of the point that always returns ~0~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~h~: Height of the point that always returns ~0~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~left~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~left~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~left~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~left~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~right~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~right~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~right~: This value is the same as ~x~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~right~: This value is the same as ~x~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~top~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~top~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~top~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~top~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. -** Processing line: ~- ~bottom~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +** Processing line: ~- ~bottom~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - LI detected. - Determining if line is a header. - Line does not appear to be a header. -- Formatting line: ~~bottom~: This value is the same as ~y~ (included so that it can seemlessly work with ~GTK::Geometry~ functions).~ +- Formatting line: ~~bottom~: This value is the same as ~y~ (included so that it can seamlessly work with ~GTK::Geometry~ functions).~ - Line's tilde count is: 6 - Line contains link marker: false - CODE detected. @@ -184489,7 +194193,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 0,~ ** Processing line: ~ b: 200,~ ** Processing line: ~ a: 255,~ -** Processing line: ~ font: "manaspc.ttf" }.label~ +** Processing line: ~ font: "manaspc.ttf" }.label!~ ** Processing line: ~~ ** Processing line: ~ # Primitives can hold anything, and can be given a label in the following forms~ ** Processing line: ~ args.outputs.primitives << [690 + 150, 330 - 80, "Custom font (.primitives Array)", 0, 1, 125, 0, 200, 255, "manaspc.ttf" ].label~ @@ -184503,7 +194207,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 0,~ ** Processing line: ~ b: 200,~ ** Processing line: ~ a: 255,~ -** Processing line: ~ font: "manaspc.ttf" }.label~ +** Processing line: ~ font: "manaspc.ttf" }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def tick_instructions args, text, y = 715~ @@ -184802,801 +194506,6 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Rendering Basics - Audio Mixer - main.rb~ -- H3 detected. -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Rendering Basics - Audio Mixer - 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: ~Rendering Basics - Audio Mixer - 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/01_rendering_basics/06_audio_mixer/app/main.rb~ -** Processing line: ~ $gtk.reset~ -** Processing line: ~~ -** Processing line: ~ $boxsize = 30~ -** Processing line: ~~ -** Processing line: ~ def render_sources args~ -** Processing line: ~ mouse_in_panel = (args.state.selected != 0) && args.inputs.mouse.position.inside_rect?([900, 450, 340, 250])~ -** Processing line: ~ mouse_new_down = (args.state.mouse_held == 1)~ -** Processing line: ~~ -** Processing line: ~ if (mouse_new_down && !mouse_in_panel)~ -** Processing line: ~ args.state.selected = 0 # will reset below if we hit something.~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ args.audio.keys.each { |k|~ -** Processing line: ~ s = args.audio[k]~ -** Processing line: ~~ -** Processing line: ~ if (mouse_new_down) && !mouse_in_panel && args.inputs.mouse.position.inside_rect?([s[:screenx], s[:screeny], $boxsize, $boxsize])~ -** Processing line: ~ args.state.selected = k~ -** Processing line: ~ args.state.dragging_source = true~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ isselected = (k == args.state.selected)~ -** Processing line: ~~ -** Processing line: ~ if isselected && args.state.dragging_source~ -** Processing line: ~ # you can hang anything on the audio hashes you want, so we store the~ -** Processing line: ~ # actual screen position so it doesn't scale weirdly vs your mouse.~ -** Processing line: ~ s[:screenx] = args.inputs.mouse.x - ($boxsize / 2)~ -** Processing line: ~ s[:screeny] = args.inputs.mouse.y - ($boxsize / 2)~ -** Processing line: ~~ -** Processing line: ~ s[:screeny] = 50 if s[:screeny] < 50~ -** Processing line: ~ s[:screeny] = (719 - $boxsize) if s[:screeny] > (719 - $boxsize)~ -** Processing line: ~ s[:screenx] = 0 if s[:screenx] < 0~ -** Processing line: ~ s[:screenx] = (1279 - $boxsize) if s[:screenx] > (1279 - $boxsize)~ -** Processing line: ~~ -** Processing line: ~ s[:x] = ((s[:screenx] / 1279.0) * 2.0) - 1.0 # scale to -1.0 - 1.0 range~ -** Processing line: ~ s[:y] = ((s[:screeny] / 719.0) * 2.0) - 1.0 # scale to -1.0 - 1.0 range~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]~ -** Processing line: ~ args.outputs.primitives << [s[:screenx], s[:screeny], $boxsize, $boxsize, *color].solid~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def render_panel args~ -** Processing line: ~ s = args.audio[args.state.selected]~ -** Processing line: ~ return if s.nil?~ -** Processing line: ~ mouse_down = (args.state.mouse_held > 0)~ -** Processing line: ~~ -** Processing line: ~ args.outputs.primitives << [900, 450, 340, 250, 127, 127, 200, 255].solid~ -** Processing line: ~ args.outputs.primitives << [1075, 690, "Source ##{args.state.selected}", 3, 1, 255, 255, 255].label~ -** Processing line: ~ args.outputs.primitives << [910, 660, 1230, 660, 255, 255, 255].line~ -** Processing line: ~ args.outputs.primitives << [910, 650, "screen: (#{s[:screenx].to_i}, #{s[:screeny].to_i})", 0, 0, 255, 255, 255].label~ -** Processing line: ~ args.outputs.primitives << [910, 625, "position: (#{s[:x].round(5).to_s[0..6]}, #{s[:y].round(5).to_s[0..6]})", 0, 0, 255, 255, 255].label~ -** Processing line: ~~ -** Processing line: ~ slider = [1022, 586, 200, 7]~ -** Processing line: ~ if mouse_down && args.inputs.mouse.position.inside_rect?(slider)~ -** Processing line: ~ s[:pitch] = ((args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)) * 2.0~ -** Processing line: ~ end~ -** Processing line: ~ slidercolor = (s[:pitch] / 2.0) * 255~ -** Processing line: ~ args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid~ -** Processing line: ~ args.outputs.primitives << [910, 600, "pitch: #{s[:pitch].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label~ -** Processing line: ~~ -** Processing line: ~ slider = [1022, 561, 200, 7]~ -** Processing line: ~ if mouse_down && args.inputs.mouse.position.inside_rect?(slider)~ -** Processing line: ~ s[:gain] = (args.inputs.mouse.x - slider[0]).to_f / (slider[2]-1.0)~ -** Processing line: ~ end~ -** Processing line: ~ slidercolor = s[:gain] * 255~ -** Processing line: ~ args.outputs.primitives << [*slider, slidercolor, slidercolor, slidercolor, 255].solid~ -** Processing line: ~ args.outputs.primitives << [910, 575, "gain: #{s[:gain].round(3).to_s[0..2]}", 0, 0, 255, 255, 255].label~ -** Processing line: ~~ -** Processing line: ~ checkbox = [1022, 533, 10, 12]~ -** Processing line: ~ if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)~ -** Processing line: ~ s[:looping] = !s[:looping]~ -** Processing line: ~ end~ -** Processing line: ~ checkboxcolor = s[:looping] ? 255 : 0~ -** Processing line: ~ args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid~ -** Processing line: ~ args.outputs.primitives << [910, 550, "looping:", 0, 0, 255, 255, 255].label~ -** Processing line: ~~ -** Processing line: ~ checkbox = [1022, 508, 10, 12]~ -** Processing line: ~ if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(checkbox)~ -** Processing line: ~ s[:paused] = !s[:paused]~ -** Processing line: ~ end~ -** Processing line: ~ checkboxcolor = s[:paused] ? 255 : 0~ -** Processing line: ~ args.outputs.primitives << [*checkbox, checkboxcolor, checkboxcolor, checkboxcolor, 255].solid~ -** Processing line: ~ args.outputs.primitives << [910, 525, "paused:", 0, 0, 255, 255, 255].label~ -** Processing line: ~~ -** Processing line: ~ button = [910, 460, 320, 20]~ -** Processing line: ~ if (args.state.mouse_held == 1) && args.inputs.mouse.position.inside_rect?(button)~ -** Processing line: ~ args.audio.delete(args.state.selected)~ -** Processing line: ~ args.state.selected = 0~ -** Processing line: ~ end~ -** Processing line: ~ args.outputs.primitives << [*button, 255, 0, 0, 255].solid~ -** Processing line: ~ args.outputs.primitives << [button[0] + (button[2] / 2), button[1]+20, "DELETE SOURCE", 0, 1, 255, 255, 0].label~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def spawn_new_sound args, num~ -** Processing line: ~ input = nil~ -** Processing line: ~ input = "sounds/#{num}.#{(num == 6) ? 'ogg' : 'wav'}"~ -** Processing line: ~~ -** Processing line: ~ # Spawn randomly in an area that won't be covered by UI.~ -** Processing line: ~ screenx = (rand * 600.0) + 200.0~ -** Processing line: ~ screeny = (rand * 400.0) + 100.0~ -** Processing line: ~~ -** Processing line: ~ args.state.next_sound_index += 1~ -** Processing line: ~~ -** Processing line: ~ # you can hang anything on the audio hashes you want, so we store the~ -** Processing line: ~ # actual screen position in here for convenience.~ -** Processing line: ~ args.audio[args.state.next_sound_index] = {~ -** Processing line: ~ input: input,~ -** Processing line: ~ screenx: screenx,~ -** Processing line: ~ screeny: screeny,~ -** Processing line: ~ x: ((screenx / 1279.0) * 2.0) - 1.0, # scale to -1.0 - 1.0 range~ -** Processing line: ~ y: ((screeny / 719.0) * 2.0) - 1.0, # scale to -1.0 - 1.0 range~ -** Processing line: ~ z: 0.0,~ -** Processing line: ~ gain: 1.0,~ -** Processing line: ~ pitch: 1.0,~ -** Processing line: ~ looping: true,~ -** Processing line: ~ paused: false~ -** Processing line: ~ }~ -** Processing line: ~~ -** Processing line: ~ args.state.selected = args.state.next_sound_index~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def render_launcher args~ -** Processing line: ~ total = 6~ -** Processing line: ~ x = (1280 - (total * $boxsize * 3)) / 2~ -** Processing line: ~ y = 10~ -** Processing line: ~ args.outputs.primitives << [0, 0, 1280, ((y*2) + $boxsize), 127, 127, 127, 255].solid~ -** Processing line: ~ for i in 1..total~ -** Processing line: ~ args.outputs.primitives << [x, y, $boxsize, $boxsize, 255, 255, 255, 255].solid~ -** Processing line: ~ args.outputs.primitives << [x+8, y+28, i.to_s, 3, 0, 0, 0, 255, 255].label~ -** Processing line: ~ if args.inputs.mouse.click && args.inputs.mouse.click.point.inside_rect?([x, y, $boxsize, $boxsize])~ -** Processing line: ~ spawn_new_sound args, i~ -** Processing line: ~ end~ -** Processing line: ~ x = x + ($boxsize * 3)~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def render_ui args~ -** Processing line: ~ render_launcher args~ -** Processing line: ~ render_panel args~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def tick args~ -** Processing line: ~ args.state.mouse_held ||= 0~ -** Processing line: ~ args.state.dragging_source ||= false~ -** Processing line: ~ args.state.selected ||= 0~ -** Processing line: ~ args.state.next_sound_index ||= 0~ -** Processing line: ~~ -** Processing line: ~ if args.inputs.mouse.up~ -** Processing line: ~ args.state.mouse_held = 0~ -** Processing line: ~ args.state.dragging_source = false~ -** Processing line: ~ elsif args.inputs.mouse.down || (args.state.mouse_held > 0)~ -** Processing line: ~ args.state.mouse_held += 1~ -** Processing line: ~ else~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ args.outputs.background_color = [ 0, 0, 0, 255 ]~ -** Processing line: ~ render_sources args~ -** Processing line: ~ render_ui args~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~#+end_src~ -- PRE end detected. -** Processing line: ~~ -** Processing line: ~~ -** Processing line: ~*** Rendering Basics - Sound Synthesis - main.rb~ -- H3 detected. -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Rendering Basics - Sound Synthesis - 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: ~Rendering Basics - Sound Synthesis - 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/01_rendering_basics/07_sound_synthesis/app/main.rb~ -** Processing line: ~ begin # region: top level tick methods~ -** Processing line: ~ def tick args~ -** Processing line: ~ defaults args~ -** Processing line: ~ render args~ -** Processing line: ~ input args~ -** Processing line: ~ process_audio_queue args~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults args~ -** Processing line: ~ args.state.sine_waves ||= {}~ -** Processing line: ~ args.state.square_waves ||= {}~ -** Processing line: ~ args.state.saw_tooth_waves ||= {}~ -** Processing line: ~ args.state.triangle_waves ||= {}~ -** Processing line: ~ args.state.audio_queue ||= []~ -** Processing line: ~ args.state.buttons ||= [~ -** Processing line: ~ (frequency_buttons args),~ -** Processing line: ~ (sine_wave_note_buttons args),~ -** Processing line: ~ (bell_buttons args),~ -** Processing line: ~ (square_wave_note_buttons args),~ -** Processing line: ~ (saw_tooth_wave_note_buttons args),~ -** Processing line: ~ (triangle_wave_note_buttons args),~ -** Processing line: ~ ].flatten~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def render args~ -** Processing line: ~ args.outputs.borders << args.state.buttons.map { |b| b[:border] }~ -** Processing line: ~ args.outputs.labels << args.state.buttons.map { |b| b[:label] }~ -** Processing line: ~ args.outputs.labels << args.layout~ -** Processing line: ~ .rect(row: 0, col: 11.5)~ -** Processing line: ~ .yield_self { |r| r.merge y: r.y + r.h }~ -** Processing line: ~ .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",~ -** Processing line: ~ alignment_enum: 1)~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~~ -** Processing line: ~ def input args~ -** Processing line: ~ args.state.buttons.each do |b|~ -** Processing line: ~ if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])~ -** Processing line: ~ parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "~ -** Processing line: ~ args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"~ -** Processing line: ~ send b[:method_to_call], args, b~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))~ -** Processing line: ~ args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def process_audio_queue args~ -** Processing line: ~ to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }~ -** Processing line: ~ args.state.audio_queue -= to_queue~ -** Processing line: ~ to_queue.each { |a| args.audio[a[:id]] = a }~ -** Processing line: ~~ -** Processing line: ~ args.audio.find_all { |k, v| v[:decay_rate] }~ -** Processing line: ~ .each { |k, v| v[:gain] -= v[:decay_rate] }~ -** Processing line: ~~ -** Processing line: ~ sounds_to_stop = args.audio~ -** Processing line: ~ .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }~ -** Processing line: ~ .map { |k, v| k }~ -** Processing line: ~~ -** Processing line: ~ sounds_to_stop.each { |k| args.audio.delete k }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: button definitions, ui layout, callback functions~ -** Processing line: ~ def button args, opts~ -** Processing line: ~ button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))~ -** Processing line: ~~ -** Processing line: ~ button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0~ -** Processing line: ~~ -** Processing line: ~ label_offset_x = 5~ -** Processing line: ~ label_offset_y = 30~ -** Processing line: ~~ -** Processing line: ~ button_def[:label] = button_def[:rect].merge text: opts[:text],~ -** Processing line: ~ size_enum: -2.5,~ -** Processing line: ~ x: button_def[:rect].x + label_offset_x,~ -** Processing line: ~ y: button_def[:rect].y + label_offset_y~ -** Processing line: ~~ -** Processing line: ~ button_def~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def play_sine_wave args, sender~ -** Processing line: ~ queue_sine_wave args,~ -** Processing line: ~ frequency: sender[:frequency],~ -** Processing line: ~ duration: 1.seconds,~ -** Processing line: ~ fade_out: true~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def play_note args, sender~ -** Processing line: ~ method_to_call = :queue_sine_wave~ -** Processing line: ~ method_to_call = :queue_square_wave if sender[:type] == :square~ -** Processing line: ~ method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth~ -** Processing line: ~ method_to_call = :queue_triangle_wave if sender[:type] == :triangle~ -** Processing line: ~ method_to_call = :queue_bell if sender[:type] == :bell~ -** Processing line: ~~ -** Processing line: ~ send method_to_call, args,~ -** Processing line: ~ frequency: (frequency_for note: sender[:note], octave: sender[:octave]),~ -** Processing line: ~ duration: 1.seconds,~ -** Processing line: ~ fade_out: true~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def frequency_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.0, col: 0, text: "300hz",~ -** Processing line: ~ frequency: 300,~ -** Processing line: ~ method_to_call: :play_sine_wave),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.0, col: 0, text: "400hz",~ -** Processing line: ~ frequency: 400,~ -** Processing line: ~ method_to_call: :play_sine_wave),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.0, col: 0, text: "500hz",~ -** Processing line: ~ frequency: 500,~ -** Processing line: ~ method_to_call: :play_sine_wave),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def sine_wave_note_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 1.5, col: 2, text: "Sine C4",~ -** Processing line: ~ note: :c, octave: 4, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 2.5, col: 2, text: "Sine D4",~ -** Processing line: ~ note: :d, octave: 4, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 3.5, col: 2, text: "Sine E4",~ -** Processing line: ~ note: :e, octave: 4, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.5, col: 2, text: "Sine F4",~ -** Processing line: ~ note: :f, octave: 4, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.5, col: 2, text: "Sine G4",~ -** Processing line: ~ note: :g, octave: 4, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.5, col: 2, text: "Sine A5",~ -** Processing line: ~ note: :a, octave: 5, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 7.5, col: 2, text: "Sine B5",~ -** Processing line: ~ note: :b, octave: 5, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 8.5, col: 2, text: "Sine C5",~ -** Processing line: ~ note: :c, octave: 5, type: :sine, method_to_call: :play_note),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def square_wave_note_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 1.5, col: 6, text: "Square C4",~ -** Processing line: ~ note: :c, octave: 4, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 2.5, col: 6, text: "Square D4",~ -** Processing line: ~ note: :d, octave: 4, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 3.5, col: 6, text: "Square E4",~ -** Processing line: ~ note: :e, octave: 4, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.5, col: 6, text: "Square F4",~ -** Processing line: ~ note: :f, octave: 4, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.5, col: 6, text: "Square G4",~ -** Processing line: ~ note: :g, octave: 4, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.5, col: 6, text: "Square A5",~ -** Processing line: ~ note: :a, octave: 5, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 7.5, col: 6, text: "Square B5",~ -** Processing line: ~ note: :b, octave: 5, type: :square, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 8.5, col: 6, text: "Square C5",~ -** Processing line: ~ note: :c, octave: 5, type: :square, method_to_call: :play_note),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~ def saw_tooth_wave_note_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 1.5, col: 8, text: "Saw C4",~ -** Processing line: ~ note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 2.5, col: 8, text: "Saw D4",~ -** Processing line: ~ note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 3.5, col: 8, text: "Saw E4",~ -** Processing line: ~ note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.5, col: 8, text: "Saw F4",~ -** Processing line: ~ note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.5, col: 8, text: "Saw G4",~ -** Processing line: ~ note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.5, col: 8, text: "Saw A5",~ -** Processing line: ~ note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 7.5, col: 8, text: "Saw B5",~ -** Processing line: ~ note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 8.5, col: 8, text: "Saw C5",~ -** Processing line: ~ note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def triangle_wave_note_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 1.5, col: 10, text: "Triangle C4",~ -** Processing line: ~ note: :c, octave: 4, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 2.5, col: 10, text: "Triangle D4",~ -** Processing line: ~ note: :d, octave: 4, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 3.5, col: 10, text: "Triangle E4",~ -** Processing line: ~ note: :e, octave: 4, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.5, col: 10, text: "Triangle F4",~ -** Processing line: ~ note: :f, octave: 4, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.5, col: 10, text: "Triangle G4",~ -** Processing line: ~ note: :g, octave: 4, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.5, col: 10, text: "Triangle A5",~ -** Processing line: ~ note: :a, octave: 5, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 7.5, col: 10, text: "Triangle B5",~ -** Processing line: ~ note: :b, octave: 5, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 8.5, col: 10, text: "Triangle C5",~ -** Processing line: ~ note: :c, octave: 5, type: :triangle, method_to_call: :play_note),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def bell_buttons args~ -** Processing line: ~ [~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 1.5, col: 4, text: "Bell C4",~ -** Processing line: ~ note: :c, octave: 4, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 2.5, col: 4, text: "Bell D4",~ -** Processing line: ~ note: :d, octave: 4, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 3.5, col: 4, text: "Bell E4",~ -** Processing line: ~ note: :e, octave: 4, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 4.5, col: 4, text: "Bell F4",~ -** Processing line: ~ note: :f, octave: 4, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 5.5, col: 4, text: "Bell G4",~ -** Processing line: ~ note: :g, octave: 4, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 6.5, col: 4, text: "Bell A5",~ -** Processing line: ~ note: :a, octave: 5, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 7.5, col: 4, text: "Bell B5",~ -** Processing line: ~ note: :b, octave: 5, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ (button args,~ -** Processing line: ~ row: 8.5, col: 4, text: "Bell C5",~ -** Processing line: ~ note: :c, octave: 5, type: :bell, method_to_call: :play_note),~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: wave generation~ -** Processing line: ~ begin # sine wave~ -** Processing line: ~ def defaults_sine_wave_for~ -** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def sine_wave_for opts = {}~ -** Processing line: ~ opts = defaults_sine_wave_for.merge opts~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = opts[:sample_rate]~ -** Processing line: ~ period_size = (sample_rate.fdiv frequency).ceil~ -** Processing line: ~ period_size.map_with_index do |i|~ -** Processing line: ~ Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)~ -** Processing line: ~ end.to_a~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_queue_sine_wave~ -** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_sine_wave args, opts = {}~ -** Processing line: ~ opts = defaults_queue_sine_wave.merge opts~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = 48000~ -** Processing line: ~~ -** Processing line: ~ sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~ args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~~ -** Processing line: ~ proc = lambda do~ -** Processing line: ~ generate_audio_data args.state.sine_waves[frequency], sample_rate~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ audio_state = new_audio_state args, opts~ -** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ -** Processing line: ~ queue_audio args, audio_state: audio_state, wave: sine_wave~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: square wave~ -** Processing line: ~ def defaults_square_wave_for~ -** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def square_wave_for opts = {}~ -** Processing line: ~ opts = defaults_square_wave_for.merge opts~ -** Processing line: ~ sine_wave = sine_wave_for opts~ -** Processing line: ~ sine_wave.map do |v|~ -** Processing line: ~ if v >= 0~ -** Processing line: ~ 1.0~ -** Processing line: ~ else~ -** Processing line: ~ -1.0~ -** Processing line: ~ end~ -** Processing line: ~ end.to_a~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_queue_square_wave~ -** Processing line: ~ { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_square_wave args, opts = {}~ -** Processing line: ~ opts = defaults_queue_square_wave.merge opts~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = 48000~ -** Processing line: ~~ -** Processing line: ~ square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~ args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~~ -** Processing line: ~ proc = lambda do~ -** Processing line: ~ generate_audio_data args.state.square_waves[frequency], sample_rate~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ audio_state = new_audio_state args, opts~ -** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ -** Processing line: ~ queue_audio args, audio_state: audio_state, wave: square_wave~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: saw tooth wave~ -** Processing line: ~ def defaults_saw_tooth_wave_for~ -** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def saw_tooth_wave_for opts = {}~ -** Processing line: ~ opts = defaults_saw_tooth_wave_for.merge opts~ -** Processing line: ~ sine_wave = sine_wave_for opts~ -** Processing line: ~ period_size = sine_wave.length~ -** Processing line: ~ sine_wave.map_with_index do |v, i|~ -** Processing line: ~ (((i % period_size).fdiv period_size) * 2) - 1~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_queue_saw_tooth_wave~ -** Processing line: ~ { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_saw_tooth_wave args, opts = {}~ -** Processing line: ~ opts = defaults_queue_saw_tooth_wave.merge opts~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = 48000~ -** Processing line: ~~ -** Processing line: ~ saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~ args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~~ -** Processing line: ~ proc = lambda do~ -** Processing line: ~ generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ audio_state = new_audio_state args, opts~ -** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ -** Processing line: ~ queue_audio args, audio_state: audio_state, wave: saw_tooth_wave~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: triangle wave~ -** Processing line: ~ def defaults_triangle_wave_for~ -** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def triangle_wave_for opts = {}~ -** Processing line: ~ opts = defaults_saw_tooth_wave_for.merge opts~ -** Processing line: ~ sine_wave = sine_wave_for opts~ -** Processing line: ~ period_size = sine_wave.length~ -** Processing line: ~ sine_wave.map_with_index do |v, i|~ -** Processing line: ~ ratio = (i.fdiv period_size)~ -** Processing line: ~ if ratio <= 0.5~ -** Processing line: ~ (ratio * 4) - 1~ -** Processing line: ~ else~ -** Processing line: ~ ratio -= 0.5~ -** Processing line: ~ 1 - (ratio * 4)~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_queue_triangle_wave~ -** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_triangle_wave args, opts = {}~ -** Processing line: ~ opts = defaults_queue_triangle_wave.merge opts~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = 48000~ -** Processing line: ~~ -** Processing line: ~ triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~ args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate~ -** Processing line: ~~ -** Processing line: ~ proc = lambda do~ -** Processing line: ~ generate_audio_data args.state.triangle_waves[frequency], sample_rate~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ audio_state = new_audio_state args, opts~ -** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ -** Processing line: ~ queue_audio args, audio_state: audio_state, wave: triangle_wave~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: bell~ -** Processing line: ~ def defaults_queue_bell~ -** Processing line: ~ { frequency: 440, duration: 1.seconds, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_bell args, opts = {}~ -** Processing line: ~ (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def bell_harmonics~ -** Processing line: ~ [~ -** Processing line: ~ { frequency_ratio: 0.5, duration_ratio: 1.00 },~ -** Processing line: ~ { frequency_ratio: 1.0, duration_ratio: 0.80 },~ -** Processing line: ~ { frequency_ratio: 2.0, duration_ratio: 0.60 },~ -** Processing line: ~ { frequency_ratio: 3.0, duration_ratio: 0.40 },~ -** Processing line: ~ { frequency_ratio: 4.2, duration_ratio: 0.25 },~ -** Processing line: ~ { frequency_ratio: 5.4, duration_ratio: 0.20 },~ -** Processing line: ~ { frequency_ratio: 6.8, duration_ratio: 0.15 }~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_bell_to_sine_waves~ -** Processing line: ~ { frequency: 440, duration: 1.seconds, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def bell_to_sine_waves opts = {}~ -** Processing line: ~ opts = defaults_bell_to_sine_waves.merge opts~ -** Processing line: ~ bell_harmonics.map do |b|~ -** Processing line: ~ {~ -** Processing line: ~ frequency: opts[:frequency] * b[:frequency_ratio],~ -** Processing line: ~ duration: opts[:duration] * b[:duration_ratio],~ -** Processing line: ~ queue_in: opts[:queue_in],~ -** Processing line: ~ gain: (1.fdiv bell_harmonics.length),~ -** Processing line: ~ fade_out: true~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # audio entity construction~ -** Processing line: ~ def generate_audio_data sine_wave, sample_rate~ -** Processing line: ~ sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil~ -** Processing line: ~ copy_count = (sample_size.fdiv sine_wave.length).ceil~ -** Processing line: ~ sine_wave * copy_count~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def defaults_new_audio_state~ -** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def new_audio_state args, opts = {}~ -** Processing line: ~ opts = defaults_new_audio_state.merge opts~ -** Processing line: ~ decay_rate = 0~ -** Processing line: ~ decay_rate = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]~ -** Processing line: ~ frequency = opts[:frequency]~ -** Processing line: ~ sample_rate = 48000~ -** Processing line: ~~ -** Processing line: ~ {~ -** Processing line: ~ id: (new_id! args),~ -** Processing line: ~ frequency: frequency,~ -** Processing line: ~ sample_rate: 48000,~ -** Processing line: ~ stop_at: args.tick_count + opts[:queue_in] + opts[:duration],~ -** Processing line: ~ gain: opts[:gain].to_f,~ -** Processing line: ~ queue_at: args.state.tick_count + opts[:queue_in],~ -** Processing line: ~ decay_rate: decay_rate,~ -** Processing line: ~ pitch: 1.0,~ -** Processing line: ~ looping: true,~ -** Processing line: ~ paused: false~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def queue_audio args, opts = {}~ -** Processing line: ~ graph_wave args, opts[:wave], opts[:audio_state][:frequency]~ -** Processing line: ~ args.state.audio_queue << opts[:audio_state]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def new_id! args~ -** Processing line: ~ args.state.audio_id ||= 0~ -** Processing line: ~ args.state.audio_id += 1~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def graph_wave args, wave, frequency~ -** Processing line: ~ if args.state.tick_count != args.state.graphed_at~ -** Processing line: ~ args.outputs.static_lines.clear~ -** Processing line: ~ args.outputs.static_sprites.clear~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ wave = wave~ -** Processing line: ~~ -** Processing line: ~ r, g, b = frequency.to_i % 85,~ -** Processing line: ~ frequency.to_i % 170,~ -** Processing line: ~ frequency.to_i % 255~ -** Processing line: ~~ -** Processing line: ~ starting_rect = args.layout.rect(row: 5, col: 13)~ -** Processing line: ~ x_scale = 10~ -** Processing line: ~ y_scale = 100~ -** Processing line: ~ max_points = 25~ -** Processing line: ~~ -** Processing line: ~ points = wave~ -** Processing line: ~ if wave.length > max_points~ -** Processing line: ~ resolution = wave.length.idiv max_points~ -** Processing line: ~ points = wave.find_all.with_index { |y, i| (i % resolution == 0) }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ args.outputs.static_lines << points.map_with_index do |y, x|~ -** Processing line: ~ next_y = points[x + 1]~ -** Processing line: ~~ -** Processing line: ~ if next_y~ -** Processing line: ~ {~ -** Processing line: ~ x: starting_rect.x + (x * x_scale),~ -** Processing line: ~ y: starting_rect.y + starting_rect.h.half + y_scale * y,~ -** Processing line: ~ x2: starting_rect.x + ((x + 1) * x_scale),~ -** Processing line: ~ y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,~ -** Processing line: ~ r: r,~ -** Processing line: ~ g: g,~ -** Processing line: ~ b: b~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ args.outputs.static_sprites << points.map_with_index do |y, x|~ -** Processing line: ~ {~ -** Processing line: ~ x: (starting_rect.x + (x * x_scale)) - 2,~ -** Processing line: ~ y: (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,~ -** Processing line: ~ w: 4,~ -** Processing line: ~ h: 4,~ -** Processing line: ~ path: 'sprites/square-white.png',~ -** Processing line: ~ r: r,~ -** Processing line: ~ g: g,~ -** Processing line: ~ b: b~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ args.state.graphed_at = args.state.tick_count~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ begin # region: musical note mapping~ -** Processing line: ~ def defaults_frequency_for~ -** Processing line: ~ { note: :a, octave: 5, sharp: false, flat: false }~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def frequency_for opts = {}~ -** Processing line: ~ opts = defaults_frequency_for.merge opts~ -** Processing line: ~ octave_offset_multiplier = opts[:octave] - 5~ -** Processing line: ~ note = note_frequencies_octave_5[opts[:note]]~ -** Processing line: ~ if octave_offset_multiplier < 0~ -** Processing line: ~ note = note * 1 / (octave_offset_multiplier.abs + 1)~ -** Processing line: ~ elsif octave_offset_multiplier > 0~ -** Processing line: ~ note = note * (octave_offset_multiplier.abs + 1) / 1~ -** Processing line: ~ end~ -** Processing line: ~ note~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def note_frequencies_octave_5~ -** Processing line: ~ {~ -** Processing line: ~ a: 440.0,~ -** Processing line: ~ a_sharp: 466.16, b_flat: 466.16,~ -** Processing line: ~ b: 493.88,~ -** Processing line: ~ c: 523.25,~ -** Processing line: ~ c_sharp: 554.37, d_flat: 587.33,~ -** Processing line: ~ d: 587.33,~ -** Processing line: ~ d_sharp: 622.25, e_flat: 659.25,~ -** Processing line: ~ e: 659.25,~ -** Processing line: ~ f: 698.25,~ -** Processing line: ~ f_sharp: 739.99, g_flat: 739.99,~ -** Processing line: ~ g: 783.99,~ -** Processing line: ~ g_sharp: 830.61, a_flat: 830.61~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ $gtk.reset~ -** Processing line: ~~ -** Processing line: ~#+end_src~ -- PRE end detected. -** Processing line: ~~ -** Processing line: ~~ ** Processing line: ~*** Input Basics - Keyboard - main.rb~ - H3 detected. - Determining if line is a header. @@ -185640,9 +194549,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def tick args~ ** Processing line: ~ tick_instructions args, "Sample app shows how keyboard events are registered and accessed.", 360~ ** Processing line: ~ # Notice how small_font accounts for all the remaining parameters~ -** Processing line: ~ args.outputs.labels << [460, row_to_px(args, 0), "Current game time: #{args.state.tick_count}", small_font]~ -** Processing line: ~ args.outputs.labels << [460, row_to_px(args, 2), "Keyboard input: args.inputs.keyboard.key_up.h", small_font]~ -** Processing line: ~ args.outputs.labels << [460, row_to_px(args, 3), "Press \"h\" on the keyboard.", small_font]~ +** Processing line: ~ args.outputs.labels << { x: 460, y: row_to_px(args, 0), text: "Current game time: #{args.state.tick_count}", size_enum: -1 }~ +** Processing line: ~ args.outputs.labels << { x: 460, y: row_to_px(args, 2), text: "Keyboard input: args.inputs.keyboard.key_up.h", size_enum: -1 }~ +** Processing line: ~ args.outputs.labels << { x: 460, y: row_to_px(args, 3), text: "Press \"h\" on the keyboard.", size_enum: -1 }~ ** Processing line: ~~ ** Processing line: ~ # Input on a specifc key can be found through args.inputs.keyboard.key_up followed by the key~ ** Processing line: ~ if args.inputs.keyboard.key_up.h~ @@ -185653,27 +194562,19 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state.h_pressed_at ||= false~ ** Processing line: ~~ ** Processing line: ~ if args.state.h_pressed_at~ -** Processing line: ~ args.outputs.labels << [460, row_to_px(args, 4), "\"h\" was pressed at time: #{args.state.h_pressed_at}", small_font]~ +** Processing line: ~ args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" was pressed at time: #{args.state.h_pressed_at}", size_enum: -1 }~ ** Processing line: ~ else~ -** Processing line: ~ args.outputs.labels << [460, row_to_px(args, 4), "\"h\" has never been pressed.", small_font]~ +** Processing line: ~ args.outputs.labels << { x: 460, y: row_to_px(args, 4), text: "\"h\" has never been pressed.", size_enum: -1 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ tick_help_text args~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def small_font~ -** Processing line: ~ # This method provides some values for the construction of labels~ -** Processing line: ~ # Specifically, Size, Alignment, & RGBA~ -** Processing line: ~ # This makes it so that custom parameters don't have to be repeatedly typed.~ -** Processing line: ~ # Additionally "small_font" provides programmers with more information than some numbers~ -** Processing line: ~ [-2, 0, 0, 0, 0, 255]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def row_to_px args, row_number~ +** Processing line: ~ def row_to_px args, row_number, y_offset = 20~ ** Processing line: ~ # This takes a row_number and converts it to pixels DragonRuby understands.~ ** Processing line: ~ # Row 0 starts 5 units below the top of the grid~ ** Processing line: ~ # Each row afterward is 20 units lower~ -** Processing line: ~ args.grid.top.shift_down(5).shift_down(20 * row_number)~ +** Processing line: ~ args.grid.top - 5 - (y_offset * row_number)~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Don't worry about understanding the code within this method just yet.~ @@ -185703,17 +194604,17 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ args.outputs.labels << [10, row_to_px(args, 6), "Advanced Help:", small_font]~ +** Processing line: ~ args.outputs.labels << { x: 10, y: row_to_px(args, 6), text: "This is the api for the keys you've pressed:", size_enum: -1, r: 180 }~ ** Processing line: ~~ ** Processing line: ~ if !args.state.help_available~ ** Processing line: ~ args.outputs.labels << [10, row_to_px(args, 7), "Press a key and I'll show code to access the key and what value will be returned if you used the code.", small_font]~ ** Processing line: ~ return~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ args.outputs.labels << [10 , row_to_px(args, 7), "args.inputs.keyboard", small_font]~ -** Processing line: ~ args.outputs.labels << [330, row_to_px(args, 7), "args.inputs.keyboard.key_down", small_font]~ -** Processing line: ~ args.outputs.labels << [650, row_to_px(args, 7), "args.inputs.keyboard.key_held", small_font]~ -** Processing line: ~ args.outputs.labels << [990, row_to_px(args, 7), "args.inputs.keyboard.key_up", small_font]~ +** Processing line: ~ args.outputs.labels << { x: 10 , y: row_to_px(args, 7), text: "args.inputs.keyboard", size_enum: -2 }~ +** Processing line: ~ args.outputs.labels << { x: 330, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_down", size_enum: -2 }~ +** Processing line: ~ args.outputs.labels << { x: 650, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_held", size_enum: -2 }~ +** Processing line: ~ args.outputs.labels << { x: 990, y: row_to_px(args, 7), text: "args.inputs.keyboard.key_up", size_enum: -2 }~ ** Processing line: ~~ ** Processing line: ~ fill_history args, :key_value_history, :down_or_held, nil~ ** Processing line: ~ fill_history args, :key_down_value_history, :down, :key_down~ @@ -185759,12 +194660,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ idx += 2~ ** Processing line: ~ [~ -** Processing line: ~ [x, row_to_px(args, idx - 2),~ -** Processing line: ~ " .#{k} is #{current_value || "nil"}",~ -** Processing line: ~ small_font],~ -** Processing line: ~ [x, row_to_px(args, idx - 1),~ -** Processing line: ~ " was #{v}",~ -** Processing line: ~ small_font]~ +** Processing line: ~ { x: x, y: row_to_px(args, idx + 0, 16), text: " .#{k} is #{current_value || "nil"}", size_enum: -2 },~ +** Processing line: ~ { x: x, y: row_to_px(args, idx + 1, 16), text: " was #{v}", size_enum: -2 }~ ** Processing line: ~ ]~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -185779,15 +194676,68 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state.key_event_occurred = true~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ -** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ -** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.debug << { x: 0, y: y - 50, w: 1280, h: 60 }.solid!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y, text: text,~ +** Processing line: ~ size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)",~ +** Processing line: ~ size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Input Basics - Moving A Sprite - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Input Basics - Moving A Sprite - 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: ~Input Basics - Moving A Sprite - 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/02_input_basics/01_moving_a_sprite/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ # create a player and set default values~ +** Processing line: ~ # for the player's x, y, w (width), and h (height)~ +** Processing line: ~ args.state.player.x ||= 100~ +** Processing line: ~ args.state.player.y ||= 100~ +** Processing line: ~ args.state.player.w ||= 50~ +** Processing line: ~ args.state.player.h ||= 50~ +** Processing line: ~~ +** Processing line: ~ # render the player to the screen~ +** 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: ~ # move the player around using the keyboard~ +** Processing line: ~ if args.inputs.up~ +** Processing line: ~ args.state.player.y += 10~ +** Processing line: ~ elsif args.inputs.down~ +** Processing line: ~ args.state.player.y -= 10~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.left~ +** Processing line: ~ args.state.player.x -= 10~ +** Processing line: ~ elsif args.inputs.right~ +** Processing line: ~ args.state.player.x += 10~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Input Basics - Mouse - main.rb~ - H3 detected. - Determining if line is a header. @@ -185867,11 +194817,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # This method effectively combines the row_to_px and small_font methods~ ** Processing line: ~ # It changes the given row value to a DragonRuby pixel value~ ** Processing line: ~ # and adds the customization parameters~ -** Processing line: ~ [x, row_to_px(args, row), message, small_font]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def small_font~ -** Processing line: ~ [-2, 0, 0, 0, 0, 255]~ +** Processing line: ~ { x: x, y: row_to_px(args, row), text: message, alignment_enum: -2 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def row_to_px args, row_number~ @@ -185887,9 +194833,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state.key_event_occurred = true~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ -** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ -** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.debug << { x: 0, y: y - 50, w: 1280, h: 60 }.solid!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -185956,7 +194902,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ args.outputs.labels << small_label(args, x, 15, "Click inside the blue box maybe ---->")~ ** Processing line: ~~ -** Processing line: ~ box = [785, 370, 50, 50, 0, 0, 170]~ +** Processing line: ~ box = { x: 785, y: 370, w: 50, h: 50, r: 0, g: 0, b: 170 }~ ** Processing line: ~ args.outputs.borders << box~ ** Processing line: ~~ ** Processing line: ~ # Saves the most recent click into args.state~ @@ -185978,11 +194924,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def small_label args, x, row, message~ -** Processing line: ~ [x, row_to_px(args, row), message, small_font]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def small_font~ -** Processing line: ~ [-2, 0, 0, 0, 0, 255]~ +** Processing line: ~ { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def row_to_px args, row_number~ @@ -185998,9 +194940,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state.key_event_occurred = true~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ -** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ -** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.debug << { x: 0, y: y - 50, w: 1280, h: 60 }.solid!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y, text: text, size_enum: 1, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ +** Processing line: ~ args.outputs.debug << { x: 640, y: y - 25, text: "(click to dismiss instructions)", size_enum: -2, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -186067,9 +195009,15 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # They are stored in game so that they do not get reset every tick~ ** Processing line: ~ if args.inputs.mouse.click~ ** Processing line: ~ if !args.state.box_collision_one~ -** Processing line: ~ args.state.box_collision_one = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 180, 0, 0, 180]~ +** Processing line: ~ args.state.box_collision_one = { x: args.inputs.mouse.click.point.x - 25,~ +** Processing line: ~ y: args.inputs.mouse.click.point.y - 25,~ +** Processing line: ~ w: 125, h: 125,~ +** Processing line: ~ r: 180, g: 0, b: 0, a: 180 }~ ** Processing line: ~ elsif !args.state.box_collision_two~ -** Processing line: ~ args.state.box_collision_two = [args.inputs.mouse.click.point.x - 25, args.inputs.mouse.click.point.y - 25, 125, 125, 0, 0, 180, 180]~ +** Processing line: ~ args.state.box_collision_two = { x: args.inputs.mouse.click.point.x - 25,~ +** Processing line: ~ y: args.inputs.mouse.click.point.y - 25,~ +** Processing line: ~ w: 125, h: 125,~ +** Processing line: ~ r: 0, g: 0, b: 180, a: 180 }~ ** Processing line: ~ else~ ** Processing line: ~ args.state.box_collision_one = nil~ ** Processing line: ~ args.state.box_collision_two = nil~ @@ -186096,15 +195044,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def small_label args, x, row, message~ -** Processing line: ~ [x, row_to_px(args, row), message, small_font]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def small_font~ -** Processing line: ~ [-2, 0, 0, 0, 0, 255]~ +** Processing line: ~ { x: x, y: row_to_px(args, row), text: message, size_enum: -2 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def row_to_px args, row_number~ -** Processing line: ~ args.grid.top.shift_down(5).shift_down(20 * row_number)~ +** Processing line: ~ args.grid.top - 5 - (20 * row_number)~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def tick_instructions args, text, y = 715~ @@ -186185,57 +195129,51 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def process_inputs~ ** Processing line: ~ state.buttons = []~ ** Processing line: ~~ -** Processing line: ~ state.buttons << [100, 500, inputs.controller_one.key_held.l1, "L1"]~ -** Processing line: ~ state.buttons << [100, 600, inputs.controller_one.key_held.l2, "L2"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [1100, 500, inputs.controller_one.key_held.r1, "R1"]~ -** Processing line: ~ state.buttons << [1100, 600, inputs.controller_one.key_held.r2, "R2"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [540, 450, inputs.controller_one.key_held.select, "Select"]~ -** Processing line: ~ state.buttons << [660, 450, inputs.controller_one.key_held.start, "Start"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [200, 300, inputs.controller_one.key_held.left, "Left"]~ -** Processing line: ~ state.buttons << [300, 400, inputs.controller_one.key_held.up, "Up"]~ -** Processing line: ~ state.buttons << [400, 300, inputs.controller_one.key_held.right, "Right"]~ -** Processing line: ~ state.buttons << [300, 200, inputs.controller_one.key_held.down, "Down"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [800, 300, inputs.controller_one.key_held.x, "X"]~ -** Processing line: ~ state.buttons << [900, 400, inputs.controller_one.key_held.y, "Y"]~ -** Processing line: ~ state.buttons << [1000, 300, inputs.controller_one.key_held.a, "A"]~ -** Processing line: ~ state.buttons << [900, 200, inputs.controller_one.key_held.b, "B"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [450 + inputs.controller_one.left_analog_x_perc * 100,~ -** Processing line: ~ 100 + inputs.controller_one.left_analog_y_perc * 100,~ -** Processing line: ~ inputs.controller_one.key_held.l3,~ -** Processing line: ~ "L3"]~ -** Processing line: ~~ -** Processing line: ~ state.buttons << [750 + inputs.controller_one.right_analog_x_perc * 100,~ -** Processing line: ~ 100 + inputs.controller_one.right_analog_y_perc * 100,~ -** Processing line: ~ inputs.controller_one.key_held.r3,~ -** Processing line: ~ "R3"]~ +** Processing line: ~ state.buttons << { x: 100, y: 500, active: inputs.controller_one.key_held.l1, text: "L1"}~ +** Processing line: ~ state.buttons << { x: 100, y: 600, active: inputs.controller_one.key_held.l2, text: "L2"}~ +** Processing line: ~ state.buttons << { x: 1100, y: 500, active: inputs.controller_one.key_held.r1, text: "R1"}~ +** Processing line: ~ state.buttons << { x: 1100, y: 600, active: inputs.controller_one.key_held.r2, text: "R2"}~ +** Processing line: ~ state.buttons << { x: 540, y: 450, active: inputs.controller_one.key_held.select, text: "Select"}~ +** Processing line: ~ state.buttons << { x: 660, y: 450, active: inputs.controller_one.key_held.start, text: "Start"}~ +** Processing line: ~ state.buttons << { x: 200, y: 300, active: inputs.controller_one.key_held.left, text: "Left"}~ +** Processing line: ~ state.buttons << { x: 300, y: 400, active: inputs.controller_one.key_held.up, text: "Up"}~ +** Processing line: ~ state.buttons << { x: 400, y: 300, active: inputs.controller_one.key_held.right, text: "Right"}~ +** Processing line: ~ state.buttons << { x: 300, y: 200, active: inputs.controller_one.key_held.down, text: "Down"}~ +** Processing line: ~ state.buttons << { x: 800, y: 300, active: inputs.controller_one.key_held.x, text: "X"}~ +** Processing line: ~ state.buttons << { x: 900, y: 400, active: inputs.controller_one.key_held.y, text: "Y"}~ +** Processing line: ~ state.buttons << { x: 1000, y: 300, active: inputs.controller_one.key_held.a, text: "A"}~ +** Processing line: ~ state.buttons << { x: 900, y: 200, active: inputs.controller_one.key_held.b, text: "B"}~ +** Processing line: ~ state.buttons << { x: 450 + inputs.controller_one.left_analog_x_perc * 100,~ +** Processing line: ~ y: 100 + inputs.controller_one.left_analog_y_perc * 100,~ +** Processing line: ~ active: inputs.controller_one.key_held.l3,~ +** Processing line: ~ text: "L3" }~ +** Processing line: ~ state.buttons << { x: 750 + inputs.controller_one.right_analog_x_perc * 100,~ +** Processing line: ~ y: 100 + inputs.controller_one.right_analog_y_perc * 100,~ +** Processing line: ~ active: inputs.controller_one.key_held.r3,~ +** Processing line: ~ text: "R3" }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Gives each button a square shape.~ ** Processing line: ~ # If the button is being pressed or held (which means it is considered active),~ ** Processing line: ~ # the square is filled in. Otherwise, the button simply has a border.~ ** Processing line: ~ def render~ -** Processing line: ~ state.buttons.each do |x, y, active, text|~ -** Processing line: ~ rect = [x, y, 75, 75]~ +** Processing line: ~ state.buttons.each do |b|~ +** Processing line: ~ rect = { x: b.x, y: b.y, w: 75, h: 75 }~ ** Processing line: ~~ -** Processing line: ~ if active # if button is pressed~ +** Processing line: ~ if b.active # if button is pressed~ ** Processing line: ~ outputs.solids << rect # rect is output as solid (filled in)~ ** Processing line: ~ else~ ** Processing line: ~ outputs.borders << rect # otherwise, output as border~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Outputs the text of each button using labels.~ -** Processing line: ~ outputs.labels << [x, y + 95, text] # add 95 to place label above button~ +** Processing line: ~ outputs.labels << { x: b.x, y: b.y + 95, text: b.text } # add 95 to place label above button~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ outputs.labels << [10, 60, "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)"]~ -** Processing line: ~ outputs.labels << [10, 30, "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)"]~ -** Processing line: ~ outputs.labels << [900, 60, "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)"]~ -** Processing line: ~ outputs.labels << [900, 30, "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)"]~ +** Processing line: ~ outputs.labels << { x: 10, y: 60, text: "Left Analog x: #{inputs.controller_one.left_analog_x_raw} (#{inputs.controller_one.left_analog_x_perc * 100}%)" }~ +** Processing line: ~ outputs.labels << { x: 10, y: 30, text: "Left Analog y: #{inputs.controller_one.left_analog_y_raw} (#{inputs.controller_one.left_analog_y_perc * 100}%)" }~ +** Processing line: ~ outputs.labels << { x: 900, y: 60, text: "Right Analog x: #{inputs.controller_one.right_analog_x_raw} (#{inputs.controller_one.right_analog_x_perc * 100}%)" }~ +** Processing line: ~ outputs.labels << { x: 900, y: 30, text: "Right Analog y: #{inputs.controller_one.right_analog_y_raw} (#{inputs.controller_one.right_analog_y_perc * 100}%)" }~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -186301,10 +195239,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # the next new touch will be finger_one again, but until then, new touches~ ** Processing line: ~ # don't fill in earlier slots.~ ** Processing line: ~ if !args.inputs.finger_one.nil?~ -** Processing line: ~ args.outputs.primitives << [640, 650, "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).", 5, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.primitives << { x: 640, y: 650, text: "Finger #1 is touching at (#{args.inputs.finger_one.x}, #{args.inputs.finger_one.y}).",~ +** Processing line: ~ size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ ** Processing line: ~ end~ ** Processing line: ~ if !args.inputs.finger_two.nil?~ -** Processing line: ~ args.outputs.primitives << [640, 600, "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).", 5, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.primitives << { x: 640, y: 600, text: "Finger #2 is touching at (#{args.inputs.finger_two.x}, #{args.inputs.finger_two.y}).",~ +** Processing line: ~ size_enum: 5, alignment_enum: 1, r: 255, g: 255, b: 255 }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Here's the more flexible interface: this will report as many simultaneous~ @@ -186325,12 +195265,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ r = (color & 0xFF0000) >> 16~ ** Processing line: ~ g = (color & 0x00FF00) >> 8~ ** Processing line: ~ b = (color & 0x0000FF)~ -** Processing line: ~ args.outputs.primitives << [v.x - (size / 2), v.y + (size / 2), size, size, r, g, b, 255].solid~ -** Processing line: ~ args.outputs.primitives << [v.x, v.y + size, k.to_s, 0, 1, 0, 0, 0].label~ +** Processing line: ~ args.outputs.primitives << { x: v.x - (size / 2), y: v.y + (size / 2), w: size, h: size, r: r, g: g, b: b, a: 255 }.solid!~ +** Processing line: ~ args.outputs.primitives << { x: v.x, y: v.y + size, text: k.to_s, alignment_enum: 1 }.label!~ ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~~ ** Processing line: ~#+end_src~ - PRE end detected. ** Processing line: ~~ @@ -186384,6 +195323,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # in this tick "entry point": `looping_animation`, and the~ ** Processing line: ~ # second method is `one_time_animation`.~ ** Processing line: ~ def tick args~ +** Processing line: ~ # uncomment the line below to see animation play out in slow motion~ +** Processing line: ~ # args.gtk.slowmo! 6~ ** Processing line: ~ looping_animation args~ ** Processing line: ~ one_time_animation args~ ** Processing line: ~ end~ @@ -186416,22 +195357,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ does_sprite_loop~ ** Processing line: ~~ ** Processing line: ~ # Now that we have `sprite_index, we can present the correct file.~ -** Processing line: ~ args.outputs.sprites << [100, 100, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]~ +** Processing line: ~ args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }~ ** Processing line: ~~ ** Processing line: ~ # Try changing the numbers below to see how the animation changes:~ -** Processing line: ~ args.outputs.sprites << [100, 200, 100, 100, "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png"]~ +** Processing line: ~ args.outputs.sprites << { x: 100, y: 200, w: 100, h: 100, path: "sprites/dragon_fly_#{0.frame_index 6, 4, true}.png" }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # This function shows how to animate a sprite that executes~ ** Processing line: ~ # only once when the "f" key is pressed.~ ** Processing line: ~ def one_time_animation args~ ** Processing line: ~ # This is just a label the shows instructions within the game.~ -** Processing line: ~ args.outputs.labels << [220, 350, "(press f to animate)"]~ +** Processing line: ~ args.outputs.labels << { x: 220, y: 350, text: "(press f to animate)" }~ ** Processing line: ~~ ** Processing line: ~ # If "f" is pressed on the keyboard...~ ** Processing line: ~ if args.inputs.keyboard.key_down.f~ ** Processing line: ~ # Print the frame that "f" was pressed on.~ -** Processing line: ~ puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.inputs.keyboard.key_down.f}"~ +** Processing line: ~ puts "Hello from main.rb! The \"f\" key was in the down state on frame: #{args.state.tick_count}"~ ** Processing line: ~~ ** Processing line: ~ # And MOST IMPORTANTLY set the point it time to start the animation,~ ** Processing line: ~ # equal to "now" which is represented as args.state.tick_count.~ @@ -186464,7 +195405,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ sprite_index ||= 0~ ** Processing line: ~~ ** Processing line: ~ # Present the sprite.~ -** Processing line: ~ args.outputs.sprites << [100, 300, 100, 100, "sprites/dragon_fly_#{sprite_index}.png"]~ +** Processing line: ~ args.outputs.sprites << { x: 100, y: 300, w: 100, h: 100, path: "sprites/dragon_fly_#{sprite_index}.png" }~ ** Processing line: ~~ ** Processing line: ~ tick_instructions args, "Sample app shows how to use Numeric#frame_index and string interpolation to animate a sprite over time."~ ** Processing line: ~ end~ @@ -188592,9 +197533,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ mouse_overlay = mouse_overlay.merge r: 255 if state.delete_mode~ ** Processing line: ~~ ** Processing line: ~ if state.mouse_held~ -** Processing line: ~ outputs.primitives << mouse_overlay.border~ +** Processing line: ~ outputs.primitives << mouse_overlay.border!~ ** Processing line: ~ else~ -** Processing line: ~ outputs.primitives << mouse_overlay.solid~ +** Processing line: ~ outputs.primitives << mouse_overlay.solid!~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -193281,6 +202222,1068 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Advanced Audio - Audio Mixer - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Audio Mixer - 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 Audio - Audio Mixer - 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_audio/01_audio_mixer/app/main.rb~ +** Processing line: ~ # these are the properties that you can sent on args.audio~ +** Processing line: ~ def spawn_new_sound args, name, path~ +** Processing line: ~ # Spawn randomly in an area that won't be covered by UI.~ +** Processing line: ~ screenx = (rand * 600.0) + 200.0~ +** Processing line: ~ screeny = (rand * 400.0) + 100.0~ +** Processing line: ~~ +** Processing line: ~ id = new_sound_id! args~ +** Processing line: ~ # you can hang anything on the audio hashes you want, so we store the~ +** Processing line: ~ # actual screen position in here for convenience.~ +** Processing line: ~ args.audio[id] = {~ +** Processing line: ~ name: name,~ +** Processing line: ~ input: path,~ +** Processing line: ~ screenx: screenx,~ +** Processing line: ~ screeny: screeny,~ +** Processing line: ~ x: ((screenx / 1279.0) * 2.0) - 1.0, # scale to -1.0 - 1.0 range~ +** Processing line: ~ y: ((screeny / 719.0) * 2.0) - 1.0, # scale to -1.0 - 1.0 range~ +** Processing line: ~ z: 0.0,~ +** Processing line: ~ gain: 1.0,~ +** Processing line: ~ pitch: 1.0,~ +** Processing line: ~ looping: true,~ +** Processing line: ~ paused: false~ +** Processing line: ~ }~ +** Processing line: ~~ +** Processing line: ~ args.state.selected = id~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # these are values you can change on the ~args.audio~ data structure~ +** Processing line: ~ def input_panel args~ +** Processing line: ~ return unless args.state.panel~ +** Processing line: ~ return if args.state.dragging~ +** Processing line: ~~ +** Processing line: ~ audio_entry = args.audio[args.state.selected]~ +** Processing line: ~ results = args.state.panel~ +** Processing line: ~~ +** Processing line: ~ if args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.pitch_slider_rect.rect)~ +** Processing line: ~ audio_entry.pitch = 2.0 * ((args.inputs.mouse.x - results.pitch_slider_rect.x).to_f / (results.pitch_slider_rect.w - 1.0))~ +** Processing line: ~ elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.playtime_slider_rect.rect)~ +** Processing line: ~ audio_entry.playtime = audio_entry.length_ * ((args.inputs.mouse.x - results.playtime_slider_rect.x).to_f / (results.playtime_slider_rect.w - 1.0))~ +** Processing line: ~ elsif args.state.mouse_state == :held && args.inputs.mouse.position.inside_rect?(results.gain_slider_rect.rect)~ +** Processing line: ~ audio_entry.gain = (args.inputs.mouse.x - results.gain_slider_rect.x).to_f / (results.gain_slider_rect.w - 1.0)~ +** Processing line: ~ elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.looping_checkbox_rect.rect)~ +** Processing line: ~ audio_entry.looping = !audio_entry.looping~ +** Processing line: ~ elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.paused_checkbox_rect.rect)~ +** Processing line: ~ audio_entry.paused = !audio_entry.paused~ +** Processing line: ~ elsif args.inputs.mouse.click && args.inputs.mouse.position.inside_rect?(results.delete_button_rect.rect)~ +** Processing line: ~ args.audio.delete args.state.selected~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_sources args~ +** Processing line: ~ args.outputs.primitives << args.audio.keys.map do |k|~ +** Processing line: ~ s = args.audio[k]~ +** Processing line: ~~ +** Processing line: ~ isselected = (k == args.state.selected)~ +** Processing line: ~~ +** Processing line: ~ color = isselected ? [ 0, 255, 0, 255 ] : [ 0, 0, 255, 255 ]~ +** Processing line: ~ [~ +** Processing line: ~ [s.screenx, s.screeny, args.state.boxsize, args.state.boxsize, *color].solid,~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ x: s.screenx + args.state.boxsize.half,~ +** Processing line: ~ y: s.screeny,~ +** Processing line: ~ text: s.name,~ +** Processing line: ~ r: 255,~ +** Processing line: ~ g: 255,~ +** Processing line: ~ b: 255,~ +** Processing line: ~ alignment_enum: 1~ +** Processing line: ~ }.label!~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def playtime_str t~ +** Processing line: ~ minutes = (t / 60.0).floor~ +** Processing line: ~ seconds = t - (minutes * 60.0).to_f~ +** Processing line: ~ return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def label_with_drop_shadow x, y, text~ +** Processing line: ~ [~ +** Processing line: ~ { x: x + 1, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 0, g: 0, b: 0 }.label!,~ +** Processing line: ~ { x: x + 2, y: y + 0, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 0, g: 0, b: 0 }.label!,~ +** Processing line: ~ { x: x + 0, y: y + 1, text: text, vertical_alignment_enum: 1, alignment_enum: 1, r: 200, g: 200, b: 200 }.label!~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def check_box opts = {}~ +** Processing line: ~ checkbox_template = opts.args.layout.rect(w: 0.5, h: 0.5, col: 2)~ +** Processing line: ~ final_rect = checkbox_template.center_inside_rect_y(opts.args.layout.rect(row: opts.row, col: opts.col))~ +** Processing line: ~ color = { r: 0, g: 0, b: 0 }~ +** Processing line: ~ color = { r: 255, g: 255, b: 255 } if opts.checked~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ rect: final_rect,~ +** Processing line: ~ primitives: [~ +** Processing line: ~ (final_rect.to_solid color)~ +** Processing line: ~ ]~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def progress_bar opts = {}~ +** Processing line: ~ outer_rect = opts.args.layout.rect(row: opts.row, col: opts.col, w: 5, h: 1)~ +** Processing line: ~ color = opts.percentage * 255~ +** Processing line: ~ baseline_progress_bar = opts.args~ +** Processing line: ~ .layout~ +** Processing line: ~ .rect(w: 5, h: 0.5)~ +** Processing line: ~~ +** Processing line: ~ final_rect = baseline_progress_bar.center_inside_rect(outer_rect)~ +** Processing line: ~ center = final_rect.rect_center_point~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ rect: final_rect,~ +** Processing line: ~ primitives: [~ +** Processing line: ~ final_rect.merge(r: color, g: color, b: color, a: 128).solid!,~ +** Processing line: ~ label_with_drop_shadow(center.x, center.y, opts.text)~ +** Processing line: ~ ]~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def panel_primitives args, audio_entry~ +** Processing line: ~ results = { primitives: [] }~ +** Processing line: ~~ +** Processing line: ~ return results unless audio_entry~ +** Processing line: ~~ +** Processing line: ~ # this uses DRGTK's layout apis to layout the controls~ +** Processing line: ~ # imagine the screen is split into equal cells (24 cells across, 12 cells up and down)~ +** Processing line: ~ # args.layout.rect returns a hash which we merge values with to create primitives~ +** Processing line: ~ # using args.layout.rect removes the need for pixel pushing~ +** Processing line: ~~ +** Processing line: ~ # args.outputs.debug << args.layout.debug_primitives(r: 255, g: 255, b: 255)~ +** Processing line: ~~ +** Processing line: ~ white_color = { r: 255, g: 255, b: 255 }~ +** Processing line: ~ label_style = white_color.merge(vertical_alignment_enum: 1)~ +** Processing line: ~~ +** Processing line: ~ # panel background~ +** Processing line: ~ results.primitives << args.layout.rect(row: 0, col: 0, w: 7, h: 6, include_col_gutter: true, include_row_gutter: true)~ +** Processing line: ~ .border!(r: 255, g: 255, b: 255)~ +** Processing line: ~~ +** Processing line: ~ # title~ +** Processing line: ~ results.primitives << args.layout.point(row: 0, col: 3.5, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "Source #{args.state.selected} (#{args.audio[args.state.selected].name})",~ +** Processing line: ~ size_enum: 3,~ +** Processing line: ~ alignment_enum: 1)~ +** Processing line: ~~ +** Processing line: ~ # seperator line~ +** Processing line: ~ results.primitives << args.layout.rect(row: 1, col: 0, w: 7, h: 0)~ +** Processing line: ~ .line!(white_color)~ +** Processing line: ~~ +** Processing line: ~ # screen location~ +** Processing line: ~ results.primitives << args.layout.point(row: 1.0, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "screen:")~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 1.0, col: 2, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "(#{audio_entry.screenx.to_i}, #{audio_entry.screeny.to_i})")~ +** Processing line: ~~ +** Processing line: ~ # position~ +** Processing line: ~ results.primitives << args.layout.point(row: 1.5, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "position:")~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 1.5, col: 2, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "(#{audio_entry[:x].round(5).to_s[0..6]}, #{audio_entry[:y].round(5).to_s[0..6]})")~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 2.0, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "pitch:")~ +** Processing line: ~~ +** Processing line: ~ results.pitch_slider_rect = progress_bar(row: 2.0, col: 2,~ +** Processing line: ~ percentage: audio_entry.pitch / 2.0,~ +** Processing line: ~ text: "#{audio_entry.pitch.to_sf}",~ +** Processing line: ~ args: args)~ +** Processing line: ~~ +** Processing line: ~ results.primitives << results.pitch_slider_rect.primitives~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 2.5, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "playtime:")~ +** Processing line: ~~ +** Processing line: ~ results.playtime_slider_rect = progress_bar(args: args,~ +** Processing line: ~ row: 2.5,~ +** Processing line: ~ col: 2,~ +** Processing line: ~ percentage: audio_entry.playtime / audio_entry.length_,~ +** Processing line: ~ text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")~ +** Processing line: ~~ +** Processing line: ~ results.primitives << results.playtime_slider_rect.primitives~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 3.0, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "gain:")~ +** Processing line: ~~ +** Processing line: ~ results.gain_slider_rect = progress_bar(args: args,~ +** Processing line: ~ row: 3.0,~ +** Processing line: ~ col: 2,~ +** Processing line: ~ percentage: audio_entry.gain,~ +** Processing line: ~ text: "#{audio_entry.gain.to_sf}")~ +** Processing line: ~~ +** Processing line: ~ results.primitives << results.gain_slider_rect.primitives~ +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 3.5, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "looping:")~ +** Processing line: ~~ +** Processing line: ~ checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)~ +** Processing line: ~~ +** Processing line: ~ results.looping_checkbox_rect = check_box(args: args, row: 3.5, col: 2, checked: audio_entry.looping)~ +** Processing line: ~ results.primitives << results.looping_checkbox_rect.primitives~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 4.0, col: 0, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "paused:")~ +** Processing line: ~~ +** Processing line: ~ checkbox_template = args.layout.rect(w: 0.5, h: 0.5, col: 2)~ +** Processing line: ~~ +** Processing line: ~ results.paused_checkbox_rect = check_box(args: args, row: 4.0, col: 2, checked: !audio_entry.paused)~ +** Processing line: ~ results.primitives << results.paused_checkbox_rect.primitives~ +** Processing line: ~~ +** Processing line: ~ results.delete_button_rect = { rect: args.layout.rect(row: 5, col: 0, w: 7, h: 1) }~ +** Processing line: ~~ +** Processing line: ~ results.primitives << results.delete_button_rect.to_solid(r: 180)~ +** Processing line: ~~ +** Processing line: ~ results.primitives << args.layout.point(row: 5, col: 3.5, row_anchor: 0.5)~ +** Processing line: ~ .merge(label_style)~ +** Processing line: ~ .merge(text: "DELETE", alignment_enum: 1)~ +** Processing line: ~~ +** Processing line: ~ return results~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_panel args~ +** Processing line: ~ args.state.panel = nil~ +** Processing line: ~ audio_entry = args.audio[args.state.selected]~ +** Processing line: ~ return unless audio_entry~ +** Processing line: ~~ +** Processing line: ~ mouse_down = (args.state.mouse_held >= 0)~ +** Processing line: ~ args.state.panel = panel_primitives args, audio_entry~ +** Processing line: ~ args.outputs.primitives << args.state.panel.primitives~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_sound_id! args~ +** Processing line: ~ args.state.sound_id ||= 0~ +** Processing line: ~ args.state.sound_id += 1~ +** Processing line: ~ args.state.sound_id~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_launcher args~ +** Processing line: ~ args.outputs.primitives << args.state.spawn_sound_buttons.map(&:primitives)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_ui args~ +** Processing line: ~ render_launcher args~ +** Processing line: ~ render_panel args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ defaults args~ +** Processing line: ~ render args~ +** Processing line: ~ input args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input args~ +** Processing line: ~ if !args.audio[args.state.selected]~ +** Processing line: ~ args.state.selected = nil~ +** Processing line: ~ args.state.dragging = nil~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # spawn button and node interaction~ +** Processing line: ~ if args.inputs.mouse.click~ +** Processing line: ~ spawn_sound_button = args.state.spawn_sound_buttons.find { |b| args.inputs.mouse.inside_rect? b.rect }~ +** Processing line: ~~ +** Processing line: ~ audio_click_key, audio_click_value = args.audio.find do |k, v|~ +** Processing line: ~ args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if spawn_sound_button~ +** Processing line: ~ args.state.selected = nil~ +** Processing line: ~ spawn_new_sound args, spawn_sound_button.name, spawn_sound_button.path~ +** Processing line: ~ elsif audio_click_key~ +** Processing line: ~ args.state.selected = audio_click_key~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.state.mouse_state == :held && args.state.selected~ +** Processing line: ~ v = args.audio[args.state.selected]~ +** Processing line: ~ if args.inputs.mouse.inside_rect? [v.screenx, v.screeny, args.state.boxsize, args.state.boxsize]~ +** Processing line: ~ args.state.dragging = args.state.selected~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.state.dragging~ +** Processing line: ~ s = args.audio[args.state.selected]~ +** Processing line: ~ # you can hang anything on the audio hashes you want, so we store the~ +** Processing line: ~ # actual screen position so it doesn't scale weirdly vs your mouse.~ +** Processing line: ~ s.screenx = args.inputs.mouse.x - (args.state.boxsize / 2)~ +** Processing line: ~ s.screeny = args.inputs.mouse.y - (args.state.boxsize / 2)~ +** Processing line: ~~ +** Processing line: ~ s.screeny = 50 if s.screeny < 50~ +** Processing line: ~ s.screeny = (719 - args.state.boxsize) if s.screeny > (719 - args.state.boxsize)~ +** Processing line: ~ s.screenx = 0 if s.screenx < 0~ +** Processing line: ~ s.screenx = (1279 - args.state.boxsize) if s.screenx > (1279 - args.state.boxsize)~ +** Processing line: ~~ +** Processing line: ~ s.x = ((s.screenx / 1279.0) * 2.0) - 1.0 # scale to -1.0 - 1.0 range~ +** Processing line: ~ s.y = ((s.screeny / 719.0) * 2.0) - 1.0 # scale to -1.0 - 1.0 range~ +** Processing line: ~ end~ +** Processing line: ~ elsif args.state.mouse_state == :released~ +** Processing line: ~ args.state.dragging = nil~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ input_panel args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults args~ +** Processing line: ~ args.state.mouse_state ||= :released~ +** Processing line: ~ args.state.dragging_source ||= false~ +** Processing line: ~ args.state.selected ||= 0~ +** Processing line: ~ args.state.next_sound_index ||= 0~ +** Processing line: ~ args.state.boxsize ||= 30~ +** Processing line: ~ args.state.sound_files ||= [~ +** Processing line: ~ { name: :tada, path: "sounds/tada.wav" },~ +** Processing line: ~ { name: :splash, path: "sounds/splash.wav" },~ +** Processing line: ~ { name: :drum, path: "sounds/drum.wav" },~ +** Processing line: ~ { name: :spring, path: "sounds/spring.wav" },~ +** Processing line: ~ { name: :music, path: "sounds/music.ogg" }~ +** Processing line: ~ ]~ +** Processing line: ~~ +** Processing line: ~ # generate buttons based off the sound collection above~ +** Processing line: ~ args.state.spawn_sound_buttons ||= begin~ +** Processing line: ~ # create a group of buttons~ +** Processing line: ~ # column centered (using col_offset to calculate the column offset)~ +** Processing line: ~ # where each item is 2 columns apart~ +** Processing line: ~ rects = args.layout.rect_group row: 11,~ +** Processing line: ~ col_offset: {~ +** Processing line: ~ count: args.state.sound_files.length,~ +** Processing line: ~ w: 2~ +** Processing line: ~ },~ +** Processing line: ~ dcol: 2,~ +** Processing line: ~ w: 2,~ +** Processing line: ~ h: 1,~ +** Processing line: ~ group: args.state.sound_files~ +** Processing line: ~~ +** Processing line: ~ # now that you have the rects~ +** Processing line: ~ # construct the metadata for the buttons~ +** Processing line: ~ rects.map do |rect|~ +** Processing line: ~ {~ +** Processing line: ~ rect: rect,~ +** Processing line: ~ name: rect.name,~ +** Processing line: ~ path: rect.path,~ +** Processing line: ~ primitives: [~ +** Processing line: ~ rect.to_border(r: 255, g: 255, b: 255),~ +** Processing line: ~ rect.to_label(x: rect.center_x,~ +** Processing line: ~ y: rect.center_y,~ +** Processing line: ~ text: "#{rect.name}",~ +** Processing line: ~ alignment_enum: 1,~ +** Processing line: ~ vertical_alignment_enum: 1,~ +** Processing line: ~ r: 255, g: 255, b: 255)~ +** Processing line: ~ ]~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.mouse.up~ +** Processing line: ~ args.state.mouse_state = :released~ +** Processing line: ~ args.state.dragging_source = false~ +** Processing line: ~ elsif args.inputs.mouse.down~ +** Processing line: ~ args.state.mouse_state = :held~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.background_color = [ 0, 0, 0, 255 ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render args~ +** Processing line: ~ render_ui args~ +** Processing line: ~ render_sources args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Advanced Audio - Audio Mixer - server_ip_address.txt~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Audio Mixer - server_ip_address.txt~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Audio Mixer - server_ip_address.txt~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/07_advanced_audio/01_audio_mixer/app/server_ip_address.txt~ +** Processing line: ~ 192.168.1.65~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt~ +** Processing line: ~ # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~ +** Processing line: ~ # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~ +** Processing line: ~~ +** Processing line: ~ # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~ +** Processing line: ~ teamid=~ +** Processing line: ~ # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~ +** Processing line: ~ appid=~ +** Processing line: ~ # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~ +** Processing line: ~ appname=~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Advanced Audio - Sound Synthesis - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Audio - Sound Synthesis - 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 Audio - Sound Synthesis - 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_audio/02_sound_synthesis/app/main.rb~ +** Processing line: ~ begin # region: top level tick methods~ +** Processing line: ~ def tick args~ +** Processing line: ~ defaults args~ +** Processing line: ~ render args~ +** Processing line: ~ input args~ +** Processing line: ~ process_audio_queue args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults args~ +** Processing line: ~ args.state.sine_waves ||= {}~ +** Processing line: ~ args.state.square_waves ||= {}~ +** Processing line: ~ args.state.saw_tooth_waves ||= {}~ +** Processing line: ~ args.state.triangle_waves ||= {}~ +** Processing line: ~ args.state.audio_queue ||= []~ +** Processing line: ~ args.state.buttons ||= [~ +** Processing line: ~ (frequency_buttons args),~ +** Processing line: ~ (sine_wave_note_buttons args),~ +** Processing line: ~ (bell_buttons args),~ +** Processing line: ~ (square_wave_note_buttons args),~ +** Processing line: ~ (saw_tooth_wave_note_buttons args),~ +** Processing line: ~ (triangle_wave_note_buttons args),~ +** Processing line: ~ ].flatten~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render args~ +** Processing line: ~ args.outputs.borders << args.state.buttons.map { |b| b[:border] }~ +** Processing line: ~ args.outputs.labels << args.state.buttons.map { |b| b[:label] }~ +** Processing line: ~ args.outputs.labels << args.layout~ +** Processing line: ~ .rect(row: 0, col: 11.5)~ +** Processing line: ~ .yield_self { |r| r.merge y: r.y + r.h }~ +** Processing line: ~ .merge(text: "This is a Pro only feature. Click here to watch the YouTube video if you are on the Standard License.",~ +** Processing line: ~ alignment_enum: 1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~ def input args~ +** Processing line: ~ args.state.buttons.each do |b|~ +** Processing line: ~ if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? b[:rect])~ +** Processing line: ~ parameter_string = (b.slice :frequency, :note, :octave).map { |k, v| "#{k}: #{v}" }.join ", "~ +** Processing line: ~ args.gtk.notify! "#{b[:method_to_call]} #{parameter_string}"~ +** Processing line: ~ send b[:method_to_call], args, b~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.mouse.click && (args.inputs.mouse.click.inside_rect? (args.layout.rect(row: 0).yield_self { |r| r.merge y: r.y + r.h.half, h: r.h.half }))~ +** Processing line: ~ args.gtk.openurl 'https://www.youtube.com/watch?v=zEzovM5jT-k&ab_channel=AmirRajan'~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def process_audio_queue args~ +** Processing line: ~ to_queue = args.state.audio_queue.find_all { |v| v[:queue_at] <= args.tick_count }~ +** Processing line: ~ args.state.audio_queue -= to_queue~ +** Processing line: ~ to_queue.each { |a| args.audio[a[:id]] = a }~ +** Processing line: ~~ +** Processing line: ~ args.audio.find_all { |k, v| v[:decay_rate] }~ +** Processing line: ~ .each { |k, v| v[:gain] -= v[:decay_rate] }~ +** Processing line: ~~ +** Processing line: ~ sounds_to_stop = args.audio~ +** Processing line: ~ .find_all { |k, v| v[:stop_at] && args.state.tick_count >= v[:stop_at] }~ +** Processing line: ~ .map { |k, v| k }~ +** Processing line: ~~ +** Processing line: ~ sounds_to_stop.each { |k| args.audio.delete k }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: button definitions, ui layout, callback functions~ +** Processing line: ~ def button args, opts~ +** Processing line: ~ button_def = opts.merge rect: (args.layout.rect (opts.merge w: 2, h: 1))~ +** Processing line: ~~ +** Processing line: ~ button_def[:border] = button_def[:rect].merge r: 0, g: 0, b: 0~ +** Processing line: ~~ +** Processing line: ~ label_offset_x = 5~ +** Processing line: ~ label_offset_y = 30~ +** Processing line: ~~ +** Processing line: ~ button_def[:label] = button_def[:rect].merge text: opts[:text],~ +** Processing line: ~ size_enum: -2.5,~ +** Processing line: ~ x: button_def[:rect].x + label_offset_x,~ +** Processing line: ~ y: button_def[:rect].y + label_offset_y~ +** Processing line: ~~ +** Processing line: ~ button_def~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def play_sine_wave args, sender~ +** Processing line: ~ queue_sine_wave args,~ +** Processing line: ~ frequency: sender[:frequency],~ +** Processing line: ~ duration: 1.seconds,~ +** Processing line: ~ fade_out: true~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def play_note args, sender~ +** Processing line: ~ method_to_call = :queue_sine_wave~ +** Processing line: ~ method_to_call = :queue_square_wave if sender[:type] == :square~ +** Processing line: ~ method_to_call = :queue_saw_tooth_wave if sender[:type] == :saw_tooth~ +** Processing line: ~ method_to_call = :queue_triangle_wave if sender[:type] == :triangle~ +** Processing line: ~ method_to_call = :queue_bell if sender[:type] == :bell~ +** Processing line: ~~ +** Processing line: ~ send method_to_call, args,~ +** Processing line: ~ frequency: (frequency_for note: sender[:note], octave: sender[:octave]),~ +** Processing line: ~ duration: 1.seconds,~ +** Processing line: ~ fade_out: true~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def frequency_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.0, col: 0, text: "300hz",~ +** Processing line: ~ frequency: 300,~ +** Processing line: ~ method_to_call: :play_sine_wave),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.0, col: 0, text: "400hz",~ +** Processing line: ~ frequency: 400,~ +** Processing line: ~ method_to_call: :play_sine_wave),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.0, col: 0, text: "500hz",~ +** Processing line: ~ frequency: 500,~ +** Processing line: ~ method_to_call: :play_sine_wave),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def sine_wave_note_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 1.5, col: 2, text: "Sine C4",~ +** Processing line: ~ note: :c, octave: 4, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 2.5, col: 2, text: "Sine D4",~ +** Processing line: ~ note: :d, octave: 4, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 3.5, col: 2, text: "Sine E4",~ +** Processing line: ~ note: :e, octave: 4, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.5, col: 2, text: "Sine F4",~ +** Processing line: ~ note: :f, octave: 4, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.5, col: 2, text: "Sine G4",~ +** Processing line: ~ note: :g, octave: 4, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.5, col: 2, text: "Sine A5",~ +** Processing line: ~ note: :a, octave: 5, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 7.5, col: 2, text: "Sine B5",~ +** Processing line: ~ note: :b, octave: 5, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 8.5, col: 2, text: "Sine C5",~ +** Processing line: ~ note: :c, octave: 5, type: :sine, method_to_call: :play_note),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def square_wave_note_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 1.5, col: 6, text: "Square C4",~ +** Processing line: ~ note: :c, octave: 4, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 2.5, col: 6, text: "Square D4",~ +** Processing line: ~ note: :d, octave: 4, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 3.5, col: 6, text: "Square E4",~ +** Processing line: ~ note: :e, octave: 4, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.5, col: 6, text: "Square F4",~ +** Processing line: ~ note: :f, octave: 4, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.5, col: 6, text: "Square G4",~ +** Processing line: ~ note: :g, octave: 4, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.5, col: 6, text: "Square A5",~ +** Processing line: ~ note: :a, octave: 5, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 7.5, col: 6, text: "Square B5",~ +** Processing line: ~ note: :b, octave: 5, type: :square, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 8.5, col: 6, text: "Square C5",~ +** Processing line: ~ note: :c, octave: 5, type: :square, method_to_call: :play_note),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~ def saw_tooth_wave_note_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 1.5, col: 8, text: "Saw C4",~ +** Processing line: ~ note: :c, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 2.5, col: 8, text: "Saw D4",~ +** Processing line: ~ note: :d, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 3.5, col: 8, text: "Saw E4",~ +** Processing line: ~ note: :e, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.5, col: 8, text: "Saw F4",~ +** Processing line: ~ note: :f, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.5, col: 8, text: "Saw G4",~ +** Processing line: ~ note: :g, octave: 4, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.5, col: 8, text: "Saw A5",~ +** Processing line: ~ note: :a, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 7.5, col: 8, text: "Saw B5",~ +** Processing line: ~ note: :b, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 8.5, col: 8, text: "Saw C5",~ +** Processing line: ~ note: :c, octave: 5, type: :saw_tooth, method_to_call: :play_note),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def triangle_wave_note_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 1.5, col: 10, text: "Triangle C4",~ +** Processing line: ~ note: :c, octave: 4, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 2.5, col: 10, text: "Triangle D4",~ +** Processing line: ~ note: :d, octave: 4, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 3.5, col: 10, text: "Triangle E4",~ +** Processing line: ~ note: :e, octave: 4, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.5, col: 10, text: "Triangle F4",~ +** Processing line: ~ note: :f, octave: 4, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.5, col: 10, text: "Triangle G4",~ +** Processing line: ~ note: :g, octave: 4, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.5, col: 10, text: "Triangle A5",~ +** Processing line: ~ note: :a, octave: 5, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 7.5, col: 10, text: "Triangle B5",~ +** Processing line: ~ note: :b, octave: 5, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 8.5, col: 10, text: "Triangle C5",~ +** Processing line: ~ note: :c, octave: 5, type: :triangle, method_to_call: :play_note),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def bell_buttons args~ +** Processing line: ~ [~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 1.5, col: 4, text: "Bell C4",~ +** Processing line: ~ note: :c, octave: 4, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 2.5, col: 4, text: "Bell D4",~ +** Processing line: ~ note: :d, octave: 4, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 3.5, col: 4, text: "Bell E4",~ +** Processing line: ~ note: :e, octave: 4, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 4.5, col: 4, text: "Bell F4",~ +** Processing line: ~ note: :f, octave: 4, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 5.5, col: 4, text: "Bell G4",~ +** Processing line: ~ note: :g, octave: 4, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 6.5, col: 4, text: "Bell A5",~ +** Processing line: ~ note: :a, octave: 5, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 7.5, col: 4, text: "Bell B5",~ +** Processing line: ~ note: :b, octave: 5, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ (button args,~ +** Processing line: ~ row: 8.5, col: 4, text: "Bell C5",~ +** Processing line: ~ note: :c, octave: 5, type: :bell, method_to_call: :play_note),~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: wave generation~ +** Processing line: ~ begin # sine wave~ +** Processing line: ~ def defaults_sine_wave_for~ +** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def sine_wave_for opts = {}~ +** Processing line: ~ opts = defaults_sine_wave_for.merge opts~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = opts[:sample_rate]~ +** Processing line: ~ period_size = (sample_rate.fdiv frequency).ceil~ +** Processing line: ~ period_size.map_with_index do |i|~ +** Processing line: ~ Math::sin((2.0 * Math::PI) / (sample_rate.to_f / frequency.to_f) * i)~ +** Processing line: ~ end.to_a~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_queue_sine_wave~ +** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_sine_wave args, opts = {}~ +** Processing line: ~ opts = defaults_queue_sine_wave.merge opts~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = 48000~ +** Processing line: ~~ +** Processing line: ~ sine_wave = sine_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~ args.state.sine_waves[frequency] ||= sine_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~~ +** Processing line: ~ proc = lambda do~ +** Processing line: ~ generate_audio_data args.state.sine_waves[frequency], sample_rate~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ audio_state = new_audio_state args, opts~ +** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ +** Processing line: ~ queue_audio args, audio_state: audio_state, wave: sine_wave~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: square wave~ +** Processing line: ~ def defaults_square_wave_for~ +** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def square_wave_for opts = {}~ +** Processing line: ~ opts = defaults_square_wave_for.merge opts~ +** Processing line: ~ sine_wave = sine_wave_for opts~ +** Processing line: ~ sine_wave.map do |v|~ +** Processing line: ~ if v >= 0~ +** Processing line: ~ 1.0~ +** Processing line: ~ else~ +** Processing line: ~ -1.0~ +** Processing line: ~ end~ +** Processing line: ~ end.to_a~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_queue_square_wave~ +** Processing line: ~ { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_square_wave args, opts = {}~ +** Processing line: ~ opts = defaults_queue_square_wave.merge opts~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = 48000~ +** Processing line: ~~ +** Processing line: ~ square_wave = square_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~ args.state.square_waves[frequency] ||= square_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~~ +** Processing line: ~ proc = lambda do~ +** Processing line: ~ generate_audio_data args.state.square_waves[frequency], sample_rate~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ audio_state = new_audio_state args, opts~ +** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ +** Processing line: ~ queue_audio args, audio_state: audio_state, wave: square_wave~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: saw tooth wave~ +** Processing line: ~ def defaults_saw_tooth_wave_for~ +** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def saw_tooth_wave_for opts = {}~ +** Processing line: ~ opts = defaults_saw_tooth_wave_for.merge opts~ +** Processing line: ~ sine_wave = sine_wave_for opts~ +** Processing line: ~ period_size = sine_wave.length~ +** Processing line: ~ sine_wave.map_with_index do |v, i|~ +** Processing line: ~ (((i % period_size).fdiv period_size) * 2) - 1~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_queue_saw_tooth_wave~ +** Processing line: ~ { frequency: 440, duration: 60, gain: 0.3, fade_out: false, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_saw_tooth_wave args, opts = {}~ +** Processing line: ~ opts = defaults_queue_saw_tooth_wave.merge opts~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = 48000~ +** Processing line: ~~ +** Processing line: ~ saw_tooth_wave = saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~ args.state.saw_tooth_waves[frequency] ||= saw_tooth_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~~ +** Processing line: ~ proc = lambda do~ +** Processing line: ~ generate_audio_data args.state.saw_tooth_waves[frequency], sample_rate~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ audio_state = new_audio_state args, opts~ +** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ +** Processing line: ~ queue_audio args, audio_state: audio_state, wave: saw_tooth_wave~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: triangle wave~ +** Processing line: ~ def defaults_triangle_wave_for~ +** Processing line: ~ { frequency: 440, sample_rate: 48000 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def triangle_wave_for opts = {}~ +** Processing line: ~ opts = defaults_saw_tooth_wave_for.merge opts~ +** Processing line: ~ sine_wave = sine_wave_for opts~ +** Processing line: ~ period_size = sine_wave.length~ +** Processing line: ~ sine_wave.map_with_index do |v, i|~ +** Processing line: ~ ratio = (i.fdiv period_size)~ +** Processing line: ~ if ratio <= 0.5~ +** Processing line: ~ (ratio * 4) - 1~ +** Processing line: ~ else~ +** Processing line: ~ ratio -= 0.5~ +** Processing line: ~ 1 - (ratio * 4)~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_queue_triangle_wave~ +** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_triangle_wave args, opts = {}~ +** Processing line: ~ opts = defaults_queue_triangle_wave.merge opts~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = 48000~ +** Processing line: ~~ +** Processing line: ~ triangle_wave = triangle_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~ args.state.triangle_waves[frequency] ||= triangle_wave_for frequency: frequency, sample_rate: sample_rate~ +** Processing line: ~~ +** Processing line: ~ proc = lambda do~ +** Processing line: ~ generate_audio_data args.state.triangle_waves[frequency], sample_rate~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ audio_state = new_audio_state args, opts~ +** Processing line: ~ audio_state[:input] = [1, sample_rate, proc]~ +** Processing line: ~ queue_audio args, audio_state: audio_state, wave: triangle_wave~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: bell~ +** Processing line: ~ def defaults_queue_bell~ +** Processing line: ~ { frequency: 440, duration: 1.seconds, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_bell args, opts = {}~ +** Processing line: ~ (bell_to_sine_waves (defaults_queue_bell.merge opts)).each { |b| queue_sine_wave args, b }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def bell_harmonics~ +** Processing line: ~ [~ +** Processing line: ~ { frequency_ratio: 0.5, duration_ratio: 1.00 },~ +** Processing line: ~ { frequency_ratio: 1.0, duration_ratio: 0.80 },~ +** Processing line: ~ { frequency_ratio: 2.0, duration_ratio: 0.60 },~ +** Processing line: ~ { frequency_ratio: 3.0, duration_ratio: 0.40 },~ +** Processing line: ~ { frequency_ratio: 4.2, duration_ratio: 0.25 },~ +** Processing line: ~ { frequency_ratio: 5.4, duration_ratio: 0.20 },~ +** Processing line: ~ { frequency_ratio: 6.8, duration_ratio: 0.15 }~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_bell_to_sine_waves~ +** Processing line: ~ { frequency: 440, duration: 1.seconds, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def bell_to_sine_waves opts = {}~ +** Processing line: ~ opts = defaults_bell_to_sine_waves.merge opts~ +** Processing line: ~ bell_harmonics.map do |b|~ +** Processing line: ~ {~ +** Processing line: ~ frequency: opts[:frequency] * b[:frequency_ratio],~ +** Processing line: ~ duration: opts[:duration] * b[:duration_ratio],~ +** Processing line: ~ queue_in: opts[:queue_in],~ +** Processing line: ~ gain: (1.fdiv bell_harmonics.length),~ +** Processing line: ~ fade_out: true~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # audio entity construction~ +** Processing line: ~ def generate_audio_data sine_wave, sample_rate~ +** Processing line: ~ sample_size = (sample_rate.fdiv (1000.fdiv 60)).ceil~ +** Processing line: ~ copy_count = (sample_size.fdiv sine_wave.length).ceil~ +** Processing line: ~ sine_wave * copy_count~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults_new_audio_state~ +** Processing line: ~ { frequency: 440, duration: 60, gain: 1.0, fade_out: false, queue_in: 0 }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_audio_state args, opts = {}~ +** Processing line: ~ opts = defaults_new_audio_state.merge opts~ +** Processing line: ~ decay_rate = 0~ +** Processing line: ~ decay_rate = 1.fdiv(opts[:duration]) * opts[:gain] if opts[:fade_out]~ +** Processing line: ~ frequency = opts[:frequency]~ +** Processing line: ~ sample_rate = 48000~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ id: (new_id! args),~ +** Processing line: ~ frequency: frequency,~ +** Processing line: ~ sample_rate: 48000,~ +** Processing line: ~ stop_at: args.tick_count + opts[:queue_in] + opts[:duration],~ +** Processing line: ~ gain: opts[:gain].to_f,~ +** Processing line: ~ queue_at: args.state.tick_count + opts[:queue_in],~ +** Processing line: ~ decay_rate: decay_rate,~ +** Processing line: ~ pitch: 1.0,~ +** Processing line: ~ looping: true,~ +** Processing line: ~ paused: false~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_audio args, opts = {}~ +** Processing line: ~ graph_wave args, opts[:wave], opts[:audio_state][:frequency]~ +** Processing line: ~ args.state.audio_queue << opts[:audio_state]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_id! args~ +** Processing line: ~ args.state.audio_id ||= 0~ +** Processing line: ~ args.state.audio_id += 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def graph_wave args, wave, frequency~ +** Processing line: ~ if args.state.tick_count != args.state.graphed_at~ +** Processing line: ~ args.outputs.static_lines.clear~ +** Processing line: ~ args.outputs.static_sprites.clear~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ wave = wave~ +** Processing line: ~~ +** Processing line: ~ r, g, b = frequency.to_i % 85,~ +** Processing line: ~ frequency.to_i % 170,~ +** Processing line: ~ frequency.to_i % 255~ +** Processing line: ~~ +** Processing line: ~ starting_rect = args.layout.rect(row: 5, col: 13)~ +** Processing line: ~ x_scale = 10~ +** Processing line: ~ y_scale = 100~ +** Processing line: ~ max_points = 25~ +** Processing line: ~~ +** Processing line: ~ points = wave~ +** Processing line: ~ if wave.length > max_points~ +** Processing line: ~ resolution = wave.length.idiv max_points~ +** Processing line: ~ points = wave.find_all.with_index { |y, i| (i % resolution == 0) }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.static_lines << points.map_with_index do |y, x|~ +** Processing line: ~ next_y = points[x + 1]~ +** Processing line: ~~ +** Processing line: ~ if next_y~ +** Processing line: ~ {~ +** Processing line: ~ x: starting_rect.x + (x * x_scale),~ +** Processing line: ~ y: starting_rect.y + starting_rect.h.half + y_scale * y,~ +** Processing line: ~ x2: starting_rect.x + ((x + 1) * x_scale),~ +** Processing line: ~ y2: starting_rect.y + starting_rect.h.half + y_scale * next_y,~ +** Processing line: ~ r: r,~ +** Processing line: ~ g: g,~ +** Processing line: ~ b: b~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.static_sprites << points.map_with_index do |y, x|~ +** Processing line: ~ {~ +** Processing line: ~ x: (starting_rect.x + (x * x_scale)) - 2,~ +** Processing line: ~ y: (starting_rect.y + starting_rect.h.half + y_scale * y) - 2,~ +** Processing line: ~ w: 4,~ +** Processing line: ~ h: 4,~ +** Processing line: ~ path: 'sprites/square-white.png',~ +** Processing line: ~ r: r,~ +** Processing line: ~ g: g,~ +** Processing line: ~ b: b~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.state.graphed_at = args.state.tick_count~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin # region: musical note mapping~ +** Processing line: ~ def defaults_frequency_for~ +** Processing line: ~ { note: :a, octave: 5, sharp: false, flat: false }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def frequency_for opts = {}~ +** Processing line: ~ opts = defaults_frequency_for.merge opts~ +** Processing line: ~ octave_offset_multiplier = opts[:octave] - 5~ +** Processing line: ~ note = note_frequencies_octave_5[opts[:note]]~ +** Processing line: ~ if octave_offset_multiplier < 0~ +** Processing line: ~ note = note * 1 / (octave_offset_multiplier.abs + 1)~ +** Processing line: ~ elsif octave_offset_multiplier > 0~ +** Processing line: ~ note = note * (octave_offset_multiplier.abs + 1) / 1~ +** Processing line: ~ end~ +** Processing line: ~ note~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def note_frequencies_octave_5~ +** Processing line: ~ {~ +** Processing line: ~ a: 440.0,~ +** Processing line: ~ a_sharp: 466.16, b_flat: 466.16,~ +** Processing line: ~ b: 493.88,~ +** Processing line: ~ c: 523.25,~ +** Processing line: ~ c_sharp: 554.37, d_flat: 587.33,~ +** Processing line: ~ d: 587.33,~ +** Processing line: ~ d_sharp: 622.25, e_flat: 659.25,~ +** Processing line: ~ e: 659.25,~ +** Processing line: ~ f: 698.25,~ +** Processing line: ~ f_sharp: 739.99, g_flat: 739.99,~ +** Processing line: ~ g: 783.99,~ +** Processing line: ~ g_sharp: 830.61, a_flat: 830.61~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Rendering - Simple Render Targets - main.rb~ - H3 detected. - Determining if line is a header. @@ -194306,7 +204309,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ flip_horizontally: false,~ ** Processing line: ~ angle_anchor_x: 0.5, # rotation center set to middle~ ** Processing line: ~ angle_anchor_y: 0.5~ -** Processing line: ~ }.sprite~ +** Processing line: ~ }.sprite!~ ** Processing line: ~~ ** Processing line: ~ # Outputs label as primitive using a hash~ ** Processing line: ~ args.outputs.primitives << {~ @@ -194320,7 +204323,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ b: 50,~ ** Processing line: ~ a: 255, # transparency~ ** Processing line: ~ font: "fonts/manaspc.ttf" # font style~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~~ ** Processing line: ~ # Outputs solid as primitive using a hash~ ** Processing line: ~ args.outputs.primitives << {~ @@ -194332,7 +204335,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 50,~ ** Processing line: ~ b: 50,~ ** Processing line: ~ a: 255 # transparency~ -** Processing line: ~ }.solid~ +** Processing line: ~ }.solid!~ ** Processing line: ~~ ** Processing line: ~ # Outputs border as primitive using a hash~ ** Processing line: ~ # Same parameters as solid~ @@ -194345,7 +204348,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 50,~ ** Processing line: ~ b: 50,~ ** Processing line: ~ a: 255 # transparency~ -** Processing line: ~ }.border~ +** Processing line: ~ }.border!~ ** Processing line: ~~ ** Processing line: ~ # Outputs line as primitive using a hash~ ** Processing line: ~ args.outputs.primitives << {~ @@ -194357,7 +204360,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 50,~ ** Processing line: ~ b: 50,~ ** Processing line: ~ a: 255 # transparency~ -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -194426,6 +204429,120 @@ 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 - Simple Camera - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Simple Camera - 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 - Simple Camera - 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/07_simple_camera/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ # variables you can play around with~ +** Processing line: ~ args.state.world.w ||= 1280~ +** Processing line: ~ args.state.world.h ||= 720~ +** Processing line: ~~ +** Processing line: ~ args.state.player.x ||= 0~ +** Processing line: ~ args.state.player.y ||= 0~ +** Processing line: ~ args.state.player.size ||= 32~ +** Processing line: ~~ +** Processing line: ~ args.state.enemy.x ||= 700~ +** Processing line: ~ args.state.enemy.y ||= 700~ +** Processing line: ~ args.state.enemy.size ||= 16~ +** Processing line: ~~ +** Processing line: ~ args.state.camera.x ||= 640~ +** Processing line: ~ args.state.camera.y ||= 300~ +** Processing line: ~ args.state.camera.scale ||= 1.0~ +** Processing line: ~ args.state.camera.show_empty_space ||= :yes~ +** Processing line: ~~ +** Processing line: ~ # instructions~ +** Processing line: ~ args.outputs.primitives << { x: 0, y: 80.from_top, w: 360, h: 80, r: 0, g: 0, b: 0, a: 128 }.solid!~ +** Processing line: ~ args.outputs.primitives << { x: 10, y: 10.from_top, text: "arrow keys to move around", r: 255, g: 255, b: 255}.label!~ +** Processing line: ~ args.outputs.primitives << { x: 10, y: 30.from_top, text: "+/- to change zoom of camera", r: 255, g: 255, b: 255}.label!~ +** Processing line: ~ args.outputs.primitives << { x: 10, y: 50.from_top, text: "tab to change camera edge behavior", r: 255, g: 255, b: 255}.label!~ +** Processing line: ~~ +** Processing line: ~ # render scene~ +** Processing line: ~ args.outputs[:scene].w = args.state.world.w~ +** Processing line: ~ args.outputs[:scene].h = args.state.world.h~ +** Processing line: ~~ +** Processing line: ~ args.outputs[:scene].solids << { x: 0, y: 0, w: args.state.world.w, h: args.state.world.h, r: 20, g: 60, b: 80 }~ +** Processing line: ~ args.outputs[:scene].solids << { x: args.state.player.x, y: args.state.player.y,~ +** Processing line: ~ w: args.state.player.size, h: args.state.player.size, r: 80, g: 155, b: 80 }~ +** Processing line: ~ args.outputs[:scene].solids << { x: args.state.enemy.x, y: args.state.enemy.y,~ +** Processing line: ~ w: args.state.enemy.size, h: args.state.enemy.size, r: 155, g: 80, b: 80 }~ +** Processing line: ~~ +** Processing line: ~ # render camera~ +** Processing line: ~ scene_position = calc_scene_position args~ +** Processing line: ~ args.outputs.sprites << { x: scene_position.x,~ +** Processing line: ~ y: scene_position.y,~ +** Processing line: ~ w: scene_position.w,~ +** Processing line: ~ h: scene_position.h,~ +** Processing line: ~ path: :scene }~ +** Processing line: ~~ +** Processing line: ~ # move player~ +** Processing line: ~ if args.inputs.directional_angle~ +** Processing line: ~ args.state.player.x += args.inputs.directional_angle.vector_x * 5~ +** Processing line: ~ args.state.player.y += args.inputs.directional_angle.vector_y * 5~ +** Processing line: ~ args.state.player.x = args.state.player.x.clamp(0, args.state.world.w - args.state.player.size)~ +** Processing line: ~ args.state.player.y = args.state.player.y.clamp(0, args.state.world.h - args.state.player.size)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # +/- to zoom in and out~ +** Processing line: ~ if args.inputs.keyboard.plus && args.state.tick_count.zmod?(3)~ +** Processing line: ~ args.state.camera.scale += 0.05~ +** Processing line: ~ elsif args.inputs.keyboard.hyphen && args.state.tick_count.zmod?(3)~ +** Processing line: ~ args.state.camera.scale -= 0.05~ +** Processing line: ~ elsif args.inputs.keyboard.key_down.tab~ +** Processing line: ~ if args.state.camera.show_empty_space == :yes~ +** Processing line: ~ args.state.camera.show_empty_space = :no~ +** Processing line: ~ else~ +** Processing line: ~ args.state.camera.show_empty_space = :yes~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.state.camera.scale = args.state.camera.scale.greater(0.1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_scene_position args~ +** Processing line: ~ result = { x: args.state.camera.x - (args.state.player.x * args.state.camera.scale),~ +** Processing line: ~ y: args.state.camera.y - (args.state.player.y * args.state.camera.scale),~ +** Processing line: ~ w: args.state.world.w * args.state.camera.scale,~ +** Processing line: ~ h: args.state.world.h * args.state.camera.scale,~ +** Processing line: ~ scale: args.state.camera.scale }~ +** Processing line: ~~ +** Processing line: ~ return result if args.state.camera.show_empty_space == :yes~ +** Processing line: ~~ +** Processing line: ~ if result.w < args.grid.w~ +** Processing line: ~ result.merge!(x: (args.grid.w - result.w).half)~ +** Processing line: ~ elsif (args.state.player.x * result.scale) < args.grid.w.half~ +** Processing line: ~ result.merge!(x: 10)~ +** Processing line: ~ elsif (result.x + result.w) < args.grid.w~ +** Processing line: ~ result.merge!(x: - result.w + (args.grid.w - 10))~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if result.h < args.grid.h~ +** Processing line: ~ result.merge!(y: (args.grid.h - result.h).half)~ +** Processing line: ~ elsif (result.y) > 10~ +** Processing line: ~ result.merge!(y: 10)~ +** Processing line: ~ elsif (result.y + result.h) < args.grid.h~ +** Processing line: ~ result.merge!(y: - result.h + (args.grid.h - 10))~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ result~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Rendering - Splitscreen Camera - main.rb~ - H3 detected. - Determining if line is a header. @@ -194441,7 +204558,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/07_advanced_rendering/07_splitscreen_camera/app/main.rb~ +** Processing line: ~ # ./samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb~ ** Processing line: ~ class CameraMovement~ ** Processing line: ~ attr_accessor :state, :inputs, :outputs, :grid~ ** Processing line: ~~ @@ -194857,7 +204974,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/07_advanced_rendering/08_z_targeting_camera/app/main.rb~ +** Processing line: ~ # ./samples/07_advanced_rendering/09_z_targeting_camera/app/main.rb~ ** Processing line: ~ class Game~ ** Processing line: ~ attr_gtk~ ** Processing line: ~~ @@ -194969,6 +205086,76 @@ 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 - Blend Modes - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Blend Modes - 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 - Blend Modes - 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/10_blend_modes/app/main.rb~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~ def draw_blendmode args, mode~ +** Processing line: ~ w = 160~ +** Processing line: ~ h = w~ +** Processing line: ~ args.state.x += (1280-w) / (args.state.blendmodes.length + 1)~ +** Processing line: ~ x = args.state.x~ +** Processing line: ~ y = (720 - h) / 2~ +** Processing line: ~ s = 'sprites/blue-feathered.png'~ +** Processing line: ~ args.outputs.sprites << { blendmode_enum: mode.value, x: x, y: y, w: w, h: h, path: s }~ +** Processing line: ~ args.outputs.labels << [x + (w/2), y, mode.name.to_s, 1, 1, 255, 255, 255]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~~ +** Processing line: ~ # Different blend modes do different things, depending on what they~ +** Processing line: ~ # blend against (in this case, the pixels of the background color).~ +** Processing line: ~ args.state.bg_element ||= 1~ +** Processing line: ~ args.state.bg_color ||= 255~ +** Processing line: ~ args.state.bg_color_direction ||= 1~ +** Processing line: ~ bg_r = (args.state.bg_element == 1) ? args.state.bg_color : 0~ +** Processing line: ~ bg_g = (args.state.bg_element == 2) ? args.state.bg_color : 0~ +** Processing line: ~ bg_b = (args.state.bg_element == 3) ? args.state.bg_color : 0~ +** Processing line: ~ args.state.bg_color += args.state.bg_color_direction~ +** Processing line: ~ if (args.state.bg_color_direction > 0) && (args.state.bg_color >= 255)~ +** Processing line: ~ args.state.bg_color_direction = -1~ +** Processing line: ~ args.state.bg_color = 255~ +** Processing line: ~ elsif (args.state.bg_color_direction < 0) && (args.state.bg_color <= 0)~ +** Processing line: ~ args.state.bg_color_direction = 1~ +** Processing line: ~ args.state.bg_color = 0~ +** Processing line: ~ args.state.bg_element += 1~ +** Processing line: ~ if args.state.bg_element >= 4~ +** Processing line: ~ args.state.bg_element = 1~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.background_color = [ bg_r, bg_g, bg_b, 255 ]~ +** Processing line: ~~ +** Processing line: ~ args.state.blendmodes ||= [~ +** Processing line: ~ { name: :none, value: 0 },~ +** Processing line: ~ { name: :blend, value: 1 },~ +** Processing line: ~ { name: :add, value: 2 },~ +** Processing line: ~ { name: :mod, value: 3 },~ +** Processing line: ~ { name: :mul, value: 4 }~ +** Processing line: ~ ]~ +** Processing line: ~~ +** Processing line: ~ args.state.x = 0 # reset this, draw_blendmode will increment it.~ +** Processing line: ~ args.state.blendmodes.each { |blendmode| draw_blendmode args, blendmode }~ +** Processing line: ~ end~ +** 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. @@ -195534,7 +205721,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ -** Processing line: ~ puts "* INFO - Please specify the number of sprites to render."~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Sprites, Hashes"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -195619,7 +205810,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ -** Processing line: ~ puts "* INFO - Please specify the number of sprites to render."~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Sprites, Open Entities"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -195708,7 +205903,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ -** Processing line: ~ puts "* INFO - Please specify the number of sprites to render."~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Sprites, Strict Entities"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -195780,6 +205979,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def tick args~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Sprites, Classes"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -195852,19 +206056,24 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def tick args~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Static Sprites, Classes"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # init~ ** Processing line: ~ if args.state.tick_count == 0~ ** Processing line: ~ args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~ +** Processing line: ~ args.outputs.static_sprites << args.state.stars~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # update~ ** Processing line: ~ args.state.stars.each(&:move)~ ** Processing line: ~~ ** Processing line: ~ # render~ -** Processing line: ~ args.outputs.sprites << args.state.stars~ ** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ ** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ ** Processing line: ~ end~ @@ -195937,10 +206146,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # path,~ ** Processing line: ~ # angle,~ ** Processing line: ~ # alpha, red_saturation, green_saturation, blue_saturation~ +** Processing line: ~ # tile_x, tile_y, tile_w, tile_h,~ ** Processing line: ~ # flip_horizontally, flip_vertically,~ -** Processing line: ~ # tile_x, tile_y, tile_w, tile_h~ ** Processing line: ~ # angle_anchor_x, angle_anchor_y,~ ** Processing line: ~ # source_x, source_y, source_w, source_h~ +** Processing line: ~~ +** Processing line: ~ # The argument order for ffi_draw.draw_sprite_4 is:~ +** Processing line: ~ # x, y, w, h,~ +** Processing line: ~ # path,~ +** Processing line: ~ # angle,~ +** Processing line: ~ # alpha, red_saturation, green_saturation, blue_saturation~ +** Processing line: ~ # tile_x, tile_y, tile_w, tile_h,~ +** Processing line: ~ # flip_horizontally, flip_vertically,~ +** Processing line: ~ # angle_anchor_x, angle_anchor_y,~ +** Processing line: ~ # source_x, source_y, source_w, source_h,~ +** Processing line: ~ # blendmode_enum~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -195948,6 +206168,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def tick args~ ** Processing line: ~ # sets console command when sample app initially opens~ ** Processing line: ~ if Kernel.global_tick_count == 0~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Static Sprites, Classes, Draw Override"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ ** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -196165,6 +206390,70 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Advanced Debugging - Unit Tests - benchmark_api_tests.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Unit Tests - benchmark_api_tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Unit Tests - benchmark_api_tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/benchmark_api_tests.rb~ +** Processing line: ~ def test_benchmark_api args, assert~ +** Processing line: ~ result = args.gtk.benchmark iterations: 100,~ +** Processing line: ~ only_one: -> () {~ +** Processing line: ~ r = 0~ +** Processing line: ~ (1..100).each do |i|~ +** Processing line: ~ r += 1~ +** Processing line: ~ end~ +** Processing line: ~ }~ +** Processing line: ~~ +** Processing line: ~ assert.equal! result.first_place.name, :only_one~ +** Processing line: ~~ +** Processing line: ~ result = args.gtk.benchmark iterations: 100,~ +** Processing line: ~ iterations_100: -> () {~ +** Processing line: ~ r = 0~ +** Processing line: ~ (1..100).each do |i|~ +** Processing line: ~ r += 1~ +** Processing line: ~ end~ +** Processing line: ~ },~ +** Processing line: ~ iterations_50: -> () {~ +** Processing line: ~ r = 0~ +** Processing line: ~ (1..50).each do |i|~ +** Processing line: ~ r += 1~ +** Processing line: ~ end~ +** Processing line: ~ }~ +** Processing line: ~~ +** Processing line: ~ assert.equal! result.first_place.name, :iterations_50~ +** Processing line: ~~ +** Processing line: ~ result = args.gtk.benchmark iterations: 1,~ +** Processing line: ~ iterations_100: -> () {~ +** Processing line: ~ r = 0~ +** Processing line: ~ (1..100).each do |i|~ +** Processing line: ~ r += 1~ +** Processing line: ~ end~ +** Processing line: ~ },~ +** Processing line: ~ iterations_50: -> () {~ +** Processing line: ~ r = 0~ +** Processing line: ~ (1..50).each do |i|~ +** Processing line: ~ r += 1~ +** Processing line: ~ end~ +** Processing line: ~ }~ +** Processing line: ~~ +** Processing line: ~ assert.equal! result.too_small_to_measure, true~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Debugging - Unit Tests - exception_raising_tests.rb~ - H3 detected. - Determining if line is a header. @@ -196805,6 +207094,157 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Advanced Debugging - Unit Tests - pretty_format_tests.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Unit Tests - pretty_format_tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Unit Tests - pretty_format_tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/10_advanced_debugging/03_unit_tests/pretty_format_tests.rb~ +** Processing line: ~ def H opts~ +** Processing line: ~ opts~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def A *opts~ +** Processing line: ~ opts~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def assert_format args, assert, hash, expected~ +** Processing line: ~ actual = args.fn.pretty_format hash~ +** Processing line: ~ assert.are_equal! actual, expected~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def test_pretty_print args, assert~ +** Processing line: ~ # =============================~ +** Processing line: ~ # hash with single value~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (H first_name: "John")~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ {:first_name "John"}~ +** Processing line: ~ S~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~~ +** Processing line: ~ # =============================~ +** Processing line: ~ # hash with two values~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (H first_name: "John", last_name: "Smith")~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ {:first_name "John"~ +** Processing line: ~ :last_name "Smith"}~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~~ +** Processing line: ~ # =============================~ +** Processing line: ~ # hash with inner hash~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (H first_name: "John",~ +** Processing line: ~ last_name: "Smith",~ +** Processing line: ~ middle_initial: "I",~ +** Processing line: ~ so: (H first_name: "Pocahontas",~ +** Processing line: ~ last_name: "Tsenacommacah"),~ +** Processing line: ~ friends: (A (H first_name: "Side", last_name: "Kick"),~ +** Processing line: ~ (H first_name: "Tim", last_name: "Wizard")))~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ {:first_name "John"~ +** Processing line: ~ :last_name "Smith"~ +** Processing line: ~ :middle_initial "I"~ +** Processing line: ~ :so {:first_name "Pocahontas"~ +** Processing line: ~ :last_name "Tsenacommacah"}~ +** Processing line: ~ :friends [{:first_name "Side"~ +** Processing line: ~ :last_name "Kick"}~ +** Processing line: ~ {:first_name "Tim"~ +** Processing line: ~ :last_name "Wizard"}]}~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~~ +** Processing line: ~ # =============================~ +** Processing line: ~ # array with one value~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (A 1)~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ [1]~ +** Processing line: ~ S~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~~ +** Processing line: ~ # =============================~ +** Processing line: ~ # array with multiple values~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (A 1, 2, 3)~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ [1~ +** Processing line: ~ 2~ +** Processing line: ~ 3]~ +** Processing line: ~ S~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~~ +** Processing line: ~ # =============================~ +** Processing line: ~ # array with multiple values hashes~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (A (H first_name: "Side", last_name: "Kick"),~ +** Processing line: ~ (H first_name: "Tim", last_name: "Wizard"))~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ [{:first_name "Side"~ +** Processing line: ~ :last_name "Kick"}~ +** Processing line: ~ {:first_name "Tim"~ +** Processing line: ~ :last_name "Wizard"}]~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def test_nested_nested args, assert~ +** Processing line: ~ # =============================~ +** Processing line: ~ # nested array in nested hash~ +** Processing line: ~ # =============================~ +** Processing line: ~ input = (H type: :root,~ +** Processing line: ~ text: "Root",~ +** Processing line: ~ children: (A (H level: 1,~ +** Processing line: ~ text: "Level 1",~ +** Processing line: ~ children: (A (H level: 2,~ +** Processing line: ~ text: "Level 2",~ +** Processing line: ~ children: [])))))~ +** Processing line: ~~ +** Processing line: ~ expected = <<-S~ +** Processing line: ~ {:type :root~ +** Processing line: ~ :text "Root"~ +** Processing line: ~ :children [{:level 1~ +** Processing line: ~ :text "Level 1"~ +** Processing line: ~ :children [{:level 2~ +** Processing line: ~ :text "Level 2"~ +** Processing line: ~ :children []}]}]}~ +** Processing line: ~~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ (assert_format args, assert, input, expected)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def test_scene args, assert~ +** Processing line: ~ script = <<-S~ +** Processing line: ~ * Scene 1~ +** Processing line: ~ ** Narrator~ +** Processing line: ~ They say happy endings don't exist.~ +** Processing line: ~ ** Narrator~ +** Processing line: ~ They say true love is a lie.~ +** Processing line: ~ S~ +** Processing line: ~ input = parse_org args, script~ +** Processing line: ~ puts (args.fn.pretty_format input)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Debugging - Unit Tests - require_tests.rb~ - H3 detected. - Determining if line is a header. @@ -206876,6 +217316,489 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Crafting - Farming Game Starting Point - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ args.state.tile_size = 80~ +** Processing line: ~ args.state.player_speed = 4~ +** Processing line: ~ args.state.player ||= tile(args, 7, 3, 0, 128, 180)~ +** Processing line: ~ generate_map args~ +** Processing line: ~ #press j to plant a green onion~ +** Processing line: ~ if args.inputs.keyboard.j~ +** Processing line: ~ #change this part you can change what you want to plant~ +** Processing line: ~ args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)~ +** Processing line: ~ args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)~ +** Processing line: ~ end~ +** Processing line: ~ # Adds walls, background, and player to args.outputs.solids so they appear on screen~ +** Processing line: ~ args.outputs.solids << [0,0,1280,720, 237,189,101]~ +** Processing line: ~ args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~ +** Processing line: ~ args.outputs.solids << args.state.walls~ +** Processing line: ~ args.outputs.solids << args.state.player~ +** Processing line: ~ args.outputs.solids << args.state.plants~ +** Processing line: ~ args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]~ +** Processing line: ~~ +** Processing line: ~ move_player args, -1, 0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed~ +** Processing line: ~ move_player args, 1, 0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed~ +** Processing line: ~ move_player args, 0, 1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed~ +** Processing line: ~ move_player args, 0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Sets position, size, and color of the tile~ +** Processing line: ~ def tile args, x, y, *color~ +** Processing line: ~ [x * args.state.tile_size, # sets definition for array using method parameters~ +** Processing line: ~ y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~ +** Processing line: ~ args.state.tile_size,~ +** Processing line: ~ args.state.tile_size,~ +** Processing line: ~ *color]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~ +** Processing line: ~ def generate_map args~ +** Processing line: ~ return if args.state.area~ +** Processing line: ~~ +** Processing line: ~ # Creates the area of the map. There are 9 rows running horizontally across the screen~ +** Processing line: ~ # and 16 columns running vertically on the screen. Any spot with a "1" is not~ +** Processing line: ~ # open for the player to move into (and is green), and any spot with a "0" is available~ +** Processing line: ~ # for the player to move in.~ +** Processing line: ~ args.state.area = [~ +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~ +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~ +** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~ +** Processing line: ~ ].reverse # reverses the order of the area collection~ +** Processing line: ~~ +** Processing line: ~ # By reversing the order, the way that the area appears above is how it appears~ +** Processing line: ~ # on the screen in the game. If we did not reverse, the map would appear inverted.~ +** Processing line: ~~ +** Processing line: ~ #The wall starts off with no tiles.~ +** Processing line: ~ args.state.walls = []~ +** Processing line: ~ args.state.plants = []~ +** Processing line: ~~ +** Processing line: ~ # If v is 1, a green tile is added to args.state.walls.~ +** Processing line: ~ # If v is 2, a black tile is created as the goal.~ +** Processing line: ~ args.state.area.map_2d do |y, x, v|~ +** Processing line: ~ if v == 1~ +** Processing line: ~ args.state.walls << tile(args, x, y, 255, 160, 156) # green tile~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Allows the player to move their box around the screen~ +** Processing line: ~ def move_player args, *vector~ +** Processing line: ~ box = args.state.player.shift_rect(vector) # box is able to move at an angle~ +** Processing line: ~~ +** Processing line: ~ # If the player's box hits a wall, it is not able to move further in that direction~ +** Processing line: ~ return if args.state.walls~ +** Processing line: ~ .any_intersect_rect?(box)~ +** Processing line: ~~ +** Processing line: ~ # Player's box is able to move at angles (not just the four general directions) fast~ +** Processing line: ~ args.state.player =~ +** Processing line: ~ args.state.player~ +** Processing line: ~ .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~ +** Processing line: ~ vector.y * args.state.player_speed) # the box will move extremely slow~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Crafting - Farming Game Starting Point - repl.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - repl.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - repl.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~ # Welcome to repl.rb~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~ # You can experiement with code within this file. Code in this~ +** Processing line: ~ # file is only executed when you save (and only excecuted ONCE).~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~ # REMOVE the "x" from the word "xrepl" and save the file to RUN~ +** Processing line: ~ # the code in between the do/end block delimiters.~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~ # ADD the "x" to the word "repl" (make it xrepl) and save the~ +** Processing line: ~ # file to IGNORE the code in between the do/end block delimiters.~ +** Processing line: ~ # ===============================================================~ +** Processing line: ~~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "The result of 1 + 2 is: #{1 + 2}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Ruby Crash Course:~ +** Processing line: ~ # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Strings~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ message = "Hello World"~ +** Processing line: ~ puts "The value of message is: " + message~ +** Processing line: ~ puts "Any value can be interpolated within a string using \#{}."~ +** Processing line: ~ puts "Interpolated message: #{message}."~ +** Processing line: ~ puts 'This #{message} is not interpolated because the string uses single quotes.'~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Numerics~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ a = 10~ +** Processing line: ~ puts "The value of a is: #{a}"~ +** Processing line: ~ puts "a + 1 is: #{a + 1}"~ +** Processing line: ~ puts "a / 3 is: #{a / 3}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ b = 10.12~ +** Processing line: ~ puts "The value of b is: #{b}"~ +** Processing line: ~ puts "b + 1 is: #{b + 1}"~ +** Processing line: ~ puts "b as an integer is: #{b.to_i}"~ +** Processing line: ~ puts ''~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Booleans~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ c = 30~ +** Processing line: ~ puts "The value of c is #{c}."~ +** Processing line: ~~ +** Processing line: ~ if c~ +** Processing line: ~ puts "This if statement ran because c is truthy."~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ d = false~ +** Processing line: ~ puts "The value of d is #{d}."~ +** Processing line: ~~ +** Processing line: ~ if !d~ +** Processing line: ~ puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ e = nil~ +** Processing line: ~ puts "Nil is also considered falsey. The value of e is: #{e}."~ +** Processing line: ~~ +** Processing line: ~ if !e~ +** Processing line: ~ puts "This if statement ran because e is nil (a falsey value)."~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Conditionals~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ i_am_true = true~ +** Processing line: ~ i_am_nil = nil~ +** Processing line: ~ i_am_false = false~ +** Processing line: ~ i_am_hi = "hi"~ +** Processing line: ~~ +** Processing line: ~ puts "======== if statement"~ +** Processing line: ~ i_am_one = 1~ +** Processing line: ~ if i_am_one~ +** Processing line: ~ puts "This was printed because i_am_one is truthy."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "======== if/else statement"~ +** Processing line: ~ if i_am_false~ +** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ +** Processing line: ~ else~ +** Processing line: ~ puts "This was printed because i_am_false is false."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "======== if/elsif/else statement"~ +** Processing line: ~ if i_am_false~ +** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ +** Processing line: ~ elsif i_am_true~ +** Processing line: ~ puts "This was printed because i_am_true is true."~ +** Processing line: ~ else~ +** Processing line: ~ puts "This will NOT get printed i_am_true was true."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "======== case statement "~ +** Processing line: ~ i_am_one = 1~ +** Processing line: ~ case i_am_one~ +** Processing line: ~ when 10~ +** Processing line: ~ puts "case equaled: 10"~ +** Processing line: ~ when 9~ +** Processing line: ~ puts "case equaled: 9"~ +** Processing line: ~ when 5~ +** Processing line: ~ puts "case equaled: 5"~ +** Processing line: ~ when 1~ +** Processing line: ~ puts "case equaled: 1"~ +** Processing line: ~ else~ +** Processing line: ~ puts "Value wasn't cased."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "======== different types of comparisons"~ +** Processing line: ~ if 4 == 4~ +** Processing line: ~ puts "equal (4 == 4)"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if 4 != 3~ +** Processing line: ~ puts "not equal (4 != 3)"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if 3 < 4~ +** Processing line: ~ puts "less than (3 < 4)"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if 4 > 3~ +** Processing line: ~ puts "greater than (4 > 3)"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if ((4 > 3) || (3 < 4) || false)~ +** Processing line: ~ puts "or statement ((4 > 3) || (3 < 4) || false)"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if ((4 > 3) && (3 < 4))~ +** Processing line: ~ puts "and statement ((4 > 3) && (3 < 4))"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Looping~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "======== times block"~ +** Processing line: ~ 3.times do |i|~ +** Processing line: ~ puts i~ +** Processing line: ~ end~ +** Processing line: ~ puts "======== range block exclusive"~ +** Processing line: ~ (0...3).each do |i|~ +** Processing line: ~ puts i~ +** Processing line: ~ end~ +** Processing line: ~ puts "======== range block inclusive"~ +** Processing line: ~ (0..3).each do |i|~ +** Processing line: ~ puts i~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Enumerables~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "======== array each"~ +** Processing line: ~ colors = ["red", "blue", "yellow"]~ +** Processing line: ~ colors.each do |color|~ +** Processing line: ~ puts color~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts '======== array each_with_index'~ +** Processing line: ~ colors = ["red", "blue", "yellow"]~ +** Processing line: ~ colors.each_with_index do |color, i|~ +** Processing line: ~ puts "#{color} at index #{i}"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "======== single parameter function"~ +** Processing line: ~ def add_one_to n~ +** Processing line: ~ n + 5~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts add_one_to(3)~ +** Processing line: ~~ +** Processing line: ~ puts "======== function with default value"~ +** Processing line: ~ def function_with_default_value v = 10~ +** Processing line: ~ v * 10~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "passing three: #{function_with_default_value(3)}"~ +** Processing line: ~ puts "passing nil: #{function_with_default_value}"~ +** Processing line: ~~ +** Processing line: ~ puts "======== Or Equal (||=) operator for nil values"~ +** Processing line: ~ def function_with_nil_default_with_local a = nil~ +** Processing line: ~ result = a~ +** Processing line: ~ result ||= "or equal operator was exected and set a default value"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"~ +** Processing line: ~ puts "passing nil: #{function_with_nil_default_with_local}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Arrays~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "======== Create an array with the numbers 1 to 10."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ puts one_to_ten~ +** Processing line: ~~ +** Processing line: ~ puts "======== Create a new array that only contains even numbers from the previous array."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ evens = one_to_ten.find_all do |number|~ +** Processing line: ~ number % 2 == 0~ +** Processing line: ~ end~ +** Processing line: ~ puts evens~ +** Processing line: ~~ +** Processing line: ~ puts "======== Create a new array that rejects odd numbers."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ also_even = one_to_ten.reject do |number|~ +** Processing line: ~ number % 2 != 0~ +** Processing line: ~ end~ +** Processing line: ~ puts also_even~ +** Processing line: ~~ +** Processing line: ~ puts "======== Create an array that doubles every number."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ doubled = one_to_ten.map do |number|~ +** Processing line: ~ number * 2~ +** Processing line: ~ end~ +** Processing line: ~ puts doubled~ +** Processing line: ~~ +** Processing line: ~ puts "======== Create an array that selects only odd numbers and then multiply those by 10."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ odd_doubled = one_to_ten.find_all do |number|~ +** Processing line: ~ number % 2 != 0~ +** Processing line: ~ end.map do |odd_number|~ +** Processing line: ~ odd_number * 10~ +** Processing line: ~ end~ +** Processing line: ~ puts odd_doubled~ +** Processing line: ~~ +** Processing line: ~ puts "======== All combination of numbers 1 to 10."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ all_combinations = one_to_ten.product(one_to_ten)~ +** Processing line: ~ puts all_combinations~ +** Processing line: ~~ +** Processing line: ~ puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."~ +** Processing line: ~ one_to_ten = (1..10).to_a~ +** Processing line: ~ uniq_combinations =~ +** Processing line: ~ one_to_ten.product(one_to_ten)~ +** Processing line: ~ .map do |unsorted_number|~ +** Processing line: ~ unsorted_number.sort~ +** Processing line: ~ end.uniq~ +** Processing line: ~ puts uniq_combinations~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Advanced Arrays~ +** Processing line: ~ # ====================================================================================~ +** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ +** Processing line: ~ xrepl do~ +** Processing line: ~ puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."~ +** Processing line: ~~ +** Processing line: ~ one_to_hundred = (1..40).to_a~ +** Processing line: ~ triples =~ +** Processing line: ~ one_to_hundred.product(one_to_hundred).map do |width, height|~ +** Processing line: ~ [width, height, Math.sqrt(width ** 2 + height ** 2)]~ +** Processing line: ~ end.find_all do |_, _, hypotenuse|~ +** Processing line: ~ hypotenuse.to_i == hypotenuse~ +** Processing line: ~ end.map do |triangle|~ +** Processing line: ~ triangle.map(&:to_i)~ +** Processing line: ~ end.uniq do |triangle|~ +** Processing line: ~ triangle.sort~ +** Processing line: ~ end.map do |width, height, hypotenuse|~ +** Processing line: ~ [width, height, hypotenuse, (width * height) / 2]~ +** Processing line: ~ end.sort_by do |_, _, _, area|~ +** Processing line: ~ area~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ triples.each do |width, height, hypotenuse, area|~ +** Processing line: ~ puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Crafting - Farming Game Starting Point - tests.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Crafting - Farming Game Starting Point - tests.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb~ +** Processing line: ~ # For advanced users:~ +** Processing line: ~ # You can put some quick verification tests here, any method~ +** Processing line: ~ # that starts with the `test_` will be run when you save this file.~ +** Processing line: ~~ +** Processing line: ~ # Here is an example test and game~ +** Processing line: ~~ +** Processing line: ~ # To run the test: ./dragonruby mygame --eval app/tests.rb --no-tick~ +** Processing line: ~~ +** Processing line: ~ class MySuperHappyFunGame~ +** Processing line: ~ attr_gtk~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ outputs.solids << [100, 100, 300, 300]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def test_universe args, assert~ +** Processing line: ~ game = MySuperHappyFunGame.new~ +** Processing line: ~ game.args = args~ +** Processing line: ~ game.tick~ +** Processing line: ~ assert.true! args.outputs.solids.length == 1, "failure: a solid was not added after tick"~ +** Processing line: ~ assert.false! 1 == 2, "failure: some how, 1 equals 2, the world is ending"~ +** Processing line: ~ puts "test_universe completed successfully"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ puts "running tests"~ +** Processing line: ~ $gtk.reset 100~ +** Processing line: ~ $gtk.log_level = :off~ +** Processing line: ~ $gtk.tests.start~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Dev Tools - Add Buttons To Console - main.rb~ - H3 detected. - Determining if line is a header. @@ -207074,12 +217997,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ label = { x: b.x + state.buttons_frame_selection.size.half,~ ** Processing line: ~ y: b.y,~ ** Processing line: ~ text: "#{i + 1}", r: 180, g: 180, b: 180,~ -** Processing line: ~ size_enum: -4, alignment_enum: 1 }.label~ +** Processing line: ~ size_enum: -4, alignment_enum: 1 }.label!~ ** Processing line: ~~ -** Processing line: ~ selection_border = b.merge(r: 40, g: 40, b: 40).border~ +** Processing line: ~ selection_border = b.merge(r: 40, g: 40, b: 40).border!~ ** Processing line: ~~ ** Processing line: ~ if i == state.animation_frames_selected_index~ -** Processing line: ~ selection_border = b.merge(r: 40, g: 230, b: 200).border~ +** Processing line: ~ selection_border = b.merge(r: 40, g: 230, b: 200).border!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ [selection_border, label]~ @@ -207833,6 +218756,558 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Dungeon Crawl - Classics Jam - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Dungeon Crawl - Classics Jam - 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: ~Dungeon Crawl - Classics Jam - 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_dungeon_crawl/classics_jam/app/main.rb~ +** Processing line: ~ class Game~ +** Processing line: ~ attr_gtk~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ defaults~ +** Processing line: ~ render~ +** Processing line: ~ input~ +** Processing line: ~ calc~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults~ +** Processing line: ~ player.x ||= 640~ +** Processing line: ~ player.y ||= 360~ +** Processing line: ~ player.w ||= 16~ +** Processing line: ~ player.h ||= 16~ +** Processing line: ~ player.attacked_at ||= -1~ +** Processing line: ~ player.angle ||= 0~ +** Processing line: ~ player.future_player ||= future_player_position 0, 0~ +** Processing line: ~ player.projectiles ||= []~ +** Processing line: ~ player.damage ||= 0~ +** Processing line: ~ state.level ||= create_level level_one_template~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render~ +** Processing line: ~ outputs.sprites << level.walls.map do |w|~ +** Processing line: ~ w.merge(path: 'sprites/square/gray.png')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.sprites << level.spawn_locations.map do |s|~ +** Processing line: ~ s.merge(path: 'sprites/square/blue.png')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.sprites << player.projectiles.map do |p|~ +** Processing line: ~ p.merge(path: 'sprites/square/blue.png')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.sprites << level.enemies.map do |e|~ +** Processing line: ~ e.merge(path: 'sprites/square/red.png')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.sprites << player.merge(path: 'sprites/circle/green.png', angle: player.angle)~ +** Processing line: ~~ +** Processing line: ~ outputs.labels << { x: 30, y: 30.from_top, text: "damage: #{player.damage || 0}" }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input~ +** Processing line: ~ player.angle = inputs.directional_angle || player.angle~ +** Processing line: ~ if inputs.controller_one.key_down.a || inputs.keyboard.key_down.space~ +** Processing line: ~ player.attacked_at = state.tick_count~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc~ +** Processing line: ~ calc_player~ +** Processing line: ~ calc_projectiles~ +** Processing line: ~ calc_enemies~ +** Processing line: ~ calc_spawn_locations~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_player~ +** Processing line: ~ if player.attacked_at == state.tick_count~ +** Processing line: ~ player.projectiles << { at: state.tick_count,~ +** Processing line: ~ x: player.x,~ +** Processing line: ~ y: player.y,~ +** Processing line: ~ angle: player.angle,~ +** Processing line: ~ w: 4,~ +** Processing line: ~ h: 4 }.center_inside_rect(player)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if player.attacked_at.elapsed_time > 5~ +** Processing line: ~ future_player = future_player_position inputs.left_right * 2, inputs.up_down * 2~ +** Processing line: ~ future_player_collision = future_collision player, future_player, level.walls~ +** Processing line: ~ player.x = future_player_collision.x if !future_player_collision.dx_collision~ +** Processing line: ~ player.y = future_player_collision.y if !future_player_collision.dy_collision~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_projectile_collisions entities~ +** Processing line: ~ entities.each do |e|~ +** Processing line: ~ e.damage ||= 0~ +** Processing line: ~ player.projectiles.each do |p|~ +** Processing line: ~ if !p.collided && (p.intersect_rect? e)~ +** Processing line: ~ p.collided = true~ +** Processing line: ~ e.damage += 1~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_projectiles~ +** Processing line: ~ player.projectiles.map! do |p|~ +** Processing line: ~ dx, dy = p.angle.vector 10~ +** Processing line: ~ p.merge(x: p.x + dx, y: p.y + dy)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ calc_projectile_collisions level.walls + level.enemies + level.spawn_locations~ +** Processing line: ~ player.projectiles.reject! { |p| p.at.elapsed_time > 10000 }~ +** Processing line: ~ player.projectiles.reject! { |p| p.collided }~ +** Processing line: ~ level.enemies.reject! { |e| e.damage > e.hp }~ +** Processing line: ~ level.spawn_locations.reject! { |s| s.damage > s.hp }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_enemies~ +** Processing line: ~ level.enemies.map! do |e|~ +** Processing line: ~ dx = 0~ +** Processing line: ~ dx = 1 if e.x < player.x~ +** Processing line: ~ dx = -1 if e.x > player.x~ +** Processing line: ~ dy = 0~ +** Processing line: ~ dy = 1 if e.y < player.y~ +** Processing line: ~ dy = -1 if e.y > player.y~ +** Processing line: ~ future_e = future_entity_position dx, dy, e~ +** Processing line: ~ future_e_collision = future_collision e, future_e, level.enemies + level.walls~ +** Processing line: ~ e.next_x = e.x~ +** Processing line: ~ e.next_y = e.y~ +** Processing line: ~ e.next_x = future_e_collision.x if !future_e_collision.dx_collision~ +** Processing line: ~ e.next_y = future_e_collision.y if !future_e_collision.dy_collision~ +** Processing line: ~ e~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ level.enemies.map! do |e|~ +** Processing line: ~ e.x = e.next_x~ +** Processing line: ~ e.y = e.next_y~ +** Processing line: ~ e~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ level.enemies.each do |e|~ +** Processing line: ~ player.damage += 1 if e.intersect_rect? player~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_spawn_locations~ +** Processing line: ~ level.spawn_locations.map! do |s|~ +** Processing line: ~ s.merge(countdown: s.countdown - 1)~ +** Processing line: ~ end~ +** Processing line: ~ level.spawn_locations~ +** Processing line: ~ .find_all { |s| s.countdown.neg? }~ +** Processing line: ~ .each do |s|~ +** Processing line: ~ s.countdown = s.rate~ +** Processing line: ~ s.merge(countdown: s.rate)~ +** Processing line: ~ new_enemy = create_enemy s~ +** Processing line: ~ if !(level.enemies.find { |e| e.intersect_rect? new_enemy })~ +** Processing line: ~ level.enemies << new_enemy~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def create_enemy spawn_location~ +** Processing line: ~ to_cell(spawn_location.ordinal_x, spawn_location.ordinal_y).merge hp: 2~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def create_level level_template~ +** Processing line: ~ {~ +** Processing line: ~ walls: level_template.walls.map { |w| to_cell(w.ordinal_x, w.ordinal_y).merge(w) },~ +** Processing line: ~ enemies: [],~ +** Processing line: ~ spawn_locations: level_template.spawn_locations.map { |s| to_cell(s.ordinal_x, s.ordinal_y).merge(s) }~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def level_one_template~ +** Processing line: ~ {~ +** Processing line: ~ walls: [{ ordinal_x: 25, ordinal_y: 20},~ +** Processing line: ~ { ordinal_x: 25, ordinal_y: 21},~ +** Processing line: ~ { ordinal_x: 25, ordinal_y: 22},~ +** Processing line: ~ { ordinal_x: 25, ordinal_y: 23}],~ +** Processing line: ~ spawn_locations: [{ ordinal_x: 10, ordinal_y: 10, rate: 120, countdown: 0, hp: 5 }]~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player~ +** Processing line: ~ state.player ||= {}~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def level~ +** Processing line: ~ state.level ||= {}~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def future_collision entity, future_entity, others~ +** Processing line: ~ dx_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dx) }~ +** Processing line: ~ dy_collision = others.find { |o| o != entity && (o.intersect_rect? future_entity.dy) }~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ dx_collision: dx_collision,~ +** Processing line: ~ x: future_entity.dx.x,~ +** Processing line: ~ dy_collision: dy_collision,~ +** Processing line: ~ y: future_entity.dy.y~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def future_entity_position dx, dy, entity~ +** Processing line: ~ {~ +** Processing line: ~ dx: entity.merge(x: entity.x + dx),~ +** Processing line: ~ dy: entity.merge(y: entity.y + dy),~ +** Processing line: ~ both: entity.merge(x: entity.x + dx, y: entity.y + dy)~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def future_player_position dx, dy~ +** Processing line: ~ future_entity_position dx, dy, player~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_cell ordinal_x, ordinal_y~ +** Processing line: ~ { x: ordinal_x * 16, y: ordinal_y * 16, w: 16, h: 16 }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ $game ||= Game.new~ +** Processing line: ~ $game.args = args~ +** Processing line: ~ $game.tick~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~ $game = nil~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Fighting - Special Move Inputs - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Fighting - Special Move Inputs - 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: ~Fighting - Special Move Inputs - 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_fighting/01_special_move_inputs/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ #tick_instructions args, "Use LEFT and RIGHT arrow keys to move and SPACE to jump."~ +** Processing line: ~ defaults args~ +** Processing line: ~ render args~ +** Processing line: ~ input args~ +** Processing line: ~ calc args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # sets default values and creates empty collections~ +** Processing line: ~ # initialization only happens in the first frame~ +** Processing line: ~ def defaults args~ +** Processing line: ~ fiddle args~ +** Processing line: ~~ +** Processing line: ~ args.state.tick_count = args.state.tick_count~ +** Processing line: ~ args.state.bridge_top = 128~ +** Processing line: ~ args.state.player.x ||= 0 # initializes player's properties~ +** Processing line: ~ args.state.player.y ||= args.state.bridge_top~ +** Processing line: ~ args.state.player.w ||= 64~ +** Processing line: ~ args.state.player.h ||= 64~ +** Processing line: ~ args.state.player.dy ||= 0~ +** Processing line: ~ args.state.player.dx ||= 0~ +** Processing line: ~ args.state.player.r ||= 0~ +** Processing line: ~ args.state.game_over_at ||= 0~ +** Processing line: ~ args.state.animation_time ||=0~ +** Processing line: ~~ +** Processing line: ~ args.state.timeleft ||=0~ +** Processing line: ~ args.state.timeright ||=0~ +** Processing line: ~ args.state.lastpush ||=0~ +** Processing line: ~~ +** Processing line: ~ args.state.inputlist ||= ["j","k","l"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # sets enemy, player, hammer values~ +** Processing line: ~ def fiddle args~ +** Processing line: ~ args.state.gravity = -0.5~ +** Processing line: ~ args.state.player_jump_power = 10 # sets player values~ +** Processing line: ~ args.state.player_jump_power_duration = 5~ +** Processing line: ~ args.state.player_max_run_speed = 20~ +** Processing line: ~ args.state.player_speed_slowdown_rate = 0.9~ +** Processing line: ~ args.state.player_acceleration = 0.9~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # outputs objects onto the screen~ +** Processing line: ~ def render args~ +** Processing line: ~ if (args.state.player.dx < 0.01) && (args.state.player.dx > -0.01)~ +** Processing line: ~ args.state.player.dx = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ #move list~ +** Processing line: ~ (args.layout.rect_group row: 0, col_from_right: 8, drow: 0.3,~ +** Processing line: ~ merge: { vertical_alignment_enum: 0, size_enum: -2 },~ +** Processing line: ~ group: [~ +** Processing line: ~ { text: "move: WASD" },~ +** Processing line: ~ { text: "jump: Space" },~ +** Processing line: ~ { text: "attack forwards: J (while on ground" },~ +** Processing line: ~ { text: "attack upwards: K (while on groud)" },~ +** Processing line: ~ { text: "attack backwards: J (while on ground and holding A)" },~ +** Processing line: ~ { text: "attack downwards: K (while in air)" },~ +** Processing line: ~ { text: "dash attack: J, K in quick succession." },~ +** Processing line: ~ { text: "shield: hold J, K at the same time." },~ +** Processing line: ~ { text: "dash backwards: A, A in quick succession." },~ +** Processing line: ~ ]).into args.outputs.labels~ +** Processing line: ~~ +** Processing line: ~ # registered moves~ +** Processing line: ~ args.outputs.labels << { x: 0.to_layout_col,~ +** Processing line: ~ y: 0.to_layout_row,~ +** Processing line: ~ text: "input history",~ +** Processing line: ~ size_enum: -2,~ +** Processing line: ~ vertical_alignment_enum: 0 }~ +** Processing line: ~~ +** Processing line: ~ (args.state.inputlist.take(5)).map do |s|~ +** Processing line: ~ { text: s, size_enum: -2, vertical_alignment_enum: 0 }~ +** Processing line: ~ end.yield_self do |group|~ +** Processing line: ~ (args.layout.rect_group row: 0.3, col: 0, drow: 0.3, group: group).into args.outputs.labels~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~ #sprites~ +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/square/white.png",~ +** Processing line: ~ args.state.player.r]~ +** Processing line: ~~ +** Processing line: ~ playershield = [args.state.player.x - 20, args.state.player.y - 10,~ +** Processing line: ~ args.state.player.w + 20, args.state.player.h + 20,~ +** Processing line: ~ "sprites/square/blue.png",~ +** Processing line: ~ args.state.player.r,~ +** Processing line: ~ 0]~ +** Processing line: ~~ +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png",~ +** Processing line: ~ args.state.player.r,~ +** Processing line: ~ 0]~ +** Processing line: ~~ +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png",~ +** Processing line: ~ args.state.player.r+90,~ +** Processing line: ~ 0]~ +** Processing line: ~~ +** Processing line: ~ if ((args.state.tick_count - args.state.lastpush) <= 15)~ +** Processing line: ~ if (args.state.inputlist[0] == "<<")~ +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/square/yellow.png", args.state.player.r]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "shield")~ +** Processing line: ~ player = [args.state.player.x, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/square/indigo.png", args.state.player.r]~ +** Processing line: ~~ +** Processing line: ~ playershield = [args.state.player.x - 10, args.state.player.y - 10,~ +** Processing line: ~ args.state.player.w + 20, args.state.player.h + 20,~ +** Processing line: ~ "sprites/square/blue.png", args.state.player.r, 50]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "back-attack")~ +** Processing line: ~ playerjab = [args.state.player.x - 20, args.state.player.y,~ +** Processing line: ~ args.state.player.w - 10, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r, 255]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "forward-attack")~ +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r, 255]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "up-attack")~ +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r + 90, 255]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "dair")~ +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y - 32,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/indigo.png", args.state.player.r + 90, 255]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (args.state.inputlist[0] == "dash-attack")~ +** Processing line: ~ playerupper = [args.state.player.x, args.state.player.y + 32,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/violet.png", args.state.player.r + 90, 255]~ +** Processing line: ~~ +** Processing line: ~ playerjab = [args.state.player.x + 32, args.state.player.y,~ +** Processing line: ~ args.state.player.w, args.state.player.h,~ +** Processing line: ~ "sprites/isometric/violet.png", args.state.player.r, 255]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.sprites << playerjab~ +** Processing line: ~ args.outputs.sprites << playerupper~ +** Processing line: ~ args.outputs.sprites << player~ +** Processing line: ~ args.outputs.sprites << playershield~ +** Processing line: ~~ +** Processing line: ~ args.outputs.solids << 20.map_with_index do |i| # uses 20 squares to form bridge~ +** Processing line: ~ [i * 64, args.state.bridge_top - 64, 64, 64]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Performs calculations to move objects on the screen~ +** Processing line: ~ def calc args~ +** Processing line: ~ # Since velocity is the change in position, the change in x increases by dx. Same with y and dy.~ +** Processing line: ~ args.state.player.x += args.state.player.dx~ +** Processing line: ~ args.state.player.y += args.state.player.dy~ +** Processing line: ~~ +** Processing line: ~ # Since acceleration is the change in velocity, the change in y (dy) increases every frame~ +** Processing line: ~ args.state.player.dy += args.state.gravity~ +** Processing line: ~~ +** Processing line: ~ # player's y position is either current y position or y position of top of~ +** Processing line: ~ # bridge, whichever has a greater value~ +** Processing line: ~ # ensures that the player never goes below the bridge~ +** Processing line: ~ args.state.player.y = args.state.player.y.greater(args.state.bridge_top)~ +** Processing line: ~~ +** Processing line: ~ # player's x position is either the current x position or 0, whichever has a greater value~ +** Processing line: ~ # ensures that the player doesn't go too far left (out of the screen's scope)~ +** Processing line: ~ args.state.player.x = args.state.player.x.greater(0)~ +** Processing line: ~~ +** Processing line: ~ # player is not falling if it is located on the top of the bridge~ +** Processing line: ~ args.state.player.falling = false if args.state.player.y == args.state.bridge_top~ +** Processing line: ~ #args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] # sets definition for player~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Resets the player by changing its properties back to the values they had at initialization~ +** Processing line: ~ def reset_player args~ +** Processing line: ~ args.state.player.x = 0~ +** Processing line: ~ args.state.player.y = args.state.bridge_top~ +** Processing line: ~ args.state.player.dy = 0~ +** Processing line: ~ args.state.player.dx = 0~ +** Processing line: ~ args.state.enemy.hammers.clear # empties hammer collection~ +** Processing line: ~ args.state.enemy.hammer_queue.clear # empties hammer_queue~ +** Processing line: ~ args.state.game_over_at = args.state.tick_count # game_over_at set to current frame (or passage of time)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # Processes input from the user to move the player~ +** Processing line: ~ def input args~ +** Processing line: ~ if args.state.inputlist.length > 5~ +** Processing line: ~ args.state.inputlist.pop~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ should_process_special_move = (args.inputs.keyboard.key_down.j) ||~ +** Processing line: ~ (args.inputs.keyboard.key_down.k) ||~ +** Processing line: ~ (args.inputs.keyboard.key_down.a) ||~ +** Processing line: ~ (args.inputs.keyboard.key_down.d) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.y) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.x) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.left) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.right)~ +** Processing line: ~~ +** Processing line: ~ if (should_process_special_move)~ +** Processing line: ~ if (args.inputs.keyboard.key_down.j && args.inputs.keyboard.key_down.k) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.y)~ +** Processing line: ~ args.state.inputlist.unshift("shield")~ +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&~ +** Processing line: ~ (args.state.inputlist[0] == "forward-attack") && ((args.state.tick_count - args.state.lastpush) <= 15)~ +** Processing line: ~ args.state.inputlist.unshift("dash-attack")~ +** Processing line: ~ args.state.player.dx = 20~ +** Processing line: ~ elsif (args.inputs.keyboard.key_down.j && args.inputs.keyboard.a) ||~ +** Processing line: ~ (args.inputs.controller_one.key_down.x && args.inputs.controller_one.key_down.left)~ +** Processing line: ~ args.state.inputlist.unshift("back-attack")~ +** Processing line: ~ elsif ( args.inputs.controller_one.key_down.x || args.inputs.keyboard.key_down.j)~ +** Processing line: ~ args.state.inputlist.unshift("forward-attack")~ +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y) &&~ +** Processing line: ~ (args.state.player.y > 128)~ +** Processing line: ~ args.state.inputlist.unshift("dair")~ +** Processing line: ~ elsif (args.inputs.keyboard.key_down.k || args.inputs.controller_one.key_down.y)~ +** Processing line: ~ args.state.inputlist.unshift("up-attack")~ +** Processing line: ~ elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a) &&~ +** Processing line: ~ (args.state.inputlist[0] == "<") &&~ +** Processing line: ~ ((args.state.tick_count - args.state.lastpush) <= 10)~ +** Processing line: ~ args.state.inputlist.unshift("<<")~ +** Processing line: ~ args.state.player.dx = -15~ +** Processing line: ~ elsif (args.inputs.controller_one.key_down.left || args.inputs.keyboard.key_down.a)~ +** Processing line: ~ args.state.inputlist.unshift("<")~ +** Processing line: ~ args.state.timeleft = args.state.tick_count~ +** Processing line: ~ elsif (args.inputs.controller_one.key_down.right || args.inputs.keyboard.key_down.d)~ +** Processing line: ~ args.state.inputlist.unshift(">")~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.state.lastpush = args.state.tick_count~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.keyboard.space || args.inputs.controller_one.r2 # if the user presses the space bar~ +** Processing line: ~ args.state.player.jumped_at ||= args.state.tick_count # jumped_at is set to current frame~ +** Processing line: ~~ +** Processing line: ~ # if the time that has passed since the jump is less than the player's jump duration and~ +** Processing line: ~ # the player is not falling~ +** Processing line: ~ if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling~ +** Processing line: ~ args.state.player.dy = args.state.player_jump_power # change in y is set to power of player's jump~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # if the space bar is in the "up" state (or not being pressed down)~ +** Processing line: ~ if args.inputs.keyboard.key_up.space || args.inputs.controller_one.key_up.r2~ +** Processing line: ~ args.state.player.jumped_at = nil # jumped_at is empty~ +** Processing line: ~ args.state.player.falling = true # the player is falling~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.left # if left key is pressed~ +** Processing line: ~ if args.state.player.dx < -5~ +** Processing line: ~ args.state.player.dx = args.state.player.dx~ +** Processing line: ~ else~ +** Processing line: ~ args.state.player.dx = -5~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ elsif args.inputs.right # if right key is pressed~ +** Processing line: ~ if args.state.player.dx > 5~ +** Processing line: ~ args.state.player.dx = args.state.player.dx~ +** Processing line: ~ else~ +** Processing line: ~ args.state.player.dx = 5~ +** Processing line: ~ end~ +** Processing line: ~ else~ +** Processing line: ~ args.state.player.dx *= args.state.player_speed_slowdown_rate # dx is scaled down~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if ((args.state.player.dx).abs > 5) #&& ((args.state.tick_count - args.state.lastpush) <= 10)~ +** Processing line: ~ args.state.player.dx *= 0.95~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick_instructions args, text, y = 715~ +** Processing line: ~ return if args.state.key_event_occurred~ +** Processing line: ~ if args.inputs.mouse.click ||~ +** Processing line: ~ args.inputs.keyboard.directional_vector ||~ +** Processing line: ~ args.inputs.keyboard.key_down.enter ||~ +** Processing line: ~ args.inputs.keyboard.key_down.space ||~ +** Processing line: ~ args.inputs.keyboard.key_down.escape~ +** Processing line: ~ args.state.key_event_occurred = true~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.debug << [0, y - 50, 1280, 60].solid~ +** Processing line: ~ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~ +** Processing line: ~ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Lowrez - Nokia 3310 - main.rb~ - H3 detected. - Determining if line is a header. @@ -208456,7 +219931,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ text: text,~ ** Processing line: ~ size_enum: -1.5,~ ** Processing line: ~ r: 255, g: 255, b: 255~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ args.outputs.debug << {~ @@ -208466,7 +219941,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ size_enum: -0.5,~ ** Processing line: ~ alignment_enum: 1,~ ** Processing line: ~ r: 255, g: 255, b: 255~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def snake_demo args~ @@ -208733,7 +220208,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 240,~ ** Processing line: ~ b: 216,~ ** Processing line: ~ a: 100~ -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ (NOKIA_WIDTH + 1).map_with_index do |i|~ @@ -208746,7 +220221,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 240,~ ** Processing line: ~ b: 216,~ ** Processing line: ~ a: 100~ -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ @args.state.overlay_rendered = true~ @@ -209528,7 +221003,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 128,~ ** Processing line: ~ b: 128,~ ** Processing line: ~ a: 80~ -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ ** Processing line: ~~ ** Processing line: ~ args.outputs.static_debug << {~ ** Processing line: ~ x: LOWREZ_X_OFFSET + (i * 10),~ @@ -209539,7 +221014,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 128,~ ** Processing line: ~ b: 128,~ ** Processing line: ~ a: 80~ -** Processing line: ~ }.line~ +** Processing line: ~ }.line!~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -209566,7 +221041,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ y: 720 - (i * 20),~ ** Processing line: ~ text: text,~ ** Processing line: ~ size_enum: -1.5~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ args.outputs.debug << {~ @@ -209575,7 +221050,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ text: "INFO: dev mode is currently enabled. Comment out the invocation of ~render_debug~ within the ~tick~ method to hide the debug layer.",~ ** Processing line: ~ size_enum: -0.5,~ ** Processing line: ~ alignment_enum: 1~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ $gtk.reset~ @@ -218579,58 +230054,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ class Args~ ** Processing line: ~ include ArgsDeprecated~ ** Processing line: ~ include Serialize~ -** Processing line: ~~ -** Processing line: ~ # Contains information related to input devices and input events.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Inputs]~ ** Processing line: ~ attr_accessor :inputs~ -** Processing line: ~~ -** Processing line: ~ # Contains the means to interact with output devices such as the screen.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Outputs]~ ** Processing line: ~ attr_accessor :outputs~ -** Processing line: ~~ -** Processing line: ~ # Contains the means to interact with the audio mixer.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Hash]~ ** Processing line: ~ attr_accessor :audio~ -** Processing line: ~~ -** Processing line: ~ # Contains display size information to assist in positioning things on the screen.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Grid]~ ** Processing line: ~ attr_accessor :grid~ -** Processing line: ~~ -** Processing line: ~ # Provides access to game play recording facilities within Game Toolkit.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Recording]~ ** Processing line: ~ attr_accessor :recording~ -** Processing line: ~~ -** Processing line: ~ # Gives you access to geometry related functions.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Geometry]~ ** Processing line: ~ attr_accessor :geometry~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :fn~ -** Processing line: ~~ -** Processing line: ~ # This is where you'll put state associated with your video game.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [OpenEntity]~ ** Processing line: ~ attr_accessor :state~ -** Processing line: ~~ -** Processing line: ~ # Gives you access to the top level DragonRuby runtime.~ -** Processing line: ~ #~ -** Processing line: ~ # @return [Runtime]~ +** Processing line: ~ attr_accessor :temp_state~ ** Processing line: ~ attr_accessor :runtime~ ** Processing line: ~ alias_method :gtk, :runtime~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :passes~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :wizards~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :layout~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :easing~ -** Processing line: ~~ ** Processing line: ~ attr_accessor :string~ ** Processing line: ~~ ** Processing line: ~ def initialize runtime, recording~ @@ -218639,6 +230077,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @audio = {}~ ** Processing line: ~ @passes = []~ ** Processing line: ~ @state = OpenEntity.new~ +** Processing line: ~ @temp_state = OpenEntity.new~ ** Processing line: ~ @state.tick_count = -1~ ** Processing line: ~ @runtime = runtime~ ** Processing line: ~ @recording = recording~ @@ -218668,11 +230107,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def serialize~ ** Processing line: ~ {~ -** Processing line: ~ state: state.as_hash,~ -** Processing line: ~ inputs: inputs.serialize,~ -** Processing line: ~ passes: passes.serialize,~ -** Processing line: ~ outputs: outputs.serialize,~ -** Processing line: ~ grid: grid.serialize~ +** Processing line: ~ state: state.as_hash,~ +** Processing line: ~ temp_state: temp_state.as_hash,~ +** Processing line: ~ inputs: inputs.serialize,~ +** Processing line: ~ passes: passes.serialize,~ +** Processing line: ~ outputs: outputs.serialize,~ +** Processing line: ~ grid: grid.serialize~ ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -218853,10 +230293,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ class Assert~ ** Processing line: ~ def custom_assertion actual, expected, message = nil~ -** Processing line: ~ # this tell Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).~ +** Processing line: ~ # this tells Game Toolkit that an assertion was performed (so that the test isn't marked inconclusive).~ ** Processing line: ~ @assertion_performed = true~ ** Processing line: ~~ -** Processing line: ~ # perform your custom logic here and rais an exception to denote a failure.~ +** Processing line: ~ # perform your custom logic here and raise an exception to denote a failure.~ ** Processing line: ~~ ** Processing line: ~ raise "Some Error. #{message}."~ ** Processing line: ~ end~ @@ -218866,14 +230306,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ attr :assertion_performed~ ** Processing line: ~~ ** Processing line: ~ =begin~ -** Processing line: ~ Us this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).~ +** Processing line: ~ Use this if you are throwing your own exceptions and you want to mark the tests as ran (so that it wont be marked as inconclusive).~ ** Processing line: ~ =end~ ** Processing line: ~ def ok!~ ** Processing line: ~ @assertion_performed = true~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ =begin~ -** Processing line: ~ Assert if a value is a thruthy value. All assert method take an optional final parameter that is the message to display to the user.~ +** Processing line: ~ Assert if a value is a truthy value. All assert methods take an optional final parameter that is the message to display to the user.~ ** Processing line: ~~ ** Processing line: ~ @example~ ** Processing line: ~~ @@ -218927,7 +230367,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @assertion_performed = true~ ** Processing line: ~ if actual != expected~ ** Processing line: ~ actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip~ -** Processing line: ~ message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}.\n#{message}"~ +** Processing line: ~ message = "actual:\n#{actual_string}\n\ndid not equal\n\nexpected:\n#{expected}\n#{message}"~ ** Processing line: ~ raise message~ ** Processing line: ~ end~ ** Processing line: ~ nil~ @@ -218937,7 +230377,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @assertion_performed = true~ ** Processing line: ~ if actual == expected~ ** Processing line: ~ actual_string = "#{actual}#{actual.nil? ? " (nil) " : " " }".strip~ -** Processing line: ~ message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}.\n#{message}"~ +** Processing line: ~ message = "actual:\n#{actual_string}\n\nequaled\n\nexpected:\n#{expected}\n#{message}"~ ** Processing line: ~ raise message~ ** Processing line: ~ end~ ** Processing line: ~ nil~ @@ -219007,6 +230447,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def temp_state~ +** Processing line: ~ args.temp_state~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def inputs~ ** Processing line: ~ args.inputs~ ** Processing line: ~ end~ @@ -219034,6 +230478,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def layout~ ** Processing line: ~ args.layout~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_entity entity_type, init_hash = nil, &block~ +** Processing line: ~ args.state.new_entity entity_type, init_hash, &block~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_entity_strict entity_type, init_hash = nil, &block~ +** Processing line: ~ args.state.new_entity_strict entity_type, init_hash, &block~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -219095,7 +230547,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ attr_accessor :x, :y, :w, :h, :path, :angle, :a, :r, :g, :b, :tile_x,~ ** Processing line: ~ :tile_y, :tile_w, :tile_h, :flip_horizontally,~ ** Processing line: ~ :flip_vertically, :angle_anchor_x, :angle_anchor_y, :id,~ -** Processing line: ~ :source_x, :source_y, :source_w, :source_h~ +** Processing line: ~ :source_x, :source_y, :source_w, :source_h, :blendmode_enum~ ** Processing line: ~~ ** Processing line: ~ def primitive_marker~ ** Processing line: ~ :sprite~ @@ -219155,7 +230607,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ :font_style, :menu~ ** Processing line: ~~ ** Processing line: ~ def initialize~ -** Processing line: ~ @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1, line_height: 1.1)~ +** Processing line: ~ @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)~ ** Processing line: ~ @menu = Menu.new self~ ** Processing line: ~ @disabled = false~ ** Processing line: ~ @log_offset = 0~ @@ -219175,6 +230627,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @text_color = Color.new [255, 255, 255]~ ** Processing line: ~ @error_color = Color.new [200, 50, 50]~ ** Processing line: ~ @header_color = Color.new [100, 200, 220]~ +** Processing line: ~ @code_color = Color.new [210, 168, 255]~ +** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ ** Processing line: ~ @animation_duration = 1.seconds~ ** Processing line: ~ @shown_at = -1~ ** Processing line: ~ load_history~ @@ -219449,6 +230903,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ if cmd == 'quit' || cmd == ':wq' || cmd == ':q!' || cmd == ':q' || cmd == ':wqa'~ ** Processing line: ~ $gtk.request_quit~ +** Processing line: ~ elsif cmd.start_with? ':'~ +** Processing line: ~ send ((cmd.gsub '-', '_').gsub ':', '')~ ** Processing line: ~ else~ ** Processing line: ~ puts "-> #{cmd}"~ ** Processing line: ~ begin~ @@ -219457,13 +230913,19 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if $results.nil?~ ** Processing line: ~ puts "=> nil"~ ** Processing line: ~ elsif $results == :console_silent_eval~ +** Processing line: ~ # do nothing since the console is silent~ ** Processing line: ~ else~ ** Processing line: ~ puts "=> #{$results}"~ ** Processing line: ~ end~ ** Processing line: ~ @last_command_errored = false~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ try_search_docs e~ -** Processing line: ~ puts "* EXCEPTION: #{e}"~ +** Processing line: ~ # if an exception is thrown and the bactrace includes something helpful, then show it~ +** Processing line: ~ if (e.backtrace || []).first && (e.backtrace.first.include? "(eval)")~ +** Processing line: ~ puts "* EXCEPTION: #{e}"~ +** Processing line: ~ else~ +** Processing line: ~ puts "* EXCEPTION: #{e}\n#{e.__backtrace_to_org__}"~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -219690,6 +231152,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ render_log_offset args~ +** Processing line: ~~ +** Processing line: ~ args.outputs.reserved << { x: 10.from_right, y: @bottom + 10,~ +** Processing line: ~ text: "Press CTRL+g or ESCAPE to clear the prompt.",~ +** Processing line: ~ vertical_alignment_enum: 0,~ +** Processing line: ~ alignment_enum: 2, r: 80, g: 80, b: 80 }.label!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_log_offset args~ @@ -219712,7 +231179,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def include_subdued_markers? text~ -** Processing line: ~ include_any_words? text, subdued_markers~ +** Processing line: ~ (text.start_with? "* INFO: ") && (include_any_words? text, subdued_markers)~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def include_any_words? text, words~ @@ -219858,8 +231325,32 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ (log_entry.start_with? "**** ")~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def code? log_entry~ +** Processing line: ~ (just_symbol? log_entry) || (codeblock_marker? log_entry)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def just_symbol? log_entry~ +** Processing line: ~ scrubbed = log_entry.gsub("*", "").strip~ +** Processing line: ~ (scrubbed.start_with? ":") && (!scrubbed.include? " ") && (!scrubbed.include? "=>")~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def code_comment? log_entry~ +** Processing line: ~ return true if log_entry.strip.start_with?("# ")~ +** Processing line: ~ return false~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def codeblock_marker? log_entry~ +** Processing line: ~ return true if log_entry.strip.start_with?("#+begin_src")~ +** Processing line: ~ return true if log_entry.strip.start_with?("#+end_src")~ +** Processing line: ~ return false~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def color_for_log_entry(log_entry)~ -** Processing line: ~ if include_row_marker? log_entry~ +** Processing line: ~ if code? log_entry~ +** Processing line: ~ @code_color~ +** Processing line: ~ elsif code_comment? log_entry~ +** Processing line: ~ @comment_color~ +** Processing line: ~ elsif include_row_marker? log_entry~ ** Processing line: ~ @text_color~ ** Processing line: ~ elsif include_error_marker? log_entry~ ** Processing line: ~ @error_color~ @@ -219949,6 +231440,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @color~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def to_s~ +** Processing line: ~ "GTK::Console::Color #{to_h}"~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def to_h~ ** Processing line: ~ { r: @color[0], g: @color[1], b: @color[2], a: @color[3] }~ ** Processing line: ~ end~ @@ -220011,7 +231506,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ size_enum: size_enum,~ ** Processing line: ~ alignment_enum: alignment_enum,~ ** Processing line: ~ **color.to_h,~ -** Processing line: ~ }.label~ +** Processing line: ~ }.label!~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -220090,7 +231585,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def itch_wizard_clicked~ ** Processing line: ~ @console.scroll_to_bottom~ -** Processing line: ~ $wizards.itch.start~ +** Processing line: ~ $wizards.itch.restart~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def docs_clicked~ @@ -220115,6 +231610,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @buttons = [~ ** Processing line: ~ (button id: :record, row: 0, col: 9, text: "record gameplay", method: :record_clicked),~ ** Processing line: ~ (button id: :replay, row: 0, col: 10, text: "start replay", method: :replay_clicked),~ +** Processing line: ~ *custom_buttons~ ** Processing line: ~ ]~ ** Processing line: ~ elsif @menu_shown == :hidden~ ** Processing line: ~ @buttons = [~ @@ -220173,8 +231669,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ method: method~ ** Processing line: ~ }.let do |entity|~ ** Processing line: ~ primitives = []~ -** Processing line: ~ primitives << entity[:rect].merge(a: 164).solid~ -** Processing line: ~ primitives << entity[:rect].merge(r: 255, g: 255, b: 255).border~ +** Processing line: ~ primitives << entity[:rect].solid!(a: 164)~ +** Processing line: ~ primitives << entity[:rect].border!(r: 255, g: 255, b: 255)~ ** Processing line: ~ primitives << text.wrapped_lines(5)~ ** Processing line: ~ .map_with_index do |l, i|~ ** Processing line: ~ [~ @@ -220393,17 +231889,17 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ "#{" " * (string_width.length - c.length) } #{c} |"~ ** Processing line: ~ end.join~ ** Processing line: ~~ -** Processing line: ~ # remove seperators between empty values~ +** Processing line: ~ # remove separators between empty values~ ** Processing line: ~ formated_row = formated_row.gsub(" | ", " ")~ ** Processing line: ~~ ** Processing line: ~ puts formated_row~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ def pretty_print_row_separator string_width, cell_width, column_width, columns~ ** Processing line: ~ # this is a joint: +--------~ ** Processing line: ~ column_joint = "+#{"-" * cell_width}"~ ** Processing line: ~~ -** Processing line: ~ # multiple joints create a row seperator: +----+----+~ +** Processing line: ~ # multiple joints create a row separator: +----+----+~ ** Processing line: ~ puts (column_joint * columns) + "+"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -220412,12 +231908,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 0.5,~ ** Processing line: ~ y: y + 5,~ ** Processing line: ~ x2: x + @cursor_position_px + 0.5,~ -** Processing line: ~ y2: y + @font_style.letter_size.y + 5)~ +** Processing line: ~ y2: y + @font_style.letter_size.y + 4)~ ** Processing line: ~~ ** Processing line: ~ args.outputs.reserved << (@cursor_color.to_h.merge x: x + @cursor_position_px + 1,~ ** Processing line: ~ y: y + 5,~ ** Processing line: ~ x2: x + @cursor_position_px + 1,~ -** Processing line: ~ y2: y + @font_style.letter_size.y + 5)~ +** Processing line: ~ y2: y + @font_style.letter_size.y + 4)~ ** Processing line: ~~ ** Processing line: ~ # debugging rectangle for string~ ** Processing line: ~ # args.outputs.reserved << (@cursor_color.to_h.merge x: x,~ @@ -221090,7 +232586,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ :l1, :r1,~ ** Processing line: ~ :l2, :r2,~ ** Processing line: ~ :l3, :r3,~ -** Processing line: ~ :start, :select,~ +** Processing line: ~ :start, :select, :home,~ ** Processing line: ~ :directional_up, :directional_down, :directional_left, :directional_right~ ** Processing line: ~ ].freeze~ ** Processing line: ~~ @@ -221098,6 +232594,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ attr label~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def back~ +** Processing line: ~ @select~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def back= value~ +** Processing line: ~ @select = value~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def guide~ +** Processing line: ~ @home~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def guide= value~ +** Processing line: ~ @home = value~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ # Activate a key.~ ** Processing line: ~ #~ ** Processing line: ~ # @return [void]~ @@ -221161,7 +232673,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ error_message = <<-S~ ** Processing line: ~ * ERROR~ -** Processing line: ~ The GTK::DirectionalKeys module should only be included in objects that respond to the following api heirarchy:~ +** Processing line: ~ The GTK::DirectionalKeys module should only be included in objects that respond to the following api hierarchy:~ ** Processing line: ~~ ** Processing line: ~ - (#{ directional_methods.join("|") })~ ** Processing line: ~ - key_held.(#{ directional_methods.join("|") })~ @@ -221218,6 +232730,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def directional_angle~ +** Processing line: ~ return nil unless directional_vector~ +** Processing line: ~~ +** Processing line: ~ Math.atan2(up_down, left_right).to_degrees~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def method_missing m, *args~ ** Processing line: ~ # combine the key with ctrl_~ ** Processing line: ~ if m.to_s.start_with?("ctrl_")~ @@ -221495,6 +233013,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ module GTK~ ** Processing line: ~ module Geometry~ +** Processing line: ~ def self.rotate_point point, angle, around = nil~ +** Processing line: ~ s = Math.sin a.to_radians~ +** Processing line: ~ c = Math.cos a.to_radians~ +** Processing line: ~ px = point.x~ +** Processing line: ~ py = point.y~ +** Processing line: ~ cx = 0~ +** Processing line: ~ cy = 0~ +** Processing line: ~ if around~ +** Processing line: ~ cx = around.x~ +** Processing line: ~ cy = around.y~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ point.merge(x: ((px - cx) * c - (py - cy) * s) + cx,~ +** Processing line: ~ y: ((px - cx) * s + (py - cy) * c) + cy)~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ # Returns f(t) for a cubic Bezier curve.~ ** Processing line: ~ def self.cubic_bezier t, a, b, c, d~ ** Processing line: ~ s = 1 - t~ @@ -221576,7 +233110,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise e, <<-S~ ** Processing line: ~ * ERROR:~ -** Processing line: ~ center_inside_rect for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect for self #{self} and other_rect #{other_rect}.\n#{e}.~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -221593,7 +233127,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise e, <<-S~ ** Processing line: ~ * ERROR:~ -** Processing line: ~ center_inside_rect_x for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect_x for self #{self} and other_rect #{other_rect}.\n#{e}.~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -221610,7 +233144,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise e, <<-S~ ** Processing line: ~ * ERROR:~ -** Processing line: ~ center_inside_rect_y for self #{self} and other_rect #{other_rect}. Failed with exception #{e}.~ +** Processing line: ~ center_inside_rect_y for self #{self} and other_rect #{other_rect}.\n#{e}.~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -221619,7 +233153,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~ # Returns a primitive that is anchored/repositioned based off its retangle.~ +** Processing line: ~ # Returns a primitive that is anchored/repositioned based off its rectangle.~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def anchor_rect anchor_x, anchor_y~ ** Processing line: ~ current_w = self.w~ @@ -221755,10 +233289,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def self.intersect_rect? rect_one, rect_two, tolerance = 0.1~ -** Processing line: ~ return false if rect_one.right - tolerance < rect_two.left + tolerance~ -** Processing line: ~ return false if rect_one.left + tolerance > rect_two.right - tolerance~ -** Processing line: ~ return false if rect_one.top - tolerance < rect_two.bottom + tolerance~ -** Processing line: ~ return false if rect_one.bottom + tolerance > rect_two.top - tolerance~ +** Processing line: ~ return false if ((rect_one.x + rect_one.w) - tolerance) < (rect_two.x + tolerance)~ +** Processing line: ~ return false if (rect_one.x + tolerance) > ((rect_two.x + rect_two.w) - tolerance)~ +** Processing line: ~ return false if ((rect_one.y + rect_one.h) - tolerance) < (rect_two.y + tolerance)~ +** Processing line: ~ return false if (rect_one.y + tolerance) > ((rect_two.y + rect_two.h) - tolerance)~ ** Processing line: ~ return true~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ context_help_rect_one = (rect_one.__help_contract_implementation contract_intersect_rect?)[:not_implemented_methods]~ @@ -221786,6 +233320,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ - rect_one: #{rect_one}~ ** Processing line: ~ - rect_two: #{rect_two}~ ** Processing line: ~ #{context_help}~ +** Processing line: ~ \n#{e}~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -221796,14 +233331,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ y = y.shift_down(size * anchor_y)~ ** Processing line: ~ [x, y, size, size]~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}."~ +** Processing line: ~ raise e, ":to_square failed for size: #{size} x: #{x} y: #{y} anchor_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def self.distance point_one, point_two~ ** Processing line: ~ Math.sqrt((point_two.x - point_one.x)**2 + (point_two.y - point_one.y)**2)~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}."~ +** Processing line: ~ raise e, ":distance failed for point_one: #{point_one} point_two #{point_two}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ @@ -221812,31 +233347,34 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ d_x = end_point.x - start_point.x~ ** Processing line: ~ Math::PI.+(Math.atan2(d_y, d_x)).to_degrees~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}."~ +** Processing line: ~ raise e, ":angle_from failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def self.angle_to start_point, end_point~ ** Processing line: ~ angle_from end_point, start_point~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}."~ +** Processing line: ~ raise e, ":angle_to failed for start_point: #{start_point} end_point: #{end_point}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def self.point_inside_circle? point, circle_center_point, radius~ ** Processing line: ~ (point.x - circle_center_point.x) ** 2 + (point.y - circle_center_point.y) ** 2 < radius ** 2~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}"~ +** Processing line: ~ raise e, ":point_inside_circle? failed for point: #{point} circle_center_point: #{circle_center_point} radius: #{radius}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def self.inside_rect? inner_rect, outer_rect, tolerance = 0.0~ +** Processing line: ~ return nil if !inner_rect~ +** Processing line: ~ return nil if !outer_rect~ +** Processing line: ~~ ** Processing line: ~ inner_rect.x + tolerance >= outer_rect.x - tolerance &&~ -** Processing line: ~ inner_rect.right - tolerance <= outer_rect.right + tolerance &&~ +** Processing line: ~ (inner_rect.x + inner_rect.w) - tolerance <= (outer_rect.x + outer_rect.w) + tolerance &&~ ** Processing line: ~ inner_rect.y + tolerance >= outer_rect.y - tolerance &&~ -** Processing line: ~ inner_rect.top - tolerance <= outer_rect.top + tolerance~ +** Processing line: ~ (inner_rect.y + inner_rect.h) - tolerance <= (outer_rect.y + outer_rect.h) + tolerance~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}."~ +** Processing line: ~ raise e, ":inside_rect? failed for inner_rect: #{inner_rect} outer_rect: #{outer_rect}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ @@ -221871,7 +233409,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ return rect~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}."~ +** Processing line: ~ raise e, ":scale_rect_extended failed for rect: #{rect} percentage_x: #{percentage_x} percentage_y: #{percentage_y} anchors_x: #{anchor_x} anchor_y: #{anchor_y}.\n#{e}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ @@ -221885,7 +233423,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ anchor_x: anchor_x,~ ** Processing line: ~ anchor_y: anchor_y~ ** Processing line: ~ rescue Exception => e~ -** Processing line: ~ raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)]."~ +** Processing line: ~ raise e, ":scale_rect failed for rect: #{rect} percentage: #{percentage} anchors [#{anchor_x} (x), #{anchor_y} (y)].\n#{e}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def self.rect_to_line rect~ +** Processing line: ~ l = rect.to_hash.line~ +** Processing line: ~ l.merge(x2: l.x + l.w - 1,~ +** Processing line: ~ y2: l.y + l.h)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def self.rect_center_point rect~ +** Processing line: ~ { x: rect.x + rect.w.half, y: rect.y + rect.h.half }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def rect_center_point~ +** Processing line: ~ Geometry.rect_center_point self~ ** Processing line: ~ end~ ** Processing line: ~ end # module Geometry~ ** Processing line: ~ end # module GTK~ @@ -222097,6 +233649,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def bottom_right~ ** Processing line: ~ [@right, @bottom].point~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def x~ +** Processing line: ~ 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def y~ +** Processing line: ~ 0~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -222313,6 +233873,30 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def self.method_to_key_hash~ +** Processing line: ~ return @method_to_key_hash if @method_to_key_hash~ +** Processing line: ~ @method_to_key_hash = {}~ +** Processing line: ~ string_representation_overrides ||= {~ +** Processing line: ~ backspace: '\b'~ +** Processing line: ~ }~ +** Processing line: ~ char_to_method_hash.each do |k, v|~ +** Processing line: ~ v.each do |vi|~ +** Processing line: ~ t = { char_or_raw_key: k }~ +** Processing line: ~~ +** Processing line: ~ if k.is_a? Numeric~ +** Processing line: ~ t[:raw_key] = k~ +** Processing line: ~ t[:string_representation] = "raw_key == #{k}"~ +** Processing line: ~ else~ +** Processing line: ~ t[:char] = k~ +** Processing line: ~ t[:string_representation] = "\"#{k.strip}\""~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ @method_to_key_hash[vi] = t~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ @method_to_key_hash~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def self.char_to_method char, int = nil~ ** Processing line: ~ methods = char_to_method_hash[char] || char_to_method_hash[int]~ ** Processing line: ~ methods ? methods.dup : [char.to_sym || int]~ @@ -222427,24 +234011,32 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def method_missing m, *args~ -** Processing line: ~ begin~ -** Processing line: ~ define_singleton_method(m) do~ -** Processing line: ~ r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)~ -** Processing line: ~ clear_key m~ -** Processing line: ~ return r~ -** Processing line: ~ end~ +** Processing line: ~ if KeyboardKeys.method_to_key_hash[m.without_ending_bang]~ +** Processing line: ~ begin~ +** Processing line: ~ define_singleton_method(m) do~ +** Processing line: ~ r = self.instance_variable_get("@#{m.without_ending_bang}".to_sym)~ +** Processing line: ~ clear_key m~ +** Processing line: ~ return r~ +** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ return self.send m~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ log_important "#{e}"~ +** Processing line: ~ return self.send m~ +** Processing line: ~ rescue Exception => e~ +** Processing line: ~ log_important "#{e}"~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ did_you_mean = KeyboardKeys.method_to_key_hash.find_all do |k, v|~ +** Processing line: ~ k.to_s[0..1] == m.to_s[0..1]~ +** Processing line: ~ end.map {|k, v| ":#{k} (#{v[:string_representation]})" }~ +** Processing line: ~ did_you_mean_string = ""~ +** Processing line: ~ did_you_mean_string = ". Did you mean #{did_you_mean.join ", "}?"~ +** Processing line: ~~ ** Processing line: ~ raise <<-S~ ** Processing line: ~ * ERROR:~ -** Processing line: ~ There is no member on the keyboard called #{m}. Here is a to_s representation of what's available:~ -** Processing line: ~~ -** Processing line: ~ #{KeyboardKeys.char_to_method_hash.map { |k, v| "[#{k} => #{v.join(",")}]" }.join(" ")}~ +** Processing line: ~ #{KeyboardKeys.method_to_key_hash.map { |k, v| "** :#{k} #{v.string_representation}" }.join("\n")}~ ** Processing line: ~~ +** Processing line: ~ There is no key on the keyboard called :#{m}#{did_you_mean_string}.~ +** Processing line: ~ Full list of available keys =:points_up:=.~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -222828,6 +234420,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ (controller_one && controller_one.directional_vector)~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def directional_angle~ +** Processing line: ~ keyboard.directional_angle || (controller_one && controller_one.directional_angle)~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ # Returns a signal indicating right (`1`), left (`-1`), or neither ('0').~ ** Processing line: ~ #~ ** Processing line: ~ # @return [Integer]~ @@ -222914,19 +234510,12 @@ 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: ~ # 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: ~ class WizardException < Exception~ -** Processing line: ~ attr_accessor :console_primitives~ -** Processing line: ~~ -** Processing line: ~ def initialize *console_primitives~ -** Processing line: ~ @console_primitives = console_primitives~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ class IOSWizard~ +** Processing line: ~ class IOSWizard < Wizard~ ** Processing line: ~ def initialize~ ** Processing line: ~ @doctor_executed_at = 0~ ** Processing line: ~ end~ @@ -222939,23 +234528,45 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @steps ||= []~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def steps_development_build~ +** Processing line: ~ def prerequisite_steps~ ** Processing line: ~ [~ ** Processing line: ~ :check_for_xcode,~ ** Processing line: ~ :check_for_brew,~ ** Processing line: ~ :check_for_certs,~ -** Processing line: ~ :check_for_device,~ -** Processing line: ~ :check_for_dev_profile,~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def app_metadata_retrieval_steps~ +** Processing line: ~ [~ ** Processing line: ~ :determine_team_identifier,~ ** Processing line: ~ :determine_app_name,~ ** Processing line: ~ :determine_app_id,~ -** Processing line: ~ :blow_away_temp,~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def steps_development_build~ +** Processing line: ~ [~ +** Processing line: ~ *prerequisite_steps,~ +** Processing line: ~~ +** Processing line: ~ :check_for_device,~ +** Processing line: ~ :check_for_dev_profile,~ +** Processing line: ~~ +** Processing line: ~ *app_metadata_retrieval_steps,~ +** Processing line: ~~ +** Processing line: ~ :clear_tmp_directory,~ ** Processing line: ~ :stage_app,~ +** Processing line: ~~ ** Processing line: ~ :development_write_info_plist,~ +** Processing line: ~~ ** Processing line: ~ :write_entitlements_plist,~ ** Processing line: ~ :compile_icons,~ -** Processing line: ~ :create_payload_directory,~ +** Processing line: ~ :clear_payload_directory,~ +** Processing line: ~~ +** Processing line: ~ :create_payload_directory_dev,~ +** Processing line: ~~ +** Processing line: ~ :create_payload,~ ** Processing line: ~ :code_sign_payload,~ +** Processing line: ~~ ** Processing line: ~ :create_ipa,~ ** Processing line: ~ :deploy~ ** Processing line: ~ ]~ @@ -222963,20 +234574,27 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def steps_production_build~ ** Processing line: ~ [~ -** Processing line: ~ :check_for_xcode,~ -** Processing line: ~ :check_for_brew,~ -** Processing line: ~ :check_for_certs,~ +** Processing line: ~ *prerequisite_steps,~ +** Processing line: ~~ ** Processing line: ~ :check_for_distribution_profile,~ -** Processing line: ~ :determine_team_identifier,~ -** Processing line: ~ :determine_app_name,~ -** Processing line: ~ :determine_app_id,~ -** Processing line: ~ :blow_away_temp,~ +** Processing line: ~ :determine_app_version,~ +** Processing line: ~~ +** Processing line: ~ *app_metadata_retrieval_steps,~ +** Processing line: ~~ +** Processing line: ~ :clear_tmp_directory,~ ** Processing line: ~ :stage_app,~ +** Processing line: ~~ ** Processing line: ~ :production_write_info_plist,~ +** Processing line: ~~ ** Processing line: ~ :write_entitlements_plist,~ ** Processing line: ~ :compile_icons,~ -** Processing line: ~ :create_payload_directory,~ +** Processing line: ~ :clear_payload_directory,~ +** Processing line: ~~ +** Processing line: ~ :create_payload_directory_prod,~ +** Processing line: ~~ +** Processing line: ~ :create_payload,~ ** Processing line: ~ :code_sign_payload,~ +** Processing line: ~~ ** Processing line: ~ :create_ipa,~ ** Processing line: ~ :print_publish_help~ ** Processing line: ~ ]~ @@ -223012,6 +234630,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @steps = steps_development_build~ ** Processing line: ~ @steps = steps_production_build if @production_build~ ** Processing line: ~ @certificate_name = nil~ +** Processing line: ~ @app_version = opts[:version]~ +** Processing line: ~ @app_version = "1.0" if @opts[:env] == :dev && !@app_version~ ** Processing line: ~ init_wizard_status~ ** Processing line: ~ log_info "Starting iOS Wizard so we can deploy to your device."~ ** Processing line: ~ @start_at = Kernel.global_tick_count~ @@ -223033,8 +234653,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ log "=" * $console.console_text_width~ ** Processing line: ~ else~ ** Processing line: ~ log_error e.to_s~ +** Processing line: ~ log e.__backtrace_to_org__~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ init_wizard_status~ ** Processing line: ~ $console.set_command "$wizards.ios.start env: :#{@opts[:env]}"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223141,13 +234763,66 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ return "profiles/development.mobileprovision"~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def ios_metadata_template~ +** Processing line: ~ <<-S~ +** Processing line: ~ # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~ +** Processing line: ~ # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~ +** Processing line: ~~ +** Processing line: ~ # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~ +** Processing line: ~ teamid=~ +** Processing line: ~ # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~ +** Processing line: ~ appid=~ +** Processing line: ~ # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~ +** Processing line: ~ appname=~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def ios_metadata~ +** Processing line: ~ contents = $gtk.read_file 'metadata/ios_metadata.txt'~ +** Processing line: ~~ +** Processing line: ~ if !contents~ +** Processing line: ~ $gtk.write_file 'metadata/ios_metadata.txt', ios_metadata_template~ +** Processing line: ~ contents = $gtk.read_file 'metadata/ios_metadata.txt'~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ kvps = contents.each_line~ +** Processing line: ~ .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }~ +** Processing line: ~ .map do |l|~ +** Processing line: ~ key, value = l.split("=")~ +** Processing line: ~ [key.strip.to_sym, value.strip]~ +** Processing line: ~ end.flatten~ +** Processing line: ~ Hash[*kvps]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def game_metadata~ +** Processing line: ~ contents = $gtk.read_file 'metadata/game_metadata.txt'~ +** Processing line: ~~ +** Processing line: ~ kvps = contents.each_line~ +** Processing line: ~ .reject { |l| l.strip.length == 0 || (l.strip.start_with? "#") }~ +** Processing line: ~ .map do |l|~ +** Processing line: ~ key, value = l.split("=")~ +** Processing line: ~ [key.strip.to_sym, value.strip]~ +** Processing line: ~ end.flatten~ +** Processing line: ~ Hash[*kvps]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def raise_ios_metadata_required~ +** Processing line: ~ raise WizardException.new(~ +** Processing line: ~ "* mygame/metadata/ios_metadata.txt needs to be filled out.",~ +** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",~ +** Processing line: ~ "Instructions for where the values should come from are within metadata/ios_metadata.txt."~ +** Processing line: ~ )~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def determine_team_identifier~ -** Processing line: ~ @team_name = (team_identifier_from_provisioning_profile @opts[:env])~ -** Processing line: ~ log_info "Team Identifer is: #{@team_name}"~ +** Processing line: ~ @team_id = (ios_metadata.teamid || "")~ +** Processing line: ~ raise_ios_metadata_required if @team_id.strip.length == 0~ +** Processing line: ~ log_info "Team Identifer is: #{@team_id}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def determine_app_name~ -** Processing line: ~ @app_name = (provisioning_profile_xml @opts[:env])[:children].first[:children].first[:children][1][:children].first[:data]~ +** Processing line: ~ @app_name = (ios_metadata.appname || "")~ +** Processing line: ~ raise_ios_metadata_required if @app_name.strip.length == 0~ ** Processing line: ~ log_info "App name is: #{@app_name}."~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223171,36 +234846,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ $gtk.parse_xml scrubbed~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def app_id_from_provisioning_profile environment~ -** Processing line: ~ application_identifier_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]~ -** Processing line: ~ (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|~ -** Processing line: ~ if node[:children] && node[:children][0] && node[:children][0][:data] == "application-identifier"~ -** Processing line: ~ application_identifier_index = i~ -** Processing line: ~ break~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ app_id_with_team_identifier = (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][application_identifier_index + 1][:children].first[:data]~ -** Processing line: ~ team_identifer = team_identifier_from_provisioning_profile environment~ -** Processing line: ~ app_id_with_team_identifier.gsub "#{team_identifer}.", ""~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def team_identifier_from_provisioning_profile environment~ -** Processing line: ~ team_identifer_index = (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children][0][:children][0][:data]~ -** Processing line: ~~ -** Processing line: ~ (provisioning_profile_xml environment)[:children][0][:children][0][:children][13][:children].each.with_index do |node, i|~ -** Processing line: ~ if node[:children] && node[:children][0] && node[:children][0][:data] == "com.apple.developer.team-identifier"~ -** Processing line: ~ team_identifer_index = i~ -** Processing line: ~ break~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ (provisioning_profile_xml environment)[:children].first[:children].first[:children][13][:children][team_identifer_index + 1][:children].first[:data]~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def determine_app_id~ -** Processing line: ~ @app_id = app_id_from_provisioning_profile @opts[:env]~ -** Processing line: ~~ +** Processing line: ~ @app_id = ios_metadata.appid~ +** Processing line: ~ raise_ios_metadata_required if @app_id.strip.length == 0~ ** Processing line: ~ log_info "App Identifier is set to : #{@app_id}"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223219,7 +234867,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def blow_away_temp~ +** Processing line: ~ def clear_tmp_directory~ ** Processing line: ~ sh "rm -rf #{tmp_directory}"~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223360,7 +235008,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ log_info "Creating Entitlements.plist"~ ** Processing line: ~~ -** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_name}.#{@app_id}").strip~ +** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.plist", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip~ +** Processing line: ~ $gtk.write_file_root "tmp/ios/Entitlements.txt", entitlement_plist_string.gsub(":app_id", "#{@team_id}.#{@app_id}").strip~ ** Processing line: ~~ ** Processing line: ~ sh "/usr/bin/plutil -convert binary1 \"#{tmp_directory}/Entitlements.plist\""~ ** Processing line: ~ sh "/usr/bin/plutil -convert xml1 \"#{tmp_directory}/Entitlements.plist\""~ @@ -223398,15 +235047,15 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ CFBundleExecutable~ ** Processing line: ~ :app_name~ ** Processing line: ~ CFBundleInfoDictionaryVersion~ -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundlePackageType~ ** Processing line: ~ APPL~ ** Processing line: ~ CFBundleShortVersionString~ -** Processing line: ~ 5.6~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleSignature~ ** Processing line: ~ ????~ ** Processing line: ~ CFBundleVersion~ -** Processing line: ~ 5.6~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleIcons~ ** Processing line: ~ ~ ** Processing line: ~ CFBundlePrimaryIcon~ @@ -223555,13 +235204,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ CFBundleIdentifier~ ** Processing line: ~ :app_id~ ** Processing line: ~ CFBundleInfoDictionaryVersion~ -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleName~ ** Processing line: ~ :app_name~ ** Processing line: ~ CFBundlePackageType~ ** Processing line: ~ APPL~ ** Processing line: ~ CFBundleShortVersionString~ -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleSignature~ ** Processing line: ~ ????~ ** Processing line: ~ CFBundleSupportedPlatforms~ @@ -223569,7 +235218,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ iPhoneOS~ ** Processing line: ~ ~ ** Processing line: ~ CFBundleVersion~ -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ ** Processing line: ~ DTCompiler~ ** Processing line: ~ com.apple.compilers.llvm.clang.1_0~ ** Processing line: ~ DTPlatformBuild~ @@ -223655,6 +235304,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ info_plist_string.gsub!(":app_id", @app_id)~ ** Processing line: ~~ ** Processing line: ~ $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip~ +** Processing line: ~ $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip~ ** Processing line: ~~ ** Processing line: ~ @info_plist_written = true~ ** Processing line: ~ end~ @@ -223708,13 +235358,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ CFBundleIdentifier~ ** Processing line: ~ :app_id~ ** Processing line: ~ CFBundleInfoDictionaryVersion~ -** Processing line: ~ 6.0~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleName~ ** Processing line: ~ :app_name~ ** Processing line: ~ CFBundlePackageType~ ** Processing line: ~ APPL~ ** Processing line: ~ CFBundleShortVersionString~ -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ ** Processing line: ~ CFBundleSignature~ ** Processing line: ~ ????~ ** Processing line: ~ CFBundleSupportedPlatforms~ @@ -223722,7 +235372,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ iPhoneOS~ ** Processing line: ~ ~ ** Processing line: ~ CFBundleVersion~ -** Processing line: ~ 5.2~ +** Processing line: ~ :app_version~ ** Processing line: ~ DTCompiler~ ** Processing line: ~ com.apple.compilers.llvm.clang.1_0~ ** Processing line: ~ DTPlatformBuild~ @@ -223806,8 +235456,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ info_plist_string.gsub!(":app_name", @app_name)~ ** Processing line: ~ info_plist_string.gsub!(":app_id", @app_id)~ +** Processing line: ~ info_plist_string.gsub!(":app_version", @app_version)~ ** Processing line: ~~ ** Processing line: ~ $gtk.write_file_root "tmp/ios/#{@app_name}.app/Info.plist", info_plist_string.strip~ +** Processing line: ~ $gtk.write_file_root "tmp/ios/Info.txt", info_plist_string.strip~ ** Processing line: ~~ ** Processing line: ~ @info_plist_written = true~ ** Processing line: ~ end~ @@ -223829,28 +235481,53 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ "#{relative_path}/#{$gtk.cli_arguments[:dragonruby]}"~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def write_ip_address~ +** Processing line: ~ def embed_mobileprovision~ +** Processing line: ~ sh %Q[cp #{@provisioning_profile_path} "#{app_path}/embedded.mobileprovision"]~ +** Processing line: ~ sh %Q[/usr/bin/plutil -convert binary1 "#{app_path}/Info.plist"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def clear_payload_directory~ +** Processing line: ~ sh %Q[rm "#{@app_name}".ipa]~ +** Processing line: ~ sh %Q[rm -rf "#{app_path}/app"]~ +** Processing line: ~ sh %Q[rm -rf "#{app_path}/sounds"]~ +** Processing line: ~ sh %Q[rm -rf "#{app_path}/sprites"]~ +** Processing line: ~ sh %Q[rm -rf "#{app_path}/data"]~ +** Processing line: ~ sh %Q[rm -rf "#{app_path}/fonts"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def stage_app~ +** Processing line: ~ sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]~ +** Processing line: ~ sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]~ +** Processing line: ~ sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]~ +** Processing line: ~ sh %Q[cp -r "#{root_folder}/data/" "#{app_path}/data/"]~ +** Processing line: ~ sh %Q[cp -r "#{root_folder}/fonts/" "#{app_path}/fonts/"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def create_payload~ +** Processing line: ~ sh %Q[mkdir -p #{tmp_directory}/ipa_root/Payload]~ +** Processing line: ~ sh %Q[cp -r "#{app_path}" "#{tmp_directory}/ipa_root/Payload"]~ +** Processing line: ~ sh %Q[chmod -R 755 "#{tmp_directory}/ipa_root/Payload"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def create_payload_directory_dev~ +** Processing line: ~ # write dev machine's ip address for hotloading~ ** Processing line: ~ $gtk.write_file "app/server_ip_address.txt", $gtk.ffi_misc.get_local_ip_address.strip~ +** Processing line: ~~ +** Processing line: ~ embed_mobileprovision~ +** Processing line: ~ clear_payload_directory~ +** Processing line: ~ stage_app~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def create_payload_directory~ -** Processing line: ~ sh "cp #{@provisioning_profile_path} \"#{app_path}/embedded.mobileprovision\""~ -** Processing line: ~ sh "/usr/bin/plutil -convert binary1 \"#{app_path}/Info.plist\""~ -** Processing line: ~ write_ip_address~ -** Processing line: ~ sh "rm \"#{@app_name}\".ipa"~ -** Processing line: ~ sh "rm -rf \"#{app_path}/app\""~ -** Processing line: ~ sh "rm -rf \"#{app_path}/sounds\""~ -** Processing line: ~ sh "rm -rf \"#{app_path}/sprites\""~ -** Processing line: ~ sh "rm -rf \"#{app_path}/data\""~ -** Processing line: ~ sh "rm -rf \"#{app_path}/fonts\""~ -** Processing line: ~ sh "cp -r \"#{root_folder}/app/\" \"#{app_path}/app/\""~ -** Processing line: ~ sh "cp -r \"#{root_folder}/sounds/\" \"#{app_path}/sounds/\""~ -** Processing line: ~ sh "cp -r \"#{root_folder}/sprites/\" \"#{app_path}/sprites/\""~ -** Processing line: ~ sh "cp -r \"#{root_folder}/data/\" \"#{app_path}/data/\""~ -** Processing line: ~ sh "cp -r \"#{root_folder}/fonts/\" \"#{app_path}/fonts/\""~ -** Processing line: ~ sh "mkdir -p #{tmp_directory}/ipa_root/Payload"~ -** Processing line: ~ sh "cp -r \"#{app_path}\" \"#{tmp_directory}/ipa_root/Payload\""~ -** Processing line: ~ sh "chmod -R 755 \"#{tmp_directory}/ipa_root/Payload\""~ +** Processing line: ~ def create_payload_directory_prod~ +** Processing line: ~ # production builds does not hotload ip address~ +** Processing line: ~ sh %Q[rm "#{root_folder}/app/server_ip_address.txt"]~ +** Processing line: ~~ +** Processing line: ~ embed_mobileprovision~ +** Processing line: ~ stage_app~ +** Processing line: ~~ +** Processing line: ~ # production build marker~ +** Processing line: ~ sh %Q[mkdir -p "#{app_path}/metadata/"]~ +** Processing line: ~ sh %Q[touch metadata/DRAGONRUBY_PRODUCTION_BUILD]~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def create_ipa~ @@ -223883,10 +235560,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def print_publish_help~ -** Processing line: ~ log_info "Go to https://appstoreconnect.apple.com/apps and create an App if you haven't already done so."~ -** Processing line: ~ log_info "Go to https://appleid.apple.com and create a 'Application Specific Password'."~ -** Processing line: ~ log_info "To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."~ -** Processing line: ~ log_info "Your app is located at ./tmp/ios/#{@app_name}.ipa"~ +** Processing line: ~ has_transporter = (sh "ls /Applications/Transporter.app").include? "Contents"~ +** Processing line: ~ if !has_transporter~ +** Processing line: ~ $gtk.openurl "https://apps.apple.com/us/app/transporter/id1450874784?mt=12"~ +** Processing line: ~ $console.set_command "$wizards.ios.start env: :#{@opts[:env]}, version: \"#{@opts[:version]}\""~ +** Processing line: ~ raise WizardException.new(~ +** Processing line: ~ "* To upload your app, Download Transporter from the App Store https://apps.apple.com/us/app/transporter/id1450874784?mt=12."~ +** Processing line: ~ )~ +** Processing line: ~ else~ +** Processing line: ~ sh "mkdir ./tmp/ios/intermediary_artifacts"~ +** Processing line: ~ sh "mv \"#{tmp_directory}/#{@app_name}.app\" #{tmp_directory}/intermediary_artifacts/"~ +** Processing line: ~ sh "mv \"#{tmp_directory}/do_zip.sh\" #{tmp_directory}/intermediary_artifacts"~ +** Processing line: ~ sh "mv \"#{tmp_directory}/Entitlements.plist\" #{tmp_directory}/intermediary_artifacts"~ +** Processing line: ~ sh "mv \"#{tmp_directory}/ipa_root\" #{tmp_directory}/intermediary_artifacts/"~ +** Processing line: ~ sh "open /Applications/Transporter.app"~ +** Processing line: ~ sh "open ./tmp/ios/"~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def compile_icons~ @@ -223907,6 +235596,26 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ sh "cp -r \"#{root_folder}/native/\" \"#{app_path}/native/\""~ ** Processing line: ~ sh "CODESIGN_ALLOCATE=\"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate\" /usr/bin/codesign -f -s \"#{@certificate_name}\" --entitlements #{tmp_directory}/Entitlements.plist \"#{tmp_directory}/#{@app_name}.app/native/ios-device/ext.dylib\""~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def set_version version~ +** Processing line: ~ @app_version = version~ +** Processing line: ~ start env: @opts[:env], version: version~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def app_version~ +** Processing line: ~ log_info "Attempting to retrieve App Version from metadata/ios_metadata.txt."~ +** Processing line: ~ ios_version_number = (ios_metadata.version || "").strip~ +** Processing line: ~ if ios_version_number.length == 0~ +** Processing line: ~ log_info "Not found. Attempting to retrieve App Version from metadata/game_metadata.txt."~ +** Processing line: ~ ios_version_number = (game_metadata.version || "").strip~ +** Processing line: ~ end~ +** Processing line: ~ ios_version_number~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def determine_app_version~ +** Processing line: ~ @app_version = app_version~ +** Processing line: ~ return if @app_version~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -223933,38 +235642,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # MIT License~ ** Processing line: ~ # itch_wizard.rb has been released under MIT (*only this file*).~ ** Processing line: ~~ -** Processing line: ~ class ItchWizard~ +** Processing line: ~ class ItchWizard < Wizard~ ** Processing line: ~ def steps~ ** Processing line: ~ [~ ** Processing line: ~ :check_metadata,~ -** Processing line: ~ :deploy~ +** Processing line: ~ :deploy,~ ** Processing line: ~ ]~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def metadata_file_path~ -** Processing line: ~ "metadata/game_metadata.txt"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def get_metadata~ -** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ -** Processing line: ~~ -** Processing line: ~ if !metadata~ -** Processing line: ~ write_blank_metadata~ -** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ -** Processing line: ~~ -** Processing line: ~ {~ -** Processing line: ~ dev_id: dev_id.strip,~ -** Processing line: ~ dev_title: dev_title.strip,~ -** Processing line: ~ game_id: game_id.strip,~ -** Processing line: ~ game_title: game_title.strip,~ -** Processing line: ~ version: version.strip,~ -** Processing line: ~ icon: icon.strip~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def write_blank_metadata~ ** Processing line: ~ $gtk.write_file metadata_file_path, <<-S.strip~ ** Processing line: ~ #devid=myname~ @@ -223982,7 +235667,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ write_blank_metadata~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ if metadata_text.each_line.to_a.length != 6~ +** Processing line: ~ if metadata_text.strip.each_line.to_a.length < 6~ ** Processing line: ~ write_blank_metadata~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223994,70 +235679,67 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ if metadata[:dev_id].start_with?("#") || !@dev_id~ ** Processing line: ~ log "* PROMPT: Please provide your username for Itch."~ -** Processing line: ~ $console.set_command "$wizards.itch.set_dev_id \"your-itch-username\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_dev_id \"#{metadata[:dev_id]}\""~ ** Processing line: ~ return :need_dev_id~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if metadata[:dev_title].start_with?("#") || !@dev_title~ ** Processing line: ~ log "* PROMPT: Please provide developer's/company's name that you want displayed."~ -** Processing line: ~ $console.set_command "$wizards.itch.set_dev_title \"Your Name\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_dev_title \"#{metadata[:dev_title]}\""~ ** Processing line: ~ return :need_dev_title~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if metadata[:game_id].start_with?("#") || !@game_id~ ** Processing line: ~ log "* PROMPT: Please provide the id for you game. This is the id you specified when you set up a new game page on Itch."~ -** Processing line: ~ $console.set_command "$wizards.itch.set_game_id \"your-game-id\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_game_id \"#{metadata[:game_id]}\""~ ** Processing line: ~ return :need_game_id~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if metadata[:game_title].start_with?("#") || !@game_title~ ** Processing line: ~ log "* PROMPT: Please provide the display name for your game. (This can include spaces)"~ -** Processing line: ~ $console.set_command "$wizards.itch.set_game_title \"Your Game\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_game_title \"#{metadata[:game_title]}\""~ ** Processing line: ~ return :need_game_title~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if metadata[:version].start_with?("#") || !@version~ ** Processing line: ~ log "* PROMPT: Please provide the version for your game."~ -** Processing line: ~ $console.set_command "$wizards.itch.set_version \"1.0\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_version \"#{metadata[:version]}\""~ ** Processing line: ~ return :need_version~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if metadata[:icon].start_with?("#") || !@icon~ ** Processing line: ~ log "* PROMPT: Please provide icon path for your game."~ -** Processing line: ~ $console.set_command "$wizards.itch.set_icon \"icon.png\""~ +** Processing line: ~ $console.set_command "$wizards.itch.set_icon \"#{metadata[:icon]}\""~ ** Processing line: ~ return :need_icon~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ puts "here!! success!!!"~ +** Processing line: ~~ ** Processing line: ~ return :success~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_dev_id value~ ** Processing line: ~ @dev_id = value~ -** Processing line: ~ write_metadata~ ** Processing line: ~ start~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_dev_title value~ ** Processing line: ~ @dev_title = value~ -** Processing line: ~ write_metadata~ ** Processing line: ~ start~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_game_id value~ ** Processing line: ~ @game_id = value~ -** Processing line: ~ write_metadata~ ** Processing line: ~ start~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_game_title value~ ** Processing line: ~ @game_title = value~ -** Processing line: ~ write_metadata~ ** Processing line: ~ start~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_version value~ ** Processing line: ~ @version = value~ -** Processing line: ~ write_metadata~ ** Processing line: ~ start~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -224100,7 +235782,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if @icon~ -** Processing line: ~ text += "icon=metadata/#{@icon}\n"~ +** Processing line: ~ text += "icon=#{@icon}\n"~ ** Processing line: ~ else~ ** Processing line: ~ text += "#icon=metadata/icon.png\n"~ ** Processing line: ~ end~ @@ -224118,10 +235800,25 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def deploy~ ** Processing line: ~ log_info "* Running dragonruby-publish: #{package_command}"~ -** Processing line: ~ results = $gtk.exec package_command~ +** Processing line: ~ $gtk.openurl "http://itch.io/dashboard" if $gtk.platform == "Mac OS X"~ +** Processing line: ~ if $gtk.platform? :mac~ +** Processing line: ~ $gtk.exec "rm -rf ./builds"~ +** Processing line: ~ end~ +** Processing line: ~ results = $gtk.exec "#{package_command} --only-package"~ +** Processing line: ~ puts File.expand_path("./builds")~ +** Processing line: ~~ ** Processing line: ~ log "#+begin_src"~ ** Processing line: ~ log results~ ** Processing line: ~ log "#+end_src"~ +** Processing line: ~~ +** Processing line: ~ if $gtk.platform? :mac~ +** Processing line: ~ $gtk.exec "open ./builds/"~ +** Processing line: ~ elsif $gtk.platform? :windows~ +** Processing line: ~ $gtk.exec "powershell \"ii .\""~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.openurl "https://itch.io/dashboard"~ +** Processing line: ~~ ** Processing line: ~ :success~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -224132,7 +235829,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ steps.each do |m|~ ** Processing line: ~ begin~ ** Processing line: ~ log_info "Running Itch Wizard Step: ~$wizards.itch.#{m}~"~ -** Processing line: ~ result = (send m) || :success if @wizard_status[m][:result] != :success~ +** Processing line: ~ result = (send m) || :success~ ** Processing line: ~ @wizard_status[m][:result] = result~ ** Processing line: ~ if result != :success~ ** Processing line: ~ log_info "Exiting wizard. :#{result}"~ @@ -224496,10 +236193,18 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ device.grid_area.row_count~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def row_max_index~ +** Processing line: ~ row_count - 1~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def col_count~ ** Processing line: ~ device.grid_area.col_count~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def col_max_index~ +** Processing line: ~ col_count - 1~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def gutter_height~ ** Processing line: ~ device.grid_area.gutter~ ** Processing line: ~ end~ @@ -224522,18 +236227,124 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def rect_defaults~ ** Processing line: ~ {~ -** Processing line: ~ row: nil,~ -** Processing line: ~ col: nil,~ -** Processing line: ~ h: 1,~ -** Processing line: ~ w: 1,~ -** Processing line: ~ dx: 0,~ -** Processing line: ~ dy: 0,~ -** Processing line: ~ rect: :control_rect~ +** Processing line: ~ row: nil,~ +** Processing line: ~ col: nil,~ +** Processing line: ~ h: 1,~ +** Processing line: ~ w: 1,~ +** Processing line: ~ dx: 0,~ +** Processing line: ~ dx_ratio: 1,~ +** Processing line: ~ dy: 0,~ +** Processing line: ~ dy_ratio: 1,~ +** Processing line: ~ dh_ratio: 1,~ +** Processing line: ~ dw_ratio: 1,~ +** Processing line: ~ merge: nil,~ +** Processing line: ~ rect: :control_rect~ ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def rect opts~ +** Processing line: ~ def row n~ +** Processing line: ~ (rect row: n, col: 0, w: 0, h: 0).x~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def row_from_bottom n~ +** Processing line: ~ (rect row: row_count - n, col: 0, w: 0, h: 0).x~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def col n~ +** Processing line: ~ (rect row: 0, col: n, w: 0, h: 0).y~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def col_from_right n~ +** Processing line: ~ (rect row: 0, col: col_max_index - n, w: 0, h: 0).y~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def w n~ +** Processing line: ~ (rect row: 0, col: 0, w: n, h: 1).w~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def h n~ +** Processing line: ~ (rect row: 0, col: 0, w: 1, h: n).h~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def rect_group opts~ +** Processing line: ~ group = opts.group~ +** Processing line: ~ r = opts.row || 0~ +** Processing line: ~ r = row_max_index - opts.row_from_bottom if opts.row_from_bottom~ +** Processing line: ~ c = opts.col || 0~ +** Processing line: ~ c = col_max_index - opts.col_from_right if opts.col_from_right~ +** Processing line: ~ drow = opts.drow || 0~ +** Processing line: ~ dcol = opts.dcol || 0~ +** Processing line: ~ w = opts.w || 0~ +** Processing line: ~ h = opts.h || 0~ +** Processing line: ~ merge = opts[:merge]~ +** Processing line: ~~ +** Processing line: ~ running_row = r~ +** Processing line: ~ running_col = c~ +** Processing line: ~~ +** Processing line: ~ running_col = calc_col_offset(opts.col_offset) if opts.col_offset~ +** Processing line: ~ running_row = calc_row_offset(opts.row_offset) if opts.row_offset~ +** Processing line: ~~ +** Processing line: ~ group.map do |i|~ +** Processing line: ~ group_layout_opts = i.layout || {}~ +** Processing line: ~ group_layout_opts = group_layout_opts.merge row: running_row,~ +** Processing line: ~ col: running_col,~ +** Processing line: ~ merge: merge,~ +** Processing line: ~ w: w, h: h~ +** Processing line: ~ result = (rect group_layout_opts).merge i~ +** Processing line: ~~ +** Processing line: ~ if (i.is_a? Hash) && (i.primitive_marker == :label)~ +** Processing line: ~ if i.alignment_enum == 1~ +** Processing line: ~ result.x += result.w.half~ +** Processing line: ~ elsif i.alignment_enum == 2~ +** Processing line: ~ result.x += result.w~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ running_row += drow~ +** Processing line: ~ running_col += dcol~ +** Processing line: ~ result~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_row_offset opts = {}~ +** Processing line: ~ count = opts[:count] || opts[:length] || 0~ +** Processing line: ~ h = opts.h || 1~ +** Processing line: ~ (row_count - (count * h)) / 2.0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_col_offset opts = {}~ +** Processing line: ~ count = opts[:count] || opts[:length] || 0~ +** Processing line: ~ w = opts.w || 1~ +** Processing line: ~ (col_count - (count * w)) / 2.0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def point opts = {}~ +** Processing line: ~ opts.w = 1~ +** Processing line: ~ opts.h = 1~ +** Processing line: ~ opts.row ||= 0~ +** Processing line: ~ opts.col ||= 0~ +** Processing line: ~ r = rect opts~ +** Processing line: ~ r.x += r.w * opts.col_anchor if opts.col_anchor~ +** Processing line: ~ r.y += r.h * opts.row_anchor if opts.row_anchor~ +** Processing line: ~ r~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def rect *all_opts~ +** Processing line: ~ if all_opts.length == 1~ +** Processing line: ~ opts = all_opts.first~ +** Processing line: ~ else~ +** Processing line: ~ opts = {}~ +** Processing line: ~ all_opts.each do |o|~ +** Processing line: ~ opts.merge! o~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ opts.row = row_max_index - opts.row_from_bottom if opts.row_from_bottom~ +** Processing line: ~ opts.col = col_max_index - opts.col_from_right if opts.col_from_right~ ** Processing line: ~ opts = rect_defaults.merge opts~ +** Processing line: ~ opts.row ||= 0~ +** Processing line: ~ opts.col ||= 0~ +** Processing line: ~~ ** Processing line: ~ result = send opts[:rect]~ ** Processing line: ~ if opts[:row] && opts[:col] && opts[:w] && opts[:h]~ ** Processing line: ~ col = rect_col opts[:col], opts[:w]~ @@ -224541,7 +236352,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ result = control_rect.merge x: col.x,~ ** Processing line: ~ y: row.y,~ ** Processing line: ~ w: col.w,~ -** Processing line: ~ h: row.h~ +** Processing line: ~ h: row.h,~ +** Processing line: ~ center_x: col.center_x,~ +** Processing line: ~ center_y: row.center_y~ ** Processing line: ~ elsif opts[:row] && !opts[:col]~ ** Processing line: ~ result = rect_row opts[:row], opts[:h]~ ** Processing line: ~ elsif !opts[:row] && opts[:col]~ @@ -224579,13 +236392,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ result[:h] += device.grid_area.gutter * 2~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ result[:x] += opts[:dx] if opts[:dx]~ -** Processing line: ~ result[:y] += opts[:dy] if opts[:dy]~ -** Processing line: ~ result[:w] += opts[:dw] if opts[:dw]~ -** Processing line: ~ result[:h] += opts[:dh] if opts[:dh]~ +** Processing line: ~ result[:x] += opts[:dx] if opts[:dx]~ +** Processing line: ~ result[:x] *= opts[:dx_ratio] if opts[:dx_ratio]~ +** Processing line: ~ result[:y] += opts[:dy] if opts[:dy]~ +** Processing line: ~ result[:y] *= opts[:dy_ratio] if opts[:dy_ratio]~ +** Processing line: ~ result[:w] += opts[:dw] if opts[:dw]~ +** Processing line: ~ result[:w] *= opts[:dw_ratio] if opts[:dw_ratio]~ +** Processing line: ~ result[:h] += opts[:dh] if opts[:dh]~ +** Processing line: ~ result[:h] *= opts[:dh_ratio] if opts[:dh_ratio]~ +** Processing line: ~ result.merge! opts[:merge] if opts[:merge]~ ** Processing line: ~ result[:row] = opts[:row]~ ** Processing line: ~ result[:col] = opts[:col]~ ** Processing line: ~~ +** Processing line: ~ result[:h] = result[:h].clamp 0~ +** Processing line: ~ result[:w] = result[:w].clamp 0~ +** Processing line: ~~ ** Processing line: ~ if $gtk.args.grid.name == :center~ ** Processing line: ~ result[:x] -= 640~ ** Processing line: ~ result[:y] -= 360~ @@ -224620,7 +236441,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ row_y = device.h - row_y - row_h~ ** Processing line: ~~ -** Processing line: ~ result = control_rect.merge y: row_y, h: row_h~ +** Processing line: ~ result = control_rect.merge y: row_y, h: row_h, center_y: (row_y + row_h.half)~ ** Processing line: ~ @rect_cache[:row][index][h] = result~ ** Processing line: ~ @rect_cache[:row][index][h]~ ** Processing line: ~ end~ @@ -224643,7 +236464,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ col_w = col_w.to_i~ ** Processing line: ~ col_w -= 1 if col_w.odd?~ ** Processing line: ~~ -** Processing line: ~ result = control_rect.merge x: col_x, w: col_w~ +** Processing line: ~ result = control_rect.merge x: col_x, w: col_w, center_x: (col_x + col_w.half)~ ** Processing line: ~ @rect_cache[:col][index][w] = result~ ** Processing line: ~ @rect_cache[:col][index][w]~ ** Processing line: ~ end~ @@ -224694,6 +236515,26 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @device~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def debug_primitives opts = {}~ +** Processing line: ~ @primitives ||= col_count.map_with_index do |col|~ +** Processing line: ~ row_count.map_with_index do |row|~ +** Processing line: ~ cell = rect row: row, col: col~ +** Processing line: ~ center = Geometry.rect_center_point cell~ +** Processing line: ~ [~ +** Processing line: ~ cell.merge(opts).border,~ +** Processing line: ~ cell.merge(opts)~ +** Processing line: ~ .label!(x: center.x,~ +** Processing line: ~ y: center.y,~ +** Processing line: ~ text: "#{row},#{col}",~ +** Processing line: ~ size_enum: -3,~ +** Processing line: ~ vertical_alignment_enum: 1,~ +** Processing line: ~ alignment_enum: 1)~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ @primitives~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def serialize~ ** Processing line: ~ {~ ** Processing line: ~ device: @device.serialize,~ @@ -224707,6 +236548,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def to_s~ ** Processing line: ~ serialize.to_s~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def reset~ +** Processing line: ~ @primitives = nil~ +** Processing line: ~ @rect_cache ||= {}~ +** Processing line: ~ @rect_cache.clear~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -224861,6 +236709,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ self.puts message~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def self.reset~ +** Processing line: ~ @once = {}~ +** Processing line: ~ nil~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def self.puts_once *ids, message~ ** Processing line: ~ id = "#{ids}"~ ** Processing line: ~ @once ||= {}~ @@ -224999,6 +236852,68 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** metadata.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~metadata.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: ~metadata.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/metadata.rb~ +** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~ +** 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: ~ module Metadata~ +** Processing line: ~ def metadata_file_path~ +** Processing line: ~ "metadata/game_metadata.txt"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_metadata~ +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +** Processing line: ~~ +** Processing line: ~ if !metadata~ +** Processing line: ~ write_blank_metadata~ +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ dev_id: dev_id.strip,~ +** Processing line: ~ dev_title: dev_title.strip,~ +** Processing line: ~ game_id: game_id.strip,~ +** Processing line: ~ game_title: game_title.strip,~ +** Processing line: ~ version: version.strip,~ +** Processing line: ~ icon: icon.strip~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def write_blank_metadata~ +** Processing line: ~ $gtk.write_file metadata_file_path, <<-S.strip~ +** Processing line: ~ #devid=myname~ +** Processing line: ~ #devtitle=My Name~ +** Processing line: ~ #gameid=mygame~ +** Processing line: ~ #gametitle=My Game~ +** Processing line: ~ #version=0.1~ +** Processing line: ~ #icon=metadata/icon.png~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** numeric.rb~ - H3 detected. - Determining if line is a header. @@ -225030,6 +236945,35 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ alias_method :lte, :<=~ ** Processing line: ~ alias_method :__original_eq_eq__, :== unless Numeric.instance_methods.include? :__original_eq_eq__~ ** Processing line: ~~ +** Processing line: ~ def to_layout_row opts = {}~ +** Processing line: ~ $layout.rect(row: self,~ +** Processing line: ~ col: opts.col || 0,~ +** Processing line: ~ w: opts.w || 0,~ +** Processing line: ~ h: opts.h || 0).y~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_layout_col opts = {}~ +** Processing line: ~ $layout.rect(row: 0,~ +** Processing line: ~ col: self,~ +** Processing line: ~ w: opts.w || 0,~ +** Processing line: ~ h: opts.h || 0).x~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_layout_w~ +** Processing line: ~ $layout.rect(row: 0, col: 0, w: self, h: 1).w~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_layout_h~ +** Processing line: ~ $layout.rect(row: 0, col: 0, w: 1, h: self).h~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_layout_row_from_bottom opts = {}~ +** Processing line: ~ ($layout.row_max_index - self).to_layout_row opts~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def to_layout_col_from_right opts = {}~ +** Processing line: ~ ($layout.col_max_index - self).to_layout_col opts~ +** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Converts a numeric value representing seconds into frames.~ ** Processing line: ~ #~ @@ -225045,10 +236989,26 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ self / 2.0~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def third~ +** Processing line: ~ self / 3.0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def quarter~ +** Processing line: ~ self / 4.0~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def to_byte~ ** Processing line: ~ clamp(0, 255).to_i~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def clamp *opts~ +** Processing line: ~ min = (opts.at 0)~ +** Processing line: ~ max = (opts.at 1)~ +** Processing line: ~ return min if min && self < min~ +** Processing line: ~ return max if max && self > max~ +** Processing line: ~ return self~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def clamp_wrap min, max~ ** Processing line: ~ max, min = min, max if min > max~ ** Processing line: ~ return self if self >= min && self <= max~ @@ -225273,7 +237233,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ self * Math::PI.fdiv(180)~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # Converts a number representing an angle in radians to degress.~ +** Processing line: ~ # Converts a number representing an angle in radians to degrees.~ ** Processing line: ~ #~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def to_degrees~ @@ -225290,21 +237250,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ GTK::Geometry.to_square(self, x, y, anchor_x, anchor_y)~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # Returns a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns a normal vector for a number that represents an angle in degrees.~ ** Processing line: ~ #~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def vector max_value = 1~ ** Processing line: ~ [vector_x(max_value), vector_y(max_value)]~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # Returns the y component of a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns the y component of a normal vector for a number that represents an angle in degrees.~ ** Processing line: ~ #~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def vector_y max_value = 1~ ** Processing line: ~ max_value * Math.sin(self.to_radians)~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # Returns the x component of a normal vector for a number that represents an angle in degress.~ +** Processing line: ~ # Returns the x component of a normal vector for a number that represents an angle in degrees.~ ** Processing line: ~ #~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def vector_x max_value = 1~ @@ -225331,6 +237291,18 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ (self % n) == 0~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def multiply n~ +** Processing line: ~ self * n~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def fmult n~ +** Processing line: ~ self * n.to_f~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def imult n~ +** Processing line: ~ (self * n).to_i~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def mult n~ ** Processing line: ~ self * n~ ** Processing line: ~ end~ @@ -225452,12 +237424,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ return gt other~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def == other~ -** Processing line: ~ return true if __original_eq_eq__ other~ -** Processing line: ~ return __original_eq_eq__ other.entity_id if other.is_a? OpenEntity~ -** Processing line: ~ return false~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def map~ ** Processing line: ~ unless block_given?~ @@ -225544,29 +237510,29 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def - other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self - other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def + other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self + other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def * other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self * other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def / other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self / other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ ** Processing line: ~ end~ @@ -225596,6 +237562,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def self.clamp n, min, max~ ** Processing line: ~ n.clamp min, max~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def mid? l, r~ +** Processing line: ~ (between? l, r) || (between? r, l)~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ class Fixnum~ @@ -225622,39 +237592,33 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def + other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self + other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def * other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self * other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def / other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self / other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def - other~ -** Processing line: ~ return nil unless other~ -** Processing line: ~ super~ +** Processing line: ~ return self unless other~ +** Processing line: ~ self - other~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def == other~ -** Processing line: ~ return true if __original_eq_eq__ other~ -** Processing line: ~ return __original_eq_eq__ other.entity_id if other.is_a? GTK::OpenEntity~ -** Processing line: ~ return false~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ # Returns `-1` if the number is less than `0`. `+1` if the number~ ** Processing line: ~ # is greater than `0`. Returns `0` if the number is equal to `0`.~ ** Processing line: ~ #~ @@ -225711,28 +237675,28 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__~ ** Processing line: ~~ ** Processing line: ~ def - other~ -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ ** Processing line: ~ super~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def + other~ -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ ** Processing line: ~ super~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def * other~ -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ ** Processing line: ~ super~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def / other~ -** Processing line: ~ return nil unless other~ +** Processing line: ~ return self unless other~ ** Processing line: ~ super~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ @@ -225779,6 +237743,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def nan?~ ** Processing line: ~ false~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def center other~ +** Processing line: ~ (self - other).abs.fdiv(2)~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~#+end_src~ @@ -225850,7 +237818,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def local_state~ ** Processing line: ~ @local_state ||= OpenEntity.new~ ** Processing line: ~ @local_state.hotload_client ||= @local_state.new_entity(:hotload_client,~ -** Processing line: ~ notes: "This enitity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",~ +** Processing line: ~ notes: "This entity is used by DragonRuby Game Toolkit to provide you hotloading on remote machines.",~ ** Processing line: ~ changes: { },~ ** Processing line: ~ changes_queue: [],~ ** Processing line: ~ reloaded_files_times: [])~ @@ -226041,7 +238009,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ sub_index = index - previous_line[:sum]~ ** Processing line: ~ word = (cursor_line[:line][0..sub_index - 1]).strip~ ** Processing line: ~ token = (word.split " ")[-1]~ -** Processing line: ~ dots = (token.split ".")~ +** Processing line: ~ dots = (token.split ".").flat_map { |s| s.split "[" }.flat_map { |s| s.split "]" }.flat_map { |s| s.split "(" }.flat_map { |s| s.split ")" }~ ** Processing line: ~ dot = dots[-1]~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -226062,6 +238030,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ ignores ||= []~ ** Processing line: ~ ignores = [ignores].flatten~ ** Processing line: ~ keys = keys.map { |k| k.to_s }~ +** Processing line: ~ keys = keys.reject { |k| k.include? '"' }~ +** Processing line: ~ .reject { |k| k.start_with? "'" }~ +** Processing line: ~ .reject { |k| k.include? "," }~ +** Processing line: ~ .reject { |k| k.start_with? "#" }~ ** Processing line: ~ others = ["def", "end"] +~ ** Processing line: ~ [ :entity_keys_by_ref,~ ** Processing line: ~ :entity_name,~ @@ -226119,6 +238091,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ return autocomplete_filter_methods lookup_result.call if lookup_result~ ** Processing line: ~~ +** Processing line: ~ if dot[0].upcase == dot[0] && (Object.const_defined? dot.to_sym)~ +** Processing line: ~ return (Object.const_get dot.to_sym).autocomplete_methods~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ start_collecting = false~ ** Processing line: ~ dots_after_state = dots.find_all do |s|~ ** Processing line: ~ if s == "state"~ @@ -226134,10 +238110,16 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ target = target.as_hash[k.to_sym] if target.respond_to? :as_hash~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ return autocomplete_filter_methods target.as_hash.keys~ +** Processing line: ~ if target.respond_to? :as_hash~ +** Processing line: ~ return autocomplete_filter_methods target.as_hash.keys~ +** Processing line: ~ else~ +** Processing line: ~ return autocomplete_filter_methods target.autocomplete_methods~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~ text = text.each_line.reject { |l| l.strip.start_with? "#" }.join "\n"~ +** Processing line: ~ text = text.each_line.map { |l| l.split("#").first }.join "\n"~ ** Processing line: ~ text.gsub!("[", " ")~ ** Processing line: ~ text.gsub!("]", " ")~ ** Processing line: ~ text.gsub!("(", " ")~ @@ -226156,167 +238138,186 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** runtime/draw.rb~ +** Processing line: ~*** runtime/benchmark.rb~ - H3 detected. - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~runtime/draw.rb~ +- Formatting line: ~runtime/benchmark.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: ~runtime/draw.rb~ +- Formatting line: ~runtime/benchmark.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/runtime/draw.rb~ +** Processing line: ~ # ./dragon/runtime/benchmark.rb~ ** Processing line: ~ # Copyright 2019 DragonRuby LLC~ ** Processing line: ~ # MIT License~ -** Processing line: ~ # draw.rb has been released under MIT (*only this file*).~ +** Processing line: ~ # benchmark.rb has been released under MIT (*only this file*).~ ** Processing line: ~~ ** Processing line: ~ module GTK~ ** Processing line: ~ class Runtime~ -** Processing line: ~ module Draw~ -** Processing line: ~ def primitives pass~ -** Processing line: ~ if $top_level.respond_to? :primitives_override~ -** Processing line: ~ return $top_level.tick_render @args, pass~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # Don't change this draw order unless you understand~ -** Processing line: ~ # the implications.~ -** Processing line: ~~ -** Processing line: ~ # pass.solids.each { |s| draw_solid s }~ -** Processing line: ~ # while loops are faster than each with block~ +** Processing line: ~ module Benchmark~ +** Processing line: ~ def benchmark_single iterations, name, proc~ +** Processing line: ~ log <<-S~ +** Processing line: ~ ** Invoking :#{name}...~ +** Processing line: ~ S~ +** Processing line: ~ time_start = Time.now~ ** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.solids.length~ -** Processing line: ~ while idx < pass.solids.length~ -** Processing line: ~ draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster~ +** Processing line: ~ r = nil~ +** Processing line: ~ while idx < iterations~ +** Processing line: ~ r = proc.call~ ** Processing line: ~ idx += 1~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_solids.each { |s| draw_solid s }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_solids.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_solid (pass.static_solids.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ result = (Time.now - time_start).round 3~ ** Processing line: ~~ -** Processing line: ~ # pass.sprites.each { |s| draw_sprite s }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.sprites.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_sprite (pass.sprites.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ { name: name,~ +** Processing line: ~ time: result,~ +** Processing line: ~ time_ms: (result * 1000).to_i }~ +** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_sprites.each { |s| draw_sprite s }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_sprites.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_sprite (pass.static_sprites.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ def benchmark opts = {}~ +** Processing line: ~ iterations = opts.iterations~ ** Processing line: ~~ -** Processing line: ~ # pass.primitives.each { |p| draw_primitive p }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.primitives.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.primitives.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * BENCHMARK: Started~ +** Processing line: ~ ** Caller: #{(caller || []).first}~ +** Processing line: ~ ** Iterations: #{iterations}~ +** Processing line: ~ S~ +** Processing line: ~ procs = opts.find_all { |k, v| v.respond_to? :call }~ +** Processing line: ~~ +** Processing line: ~ times = procs.map do |(name, proc)|~ +** Processing line: ~ benchmark_single iterations, name, proc~ +** Processing line: ~ end.sort_by { |r| r.time }~ +** Processing line: ~~ +** Processing line: ~ first_place = times.first~ +** Processing line: ~ second_place = times.second || first_place~ +** Processing line: ~~ +** Processing line: ~ times = times.map do |candidate|~ +** Processing line: ~ average_time = first_place.time~ +** Processing line: ~ .add(candidate.time)~ +** Processing line: ~ .abs~ +** Processing line: ~ .fdiv(2)~ +** Processing line: ~~ +** Processing line: ~ difference_percentage = 0~ +** Processing line: ~ if average_time == 0~ +** Processing line: ~ difference_percentage = 0~ +** Processing line: ~ else~ +** Processing line: ~ difference_percentage = first_place.time~ +** Processing line: ~ .subtract(candidate.time)~ +** Processing line: ~ .abs~ +** Processing line: ~ .fdiv(average_time)~ +** Processing line: ~ .imult(100)~ +** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_primitives.each { |p| draw_primitive p }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_primitives.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.static_primitives.at idx)~ -** Processing line: ~ idx += 1~ +** Processing line: ~ difference_time = ((first_place.time - candidate.time) * 1000).round~ +** Processing line: ~ candidate.merge(difference_percentage: difference_percentage,~ +** Processing line: ~ difference_time: difference_time)~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.labels.each { |l| draw_label l }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.labels.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_label (pass.labels.at idx)~ -** Processing line: ~ idx += 1~ +** Processing line: ~ too_small_to_measure = false~ +** Processing line: ~ if (first_place.time + second_place.time) == 0~ +** Processing line: ~ too_small_to_measure = true~ +** Processing line: ~ difference_percentage = 0~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * BENCHMARK: Average time for experiments were too small. Increase the number of iterations.~ +** Processing line: ~ S~ +** Processing line: ~ else~ +** Processing line: ~ difference_percentage = (((first_place.time - second_place.time).abs.fdiv((first_place.time + second_place.time).abs.fdiv(2))) * 100).round~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_labels.each { |l| draw_label l }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_labels.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_label (pass.static_labels.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ difference_time = first_place.time.-(second_place.time).*(1000).abs.round~ ** Processing line: ~~ -** Processing line: ~ # pass.lines.each { |l| draw_line l }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.lines.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_line (pass.lines.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ r = {~ +** Processing line: ~ iterations: iterations,~ +** Processing line: ~ first_place: first_place,~ +** Processing line: ~ second_place: second_place,~ +** Processing line: ~ difference_time: difference_time,~ +** Processing line: ~ difference_percentage: difference_percentage,~ +** Processing line: ~ times: times,~ +** Processing line: ~ too_small_to_measure: too_small_to_measure~ +** Processing line: ~ }~ ** Processing line: ~~ -** Processing line: ~ # pass.static_lines.each { |l| draw_line l }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_lines.length~ -** Processing line: ~ while idx < pass.static_lines.length~ -** Processing line: ~ draw_line (pass.static_lines.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ log_message = []~ +** Processing line: ~ only_one_result = first_place.name == second_place.name~ ** Processing line: ~~ -** Processing line: ~ # pass.borders.each { |b| draw_border b }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.borders.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_border (pass.borders.at idx)~ -** Processing line: ~ idx += 1~ +** Processing line: ~ if only_one_result~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * BENCHMARK: #{r.first_place.name} completed in #{r.first_place.time_ms}ms."~ +** Processing line: ~ S~ +** Processing line: ~ else~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * BENCHMARK: #{r.message}~ +** Processing line: ~ ** Fastest: #{r.first_place.name.inspect}~ +** Processing line: ~ ** Second: #{r.second_place.name.inspect}~ +** Processing line: ~ ** Margin: #{r.difference_percentage}% (#{r.difference_time.abs}ms) #{r.first_place.time_ms}ms vs #{r.second_place.time_ms}ms.~ +** Processing line: ~ ** Times:~ +** Processing line: ~ #{r.times.map { |t| "*** #{t.name}: #{t.time_ms}ms (#{t.difference_percentage}% #{t.difference_time.abs}ms)." }.join("\n")}~ +** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_borders.each { |b| draw_border b }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_borders.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_border (pass.static_borders.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~ r~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ if !$gtk.production~ -** Processing line: ~ # pass.debug.each { |r| draw_primitive r }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.debug.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.debug.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. ** Processing line: ~~ -** Processing line: ~ # pass.static_debug.each { |r| draw_primitive r }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_debug.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.static_debug.at idx)~ -** Processing line: ~ idx += 1~ -** Processing line: ~ end~ -** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.reserved.each { |r| draw_primitive r }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.reserved.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.reserved.at idx)~ -** Processing line: ~ idx += 1~ +** Processing line: ~*** runtime/draw.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~runtime/draw.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: ~runtime/draw.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/runtime/draw.rb~ +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ +** Processing line: ~ # MIT License~ +** Processing line: ~ # draw.rb has been released under MIT (*only this file*).~ +** Processing line: ~~ +** Processing line: ~ module GTK~ +** Processing line: ~ class Runtime~ +** Processing line: ~ module Draw~ +** Processing line: ~ def primitives pass~ +** Processing line: ~ if $top_level.respond_to? :primitives_override~ +** Processing line: ~ return $top_level.tick_render @args, pass~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # pass.static_reserved.each { |r| draw_primitive r }~ -** Processing line: ~ idx = 0~ -** Processing line: ~ length = pass.static_reserved.length~ -** Processing line: ~ while idx < length~ -** Processing line: ~ draw_primitive (pass.static_reserved.at idx)~ -** Processing line: ~ idx += 1~ +** Processing line: ~ fn.each_send pass.solids, self, :draw_solid~ +** Processing line: ~ fn.each_send pass.static_solids, self, :draw_solid~ +** Processing line: ~ fn.each_send pass.sprites, self, :draw_sprite~ +** Processing line: ~ fn.each_send pass.static_sprites, self, :draw_sprite~ +** Processing line: ~ fn.each_send pass.primitives, self, :draw_primitive~ +** Processing line: ~ fn.each_send pass.static_primitives, self, :draw_primitive~ +** Processing line: ~ fn.each_send pass.labels, self, :draw_label~ +** Processing line: ~ fn.each_send pass.static_labels, self, :draw_label~ +** Processing line: ~ fn.each_send pass.lines, self, :draw_line~ +** Processing line: ~ fn.each_send pass.static_lines, self, :draw_line~ +** Processing line: ~ fn.each_send pass.borders, self, :draw_border~ +** Processing line: ~ fn.each_send pass.static_borders, self, :draw_border~ +** Processing line: ~~ +** Processing line: ~ if !$gtk.production~ +** Processing line: ~ fn.each_send pass.debug, self, :draw_primitive~ +** Processing line: ~ fn.each_send pass.static_debug, self, :draw_primitive~ ** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ fn.each_send pass.reserved, self, :draw_primitive~ +** Processing line: ~ fn.each_send pass.static_reserved, self, :draw_primitive~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ pause!~ ** Processing line: ~ pretty_print_exception_and_export! e~ @@ -226327,7 +238328,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a~ +** Processing line: ~ @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,~ +** Processing line: ~ s.r, s.g, s.b, s.a,~ +** Processing line: ~ (s.blendmode_enum || 1)~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise_conversion_for_rendering_failed s, e, :solid~ @@ -226338,14 +238341,15 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h,~ -** Processing line: ~ s.path.s_or_default,~ +** Processing line: ~ @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,~ +** Processing line: ~ (s.path || '').to_s,~ ** Processing line: ~ s.angle,~ ** Processing line: ~ s.a, s.r, s.g, s.b,~ ** Processing line: ~ s.tile_x, s.tile_y, s.tile_w, s.tile_h,~ ** Processing line: ~ !!s.flip_horizontally, !!s.flip_vertically,~ ** Processing line: ~ s.angle_anchor_x, s.angle_anchor_y,~ -** Processing line: ~ s.source_x, s.source_y, s.source_w, s.source_h~ +** Processing line: ~ s.source_x, s.source_y, s.source_w, s.source_h,~ +** Processing line: ~ (s.blendmode_enum || 1)~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise_conversion_for_rendering_failed s, e, :sprite~ @@ -226356,7 +238360,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_screenshot s.path.s_or_default,~ +** Processing line: ~ @ffi_draw.draw_screenshot (s.path || '').to_s,~ ** Processing line: ~ s.x, s.y, s.w, s.h,~ ** Processing line: ~ s.angle,~ ** Processing line: ~ s.a, s.r, s.g, s.b,~ @@ -226374,10 +238378,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if l.respond_to? :draw_override~ ** Processing line: ~ l.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_label l.x, l.y, l.text.s_or_default,~ -** Processing line: ~ l.size_enum, l.alignment_enum,~ -** Processing line: ~ l.r, l.g, l.b, l.a,~ -** Processing line: ~ l.font.s_or_default(nil)~ +** Processing line: ~ @ffi_draw.draw_label_3 l.x, l.y,~ +** Processing line: ~ (l.text || '').to_s,~ +** Processing line: ~ l.size_enum, l.alignment_enum,~ +** Processing line: ~ l.r, l.g, l.b, l.a,~ +** Processing line: ~ l.font,~ +** Processing line: ~ (l.vertical_alignment_enum || 2),~ +** Processing line: ~ (l.blendmode_enum || 1)~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise_conversion_for_rendering_failed l, e, :label~ @@ -226388,7 +238395,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if l.respond_to? :draw_override~ ** Processing line: ~ l.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a~ +** Processing line: ~ if l.x2~ +** Processing line: ~ @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,~ +** Processing line: ~ l.r, l.g, l.b, l.a,~ +** Processing line: ~ (l.blendmode_enum || 1)~ +** Processing line: ~ else~ +** Processing line: ~ w = l.w || 0~ +** Processing line: ~ w = 1 if w == 0~ +** Processing line: ~ h = l.h || 0~ +** Processing line: ~ h = 1 if h == 0~ +** Processing line: ~ @ffi_draw.draw_line_2 l.x, l.y,~ +** Processing line: ~ l.x + w - 1,~ +** Processing line: ~ l.y + h - 1,~ +** Processing line: ~ l.r, l.g, l.b, l.a,~ +** Processing line: ~ (l.blendmode_enum || 1)~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise_conversion_for_rendering_failed l, e, :line~ @@ -226399,7 +238420,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ -** Processing line: ~ @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a~ +** Processing line: ~ @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,~ +** Processing line: ~ s.r, s.g, s.b, s.a,~ +** Processing line: ~ (s.blendmode_enum || 1)~ ** Processing line: ~ end~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise_conversion_for_rendering_failed s, e, :border~ @@ -226419,7 +238442,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ pause!~ ** Processing line: ~ pretty_print_exception_and_export! e~ ** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -226665,7 +238687,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def framerate_diagnostics_primitives~ ** Processing line: ~ [~ -** Processing line: ~ { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid,~ +** Processing line: ~ { x: 0, y: 93.from_top, w: 500, h: 93, a: 128 }.solid!,~ ** Processing line: ~ {~ ** Processing line: ~ x: 5,~ ** Processing line: ~ y: 5.from_top,~ @@ -226674,7 +238696,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 255,~ ** Processing line: ~ b: 255,~ ** Processing line: ~ size_enum: -2~ -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ ** Processing line: ~ {~ ** Processing line: ~ x: 5,~ ** Processing line: ~ y: 20.from_top,~ @@ -226683,7 +238705,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 255,~ ** Processing line: ~ b: 255,~ ** Processing line: ~ size_enum: -2~ -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ ** Processing line: ~ {~ ** Processing line: ~ x: 5,~ ** Processing line: ~ y: 35.from_top,~ @@ -226692,7 +238714,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 255,~ ** Processing line: ~ b: 255,~ ** Processing line: ~ size_enum: -2~ -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ ** Processing line: ~ {~ ** Processing line: ~ x: 5,~ ** Processing line: ~ y: 50.from_top,~ @@ -226701,7 +238723,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 255,~ ** Processing line: ~ b: 255,~ ** Processing line: ~ size_enum: -2~ -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ ** Processing line: ~ {~ ** Processing line: ~ x: 5,~ ** Processing line: ~ y: 65.from_top,~ @@ -226710,7 +238732,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ g: 255,~ ** Processing line: ~ b: 255,~ ** Processing line: ~ size_enum: -2~ -** Processing line: ~ }.label,~ +** Processing line: ~ }.label!,~ ** Processing line: ~ ]~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -226750,7 +238772,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def hotload_init~ ** Processing line: ~ @hotload_if_needed = 0~ ** Processing line: ~ @mailbox_if_needed = 0~ +** Processing line: ~~ +** Processing line: ~ # schema for file_mtimes~ +** Processing line: ~ # { FILE_PATH: { current: (Time as Fixnum),~ +** Processing line: ~ # last: (Time as Fixnum) },~ +** Processing line: ~ # FILE_PATH: { current: (Time as Fixnum),~ +** Processing line: ~ # last: (Time as Fixnum) } }~ ** Processing line: ~ @file_mtimes = { }~ +** Processing line: ~~ ** Processing line: ~ @suppress_mailbox = true~ ** Processing line: ~ files_to_reload.each { |f| init_mtimes f }~ ** Processing line: ~ init_mtimes 'app/mailbox.rb'~ @@ -226788,6 +238817,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ 'dragon/symbol.rb',~ ** Processing line: ~ 'dragon/numeric_deprecated.rb',~ ** Processing line: ~ 'dragon/numeric.rb',~ +** Processing line: ~ 'dragon/hash_deprecated.rb',~ ** Processing line: ~ 'dragon/hash.rb',~ ** Processing line: ~ 'dragon/outputs_deprecated.rb',~ ** Processing line: ~ 'dragon/array_docs.rb',~ @@ -226820,6 +238850,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ 'dragon/trace.rb',~ ** Processing line: ~ 'dragon/readme_docs.rb',~ ** Processing line: ~ 'dragon/hotload_client.rb',~ +** Processing line: ~ 'dragon/wizards.rb',~ ** Processing line: ~ 'dragon/ios_wizard.rb',~ ** Processing line: ~ 'dragon/itch_wizard.rb',~ ** Processing line: ~ ] + core_files_to_reload + @required_files~ @@ -226838,10 +238869,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def init_mtimes file~ -** Processing line: ~ current_key = "current_#{file}".to_sym~ -** Processing line: ~ last_key = "last_#{file}".to_sym~ -** Processing line: ~ @file_mtimes[current_key] ||= @ffi_file.mtime(file)~ -** Processing line: ~ @file_mtimes[last_key] ||= @ffi_file.mtime(file)~ +** Processing line: ~ @file_mtimes[file] ||= { current: @ffi_file.mtime(file),~ +** Processing line: ~ last: @ffi_file.mtime(file) }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def hotload_source_files~ @@ -226873,25 +238902,36 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def hotload_if_needed~ +** Processing line: ~ return if Kernel.tick_count < 0~ ** Processing line: ~ hotload_source_files~ ** Processing line: ~ check_mailbox~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def on_load_succeeded file~ -** Processing line: ~ @rcb_sender.files_reloaded << file~ -** Processing line: ~ @rcb_sender.reloaded_files << file~ +** Processing line: ~ self.files_reloaded << file~ +** Processing line: ~ self.reloaded_files << file~ ** Processing line: ~ Trace.untrace_classes!~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def reset_all_mtimes~ +** Processing line: ~ @file_mtimes.each do |file, _|~ +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ files_to_reload.each do |file, _|~ +** Processing line: ~ @file_mtimes[file] ||= {}~ +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def reload_if_needed file, force = false~ -** Processing line: ~ current_key = "current_#{file}".to_sym~ -** Processing line: ~ last_key = "last_#{file}".to_sym~ -** Processing line: ~ @file_mtimes[current_key] ||= nil~ -** Processing line: ~ @file_mtimes[last_key] ||= nil~ -** Processing line: ~ @file_mtimes[current_key] = @ffi_file.mtime(file)~ -** Processing line: ~ return if !force && @file_mtimes[last_key] == @file_mtimes[current_key]~ +** Processing line: ~ @file_mtimes[file] ||= { current: @ffi_file.mtime(file), last: @ffi_file.mtime(file) }~ +** Processing line: ~ @file_mtimes[file].current = @ffi_file.mtime(file)~ +** Processing line: ~ return if !force && @file_mtimes[file].current == @file_mtimes[file].last~ ** Processing line: ~ on_load_succeeded file if reload_ruby_file file~ -** Processing line: ~ @file_mtimes[last_key] = @file_mtimes[current_key]~ +** Processing line: ~ @file_mtimes[file].last = @file_mtimes[file].current~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -226948,6 +238988,30 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def char_byte~ +** Processing line: ~ return nil if self.length == 0~ +** Processing line: ~ c = self.each_char.first.bytes~ +** Processing line: ~ c = c.first if c.is_a? Enumerable~ +** Processing line: ~ c~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def insert_character_at index, char~ +** Processing line: ~ t = each_char.to_a~ +** Processing line: ~ t = (t.insert index, char)~ +** Processing line: ~ t.join~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def excluding_character_at index~ +** Processing line: ~ t = each_char.to_a~ +** Processing line: ~ t.delete_at index~ +** Processing line: ~ t.join~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def excluding_last_character~ +** Processing line: ~ return "" if self.length <= 1~ +** Processing line: ~ return excluding_character_at(self.length - 1)~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def end_with_bang?~ ** Processing line: ~ self[-1] == "!"~ ** Processing line: ~ end~ @@ -227180,7 +239244,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ log "#{self.failed.length} test(s) failed."~ ** Processing line: ~ self.failed.each do |h|~ ** Processing line: ~ log "**** Test name: :#{h[:m]}"~ -** Processing line: ~ log "#{h[:e].to_s.gsub("* ERROR:", "").strip}"~ +** Processing line: ~ log "#{h[:e].to_s.gsub("* ERROR:", "").strip}\n#{h[:e].__backtrace_to_org__}"~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -227415,6 +239479,40 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # MIT License~ ** Processing line: ~ # wizards.rb has been released under MIT (*only this file*).~ ** Processing line: ~~ +** Processing line: ~ class Wizard~ +** Processing line: ~ def metadata_file_path~ +** Processing line: ~ "metadata/game_metadata.txt"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_metadata~ +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +** Processing line: ~~ +** Processing line: ~ if !metadata~ +** Processing line: ~ write_blank_metadata~ +** Processing line: ~ metadata = $gtk.read_file metadata_file_path~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ dev_id, dev_title, game_id, game_title, version, icon = *metadata.each_line.to_a~ +** Processing line: ~~ +** Processing line: ~ {~ +** Processing line: ~ dev_id: dev_id.strip.gsub("#", "").gsub("devid=", ""),~ +** Processing line: ~ dev_title: dev_title.strip.gsub("#", "").gsub("devtitle=", ""),~ +** Processing line: ~ game_id: game_id.strip.gsub("#", "").gsub("gameid=", ""),~ +** Processing line: ~ game_title: game_title.strip.gsub("#", "").gsub("gametitle=", ""),~ +** Processing line: ~ version: version.strip.gsub("#", "").gsub("version=", ""),~ +** Processing line: ~ icon: icon.strip.gsub("#", "").gsub("icon=", "")~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ class WizardException < Exception~ +** Processing line: ~ attr_accessor :console_primitives~ +** Processing line: ~~ +** Processing line: ~ def initialize *console_primitives~ +** Processing line: ~ @console_primitives = console_primitives~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ module GTK~ ** Processing line: ~ class Wizards~ ** Processing line: ~ attr_accessor :ios, :itch~ diff --git a/docs/todo/03-solids-and-borders.md b/docs/todo/03-solids-and-borders.md index 34acc96..0ed2fc9 100644 --- a/docs/todo/03-solids-and-borders.md +++ b/docs/todo/03-solids-and-borders.md @@ -33,7 +33,7 @@ args.outputs.borders << [100, 100, 160, 90] ## RGBA - Colors and Alpha -The value for the color and alpha is a number between `0` and `255`. The +The value for the color and alpha is an number between `0` and `255`. The alpha property is optional and will be set to `255` if not specified. Creates a green solid rectangle with an opacity of 50%. @@ -93,7 +93,7 @@ args.outputs.borders << { ## Duck Typing (Advanced) You can also create a class with solid/border properties and render it as a primitive. -ALL properties must be on the class. ADDITIONALLY, a method called `primitive_marker` +ALL properties must on the class. ADDITIONALLY, a method called `primitive_marker` must be defined on the class. Here is an example: diff --git a/docs/todo/04-lines.md b/docs/todo/04-lines.md index 20faa44..03c1abc 100644 --- a/docs/todo/04-lines.md +++ b/docs/todo/04-lines.md @@ -35,7 +35,7 @@ args.outputs.lines << [ 0, 360, 1280, 360] ## RGBA - Colors and Alpha -The value for the color and alpha is a number between `0` and `255`. The +The value for the color and alpha is an number between `0` and `255`. The alpha property is optional and will be set to `255` if not specified. Creates a green horizontal line through the center of the scene with an opacity of 50%. @@ -75,7 +75,7 @@ args.outputs.lines << { ## Duck Typing (Advanced) You can also create a class with line properties and render it as a primitive. -ALL properties must be on the class. ADDITIONALLY, a method called `primitive_marker` +ALL properties must on the class. ADDITIONALLY, a method called `primitive_marker` must be defined on the class. Here is an example: diff --git a/docs/todo/05-sprites.md b/docs/todo/05-sprites.md index 773a007..e8030ab 100644 --- a/docs/todo/05-sprites.md +++ b/docs/todo/05-sprites.md @@ -29,7 +29,7 @@ args.outputs.sprites << [100, 100, 32, 64, "sprites/player.png"] ## Rotation / Angle -Unlike `solids` and `borders`, sprites can be rotated. This is how you rotate a sprite 90 degrees. +Unlike `solids` and `borders`, sprites can be rotated. This is how you rotate a sprite 90 degress. Note: All angles in DragonRuby Game Toolkit are represented in degrees (not radians). @@ -180,7 +180,7 @@ args.outputs.sprites << { ## Duck Typing (Advanced) You can also create a class with sprite properties and render it as a primitive. -ALL properties must be on the class. ADDITIONALLY, a method called `primitive_marker` +ALL properties must on the class. ADDITIONALLY, a method called `primitive_marker` must be defined on the class. Here is an example: diff --git a/docs/todo/08-controllers.md b/docs/todo/08-controllers.md index 9ed9199..aa85ee8 100644 --- a/docs/todo/08-controllers.md +++ b/docs/todo/08-controllers.md @@ -33,7 +33,7 @@ end # Truthy Keys -You can access all triggered keys through `truthy_keys` on `keyboard`, `controller_one`, and `controller_two`. +You can access all triggered keys through `thruthy_keys` on `keyboard`, `controller_one`, and `controller_two`. This is how you would write all keys to a file. The game must be in the foreground and have focus for this data to be recorded. -- cgit v1.2.3